Hi. I am trying to convert the Python codes for “antichains” into igraph C codes. Below are some parts of the original Python codes:
if topo_order is None:
topo_order = list(nx.topological_sort(G))
TC = nx.transitive_closure_dag(G, topo_order)
antichains_stacks = [([], list(reversed(topo_order)))]
while antichains_stacks:
(antichain, stack) = antichains_stacks.pop()
# Invariant:
# - the elements of antichain are independent
# - the elements of stack are independent from those of antichain
yield antichain
while stack:
x = stack.pop()
new_antichain = antichain + [x]
new_stack = [t for t in stack if not ((t in TC[x]) or (x in TC[t]))]
antichains_stacks.append((new_antichain, new_stack))
but the issue is that there are some parts that require to use “list of lists” functionality along with generator. There is no equivalent functionality in igraph C to “list of lists” but there is a “igraph_vector_ptr_t” which allows to insert the vector pointer, so I tried to insert two igraph vectors into a vector pointer, which is also inserted into another vector pointer. But when I tried to do this as shown below, I have got errors and could not get the appropriate results:
int find_elem(int elem, igraph_vector_t *array) {
int i;
int size;
size = igraph_vector_size(array);
for (i = 0; i < size; i++) {
if ((int)VECTOR(*array)[i] == elem) {
return 1;
}
}
if ((int)VECTOR(*array)[i] != elem) {
return 0;
}
return 0;
}
igraph_vector_init(&topo_order, 0);
igraph_topological_sorting(L, &topo_order, IGRAPH_OUT);
TC = transitive_closure_dag(L, &topo_order);
igraph_vector_ptr_init(&antichains_stacks, 0);
igraph_vector_ptr_init(&as_list, 0);
igraph_vector_init(&antichain, 0);
igraph_vector_init(&stack, 0);
igraph_vector_copy(&stack, &topo_order);
igraph_vector_ptr_push_back(&as_list, &antichain);
igraph_vector_ptr_push_back(&as_list, &stack);
igraph_vector_ptr_push_back(&antichains_stacks, &as_list);
while (igraph_vector_ptr_size(&antichains_stacks) != 0) {
as_list_res = igraph_vector_ptr_pop_back(&antichains_stacks);
stack_w = igraph_vector_ptr_pop_back(as_list_res);
antichain_w = igraph_vector_ptr_pop_back(as_list_res);
while (igraph_vector_empty(stack_w) == 0) {
igraph_vector_init(&new_antichain, 0);
igraph_vector_init(&new_stack, 0);
x_w = igraph_vector_pop_back(stack_w);
igraph_vector_push_back(antichain_w, x_w);
igraph_vector_copy(&new_antichain, antichain_w);
if (igraph_vector_empty(stack_w) == 0) {
for (t = 0; t < igraph_vector_size(stack_w); t++) {
igraph_vector_init(&tcx_eids, 0);
igraph_vector_init(&tct_eids, 0);
igraph_incident(&TC, &tcx_eids, x_w, IGRAPH_OUT);
igraph_incident(&TC, &tct_eids, VECTOR(stack_w_2)[t], IGRAPH_OUT);
if (find_elem(VECTOR(*stack_w)[t], &tcx_eids) == 0 && find_elem(x_w, &tct_eids) == 0) {
igraph_vector_push_back(&new_stack, VECTOR(*stack_w)[t]);
}
}
}
igraph_vector_ptr_push_back(as_list_res, &new_antichain);
igraph_vector_ptr_push_back(as_list_res, &new_stack);
igraph_vector_ptr_push_back(&antichains_stacks, as_list_res);
igraph_vector_ptr_destroy(as_list_res);
igraph_vector_destroy(&new_antichain);
igraph_vector_destroy(&new_stack);
igraph_vector_destroy(&tcx_eids);
igraph_vector_destroy(&tct_eids);
igraph_vector_destroy(stack_w);
igraph_vector_destroy(antichain_w);
}
Do you have any ideas on this? Or I hope that someone could develop “list of lists” or “vector of vectors” functionality in igraph C. Thanks in advance!