cru_qpred - quaternary predicate type used in the cru library
#include <cru/cru.h>
typedef int (*cru_qpred)(void *, void *, void *, void *, int *)
A user-defined quaternary predicate indicates the sites in a graph where a new edge should be created in the course of a composition operation performed by the cru_composed API function, or a preference between edges to be filtered from a graph by the cru_filtered API function. In the case of composition, the predicate is called once for every combination of pairs of end-to-end edges in the graph passed to cru_composed. Its decision can depend in general on
The four operands to the predicate correspond to these entities in this order, and can be scalar values, pointers to heap allocated storage, or a combination depending on the application's way of representing a graph and its properties. In the case of filtering, the four operands correspond to
The last parameter is a pointer to an error code initially zero on entry. The operator must treat the operands as read only but may assign the error code.
In the case of composition, any non-zero return value requests the creation of a composing edge corresponding to the given combination of edges using an edge label constructed by an associated cru_qop function given the same arguments. A return value of zero requests that no edge be created at that site.
In the case of filtering, any non-zero return value indicates that the left edge would be better to keep in the graph than the right, and a zero return value indicates the opposite. The predicate is treated as a total order relational operator invoked as needed to discern the single minimum edge in a set as the only one to be kept.
If a quaternary predicate sets the error code to any non-zero value, the cru_composed or cru_filtered function call causing it to be invoked reclaims the graph passed to it, returns an empty graph, and propagates the same error code to its caller.
Applications can report POSIX error codes or define special purpose codes, but should not redefine any that clash with those reserved by cru as declared in the error_codes.h header file.
Quartenary predicates are passed via pointers to them in the qpred field in a cru_cqop (conditional quarternary operator) structure, which is built into the labeler field in a cru_composer structure passed to cru_composed, and as the thinner field in a cru_filter structure passed to cru_filtered. In the case of composition, the vertex properties contributing to the operator's input are computed according to the local and adjacent props defined in the co_props field of the cru_composer. Each vertex can have two properties, one given by each prop, and the appropriate property is selected depending on its role as the local or the adjacent vertex in any given invocation.
A quarternary predicate and a quarternary operator both referenced via the same cru_cqop structure should have identical operand types.
/usr/local/include/cru/function_types.h
/usr/local/include/cru/data_types.h
/usr/local/include/cru/error_codes.h
cru, cru_bop, cru_bpred, cru_builder, cru_built, cru_cbop, cru_classifier, cru_class_of, cru_class_size, cru_composed, cru_composer, cru_connect, cru_connector, cru_cqop, cru_crossed, cru_crosser, cru_ctop, cru_ctop_pair, cru_ctop_quad, cru_data_types, cru_deduplicated, cru_destructor, cru_destructor_pair, cru_edge_count, cru_fabricated, cru_fabricator, cru_filter, cru_filtered, cru_fold, cru_free_kill_switch, cru_free_later, cru_free_now, cru_free_partition, cru_function_types, cru_get, cru_hash, cru_induced, cru_inducer, cru_kernel, cru_kill, cru_killed, cru_mapreduced, cru_mapreducer, cru_merged, cru_merger, cru_mutated, cru_mutator, cru_new_kill_switch, cru_nop, cru_order, cru_order_pair, cru_partition_of, cru_plan, cru_postponed, cru_postponer, cru_prop, cru_prop_pair, cru_pruner, cru_qop, cru_set, cru_sig, cru_singleton, cru_split, cru_splitter, cru_spread, cru_strerror, cru_stretch, cru_stretched, cru_stretcher, cru_subconnector, cru_terminus_count, cru_top, cru_tpred, cru_united, cru_uop, cru_vertex_count, cru_zone
Dennis Furey (milonga@delayinsensitive.com)
https://github.com/gueststar/cru