cru_composed - edge composing function in the cru library
#include <cru/cru.h>
cru_graph
cru_composed
(
cru_graph
g
,
cru_composer
c
,
cru_kill_switch
k
,
unsigned
lanes
,
int *err
)
Some graph algorithms might involve replacing an edge into a vertex and another edge out of it by an edge directly from the origin of the former to the terminus of the latter, in effect bypassing the vertex. This function creates new edges of that form in an existing graph g based on criteria specified in c initialized by the caller according to the usual cru_composer calling conventions. The parameter c may also be NULL, in which case no edges are created.
The value passed through k may be either a cru_kill_switch previously obtained by the cru_new_kill_switch function or a NULL pointer denoted alternatively by UNKILLABLE. If code running in another thread passes the kill switch to cru_kill while the operation is in progress, then the operation is interrupted. In this case, no edges are created and the given graph is reclaimed.
The lanes parameter specifies the number of worker threads to be used for the operation. Higher numbers up to the number of CPU cores on the host are conducive to higher performance.
For purposes of memory management, g is consumed by cru_composed and should not be used subsequently or reclaimed by the caller. The other parameters are not consumed.
On successful completion, the returned value is a pointer to a graph derived from g by modifying it in place. Applications should treat the returned value as opaque but may pass it as a parameter to other library functions. In the event of any error, a NULL pointer is returned. A NULL pointer is also returned if the given parameter g is NULL, which in this case represents an empty graph and is not in itself an error.
The err parameter is used to report any events preventing successful completion of the requested operation to the caller. If *err is zero on entry and the operation does not succeed, then *err is assigned a non-zero number. If the operation does not succeed because a user-defined callback function reports an error, then the number reported by the callback function is assigned to *err. Positive numbers are for POSIX or user-defined error codes, negative numbers down to -CRU_MAX_ERR are specific to cru, and other negative numbers are allowed as user-defined error codes.
Values of *err listed below refer to errors that are detected and handled. Unlisted values in the range of -CRU_INT_ERR through -CRU_MAX_ERR likely indicate internal errors attributable to bugs in cru. Any other unlisted values may indicate memory corruption, invalid usage of the API, or conditions relevant to user-defined callback functions.
ENOMEM
There is insufficient memory to allocate all necessary resources.
EAGAIN
Resources or permissions are insufficient to create a thread.
CRU_BADGPH
The parameter g refers to an invalid or corrupted graph.
CRU_BADKIL
The parameter k refers to an invalid or corrupted kill switch structure.
CRU_INTKIL
The operation was stopped by user intervention using the kill switch k.
CRU_TPCMPR
The m_free and r_free fields differ but the vacuous_case field is NULL in any of c->co_props.local.vertex, c->co_props.local.incident, c->co_props.local.outgoing, c->co_props.adjacent.vertex, c->co_props.adjacent.incident, or c->co_props.adjacent.outgoing.
CRU_UNDCQO
The field c->labeler.qop is NULL but the graph g contains dynamically allocated edge labels.
CRU_UNDEQU
The graph g contains dynamically allocated edge labels but no edge equality predicate was defined when it was built.
CRU_UNDHSH
The graph g contains dynamically allocated edge labels but no edge hash function was defined when it was built.
CRU_UNDRED
A reduction field is NULL in any one of c->co_props.local.incident, c->co_props.local.outgoing, c->co_props.adjacent.incident, or c->co_props.adjacent.outgoing whose other fields are not all NULL.
CRU_UNDVAC
The vacuous_case field is NULL in either of c->co_props.local.incident or c->co_props.adjacent.incident whose other fields are not all NULL, but the graph g contains a vertex with no incident edges, or the vacuous_case field is NULL in either of c->co_props.local.outgoing or c->co_props.adjacent.outgoing whose other fields are not all NULL, but the graph g contains a vertex with no outgoing edges.
/usr/local/include/cru/cru.h
/usr/local/include/cru/data_types.h
/usr/local/include/cru/error_codes.h
/usr/local/include/cru/function_types.h
cru, cru_bop, cru_bpred, cru_builder, cru_built, cru_cbop, cru_classifier, cru_class_of, cru_class_size, 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_qpred, 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