static void map_path(node_t * from, node_t * to, edge_t * orig, edge_t * ve, int type) { int r; node_t *u, *v; edge_t *e; assert(ND_rank(from) < ND_rank(to)); if ((agtail(ve) == from) && (aghead(ve) == to)) return; if (ED_count(ve) > 1) { ED_to_virt(orig) = NULL; if (ND_rank(to) - ND_rank(from) == 1) { if ((e = find_fast_edge(from, to)) && (ports_eq(orig, e))) { merge_oneway(orig, e); if ((ND_node_type(from) == NORMAL) && (ND_node_type(to) == NORMAL)) other_edge(orig); return; } } u = from; for (r = ND_rank(from); r < ND_rank(to); r++) { if (r < ND_rank(to) - 1) v = clone_vn(agraphof(from), aghead(ve)); else v = to; e = virtual_edge(u, v, orig); ED_edge_type(e) = type; u = v; ED_count(ve)--; ve = ND_out(aghead(ve)).list[0]; } } else { if (ND_rank(to) - ND_rank(from) == 1) { if ((ve = find_fast_edge(from, to)) && (ports_eq(orig, ve))) { /*ED_to_orig(ve) = orig; */ ED_to_virt(orig) = ve; ED_edge_type(ve) = type; ED_count(ve)++; if ((ND_node_type(from) == NORMAL) && (ND_node_type(to) == NORMAL)) other_edge(orig); } else { ED_to_virt(orig) = NULL; ve = virtual_edge(from, to, orig); ED_edge_type(ve) = type; } } if (ND_rank(to) - ND_rank(from) > 1) { e = ve; if (agtail(ve) != from) { ED_to_virt(orig) = NULL; e = ED_to_virt(orig) = virtual_edge(from, aghead(ve), orig); delete_fast_edge(ve); } else e = ve; while (ND_rank(aghead(e)) != ND_rank(to)) e = ND_out(aghead(e)).list[0]; if (aghead(e) != to) { ve = e; e = virtual_edge(agtail(e), to, orig); ED_edge_type(e) = type; delete_fast_edge(ve); } } } }
void map_path(node_t *from, node_t *to, edge_t *orig, edge_t *ve, int type) { int r; node_t *u,*v; edge_t *e; assert(from->u.rank < to->u.rank); if ((ve->tail == from) && (ve->head == to)) return; if (ve->u.count > 1) { orig->u.to_virt = NULL; if (to->u.rank - from->u.rank == 1) { if ((e = find_fast_edge(from,to)) && (ports_eq(orig,e))) { merge_oneway(orig,e); if ((from->u.node_type == NORMAL) && (to->u.node_type == NORMAL)) other_edge(orig); return; } } u = from; for (r = from->u.rank; r < to->u.rank; r++) { if (r < to->u.rank - 1) v = clone_vn(from->graph,ve->head); else v = to; e = virtual_edge(u,v,orig); e->u.edge_type = type; u = v; ve->u.count--; ve = ve->head->u.out.list[0]; } } else { if (to->u.rank - from->u.rank == 1) { if ((ve = find_fast_edge(from,to)) && (ports_eq(orig,ve))) { /*ve->u.to_orig = orig;*/ orig->u.to_virt = ve; ve->u.edge_type = type; ve->u.count++; if ((from->u.node_type == NORMAL) && (to->u.node_type == NORMAL)) other_edge(orig); } else { orig->u.to_virt = NULL; ve = virtual_edge(from,to,orig); ve->u.edge_type = type; } } if (to->u.rank - from->u.rank > 1) { e = ve; if (ve->tail != from) { orig->u.to_virt = NULL; e = orig->u.to_virt = virtual_edge(from,ve->head,orig); delete_fast_edge(ve); } else e = ve; while (e->head->u.rank != to->u.rank) e = e->head->u.out.list[0]; if (e->head != to) { ve = e; e = virtual_edge(e->tail,to,orig); e->u.edge_type = type; delete_fast_edge(ve); } } } }