icentral_graph/
subtract_edge.rs

1crate::ix!();
2
3impl<GH> SubtractEdge for Graph<GH> 
4where GH
5: GetConnectedComponentSizes
6+ ExtendWith<GH>
7+ GetEdges
8+ GetNeighborsForNode
9+ GetNodeIdRange
10+ HasMapForNode
11+ InsertEdge
12+ InsertNode
13+ MappedNodes
14+ NumEdges
15+ NumNodes
16{
17    fn simple_subtract_edge_and_update_mucs(&mut self, edge: &Edge) 
18    {
19        // edge not in muc's, connects two
20        // connection vertices
21        //
22        let bridge_edge: Edge = *edge;
23
24        let muc1_id: MinimumUnionCycleId = self.nodes_to_mucs.mucid_for_node(bridge_edge.src);
25        let muc2_id: MinimumUnionCycleId = self.nodes_to_mucs.mucid_for_node(bridge_edge.dst);
26
27        self.mucs[muc1_id.val()].insert_conn_vertex(bridge_edge.src, bridge_edge.dst);
28        self.mucs[muc2_id.val()].insert_conn_vertex(bridge_edge.dst, bridge_edge.src);
29    }
30
31    fn maybe_simple_subtract_edge_and_update_mucs(
32        &mut self, 
33        edge:          &Edge,
34        all_muc_edges: &Edges) 
35    {
36        let edge_r = edge.reversed();
37
38        if !all_muc_edges.has_edge(&edge)
39        && !all_muc_edges.has_edge(&edge_r)
40        {
41            self.simple_subtract_edge_and_update_mucs(edge);
42        }
43    }
44
45    fn do_simple_subtraction_of_edges_and_update_mucs(
46        &mut self, 
47        all_muc_edges: &Edges) 
48    {
49        // TODO: can we avoid this clone?
50        let edges = self.edges.clone();
51
52        for &edge in edges.iter() {
53
54            self.maybe_simple_subtract_edge_and_update_mucs(
55                &edge,
56                all_muc_edges
57            );
58        }
59    }
60}