icentral_subgraph/
create.rs

1crate::ix!();
2
3impl CreateNamedEmpty for SubGraph {
4
5    fn empty(name: &str) -> Self {
6
7        let nodes_map_name             = name![name, "nodes_map"];
8        let edges_name                 = name![name, "edges"];
9        let label_map_name             = name![name, "label_map"];
10        let parents_name               = name![name, "parents"];
11        let path_counts_name           = name![name, "path_counts"];
12        let new_path_counts_name       = name![name, "new_path_counts"];
13        let inc_path_counts_name       = name![name, "inc_path_counts"];
14        let distances_name             = name![name, "distances"];
15        let pair_dependencies_name     = name![name, "pair_dependencies"];
16        let new_pair_dependencies_name = name![name, "new_pair_dependencies"];
17        let sigmas_name                = name![name, "sigmas"];
18        let new_sigmas_name            = name![name, "new_sigmas"];
19        let visit_markers_name         = name![name, "visit_markers"];
20        let stack_name                 = name![name, "stack"];
21        let queue_name                 = name![name, "queue"];
22
23        Self {
24            name:                  name.to_owned(),
25            nodes_map:             NeighborsMap::empty_indexed(nodes_map_name),
26            edges:                 Edges::empty(edges_name),
27            label_map:             LabelMap::empty(label_map_name),
28            parents:               ParentsMap::empty_indexed(parents_name),
29            path_counts:           PathCounts::empty_indexed(path_counts_name),
30            new_path_counts:       PathCounts::empty_indexed(new_path_counts_name),
31            inc_path_counts:       PathCounts::empty_indexed(inc_path_counts_name),
32            distances:             DistanceMap::empty_indexed(distances_name),
33            pair_dependencies:     PairDependencies::empty_indexed(pair_dependencies_name),
34            new_pair_dependencies: PairDependencies::empty_indexed(new_pair_dependencies_name),
35            sigmas:                SigmaMap::empty_indexed(sigmas_name),
36            new_sigmas:            SigmaMap::empty_indexed(new_sigmas_name),
37            visit_markers:         VisitMarkers::empty_indexed(visit_markers_name),
38            stack:                 NodeIdStack::empty(stack_name),
39            queue:                 NodeIdQueue::empty(queue_name),
40        }
41    }
42}
43
44impl SubGraph {
45
46    /// used in the `From` implementations
47    ///
48    fn new_from_nodes_edges_and_label_map(
49        nodes_map: NeighborsMap, 
50        edges:     Edges, 
51        label_map: LabelMap, 
52        name:      &str) -> Self 
53    {
54        let len = nodes_map.len();
55
56        assert!(nodes_map.len() == label_map.len());
57
58        let parents_name               = name![name, "parents"];
59        let path_counts_name           = name![name, "path_counts"];
60        let new_path_counts_name       = name![name, "new_path_counts"];
61        let inc_path_counts_name       = name![name, "inc_path_counts"];
62        let distances_name             = name![name, "distances"];
63        let pair_dependencies_name     = name![name, "pair_dependencies"];
64        let new_pair_dependencies_name = name![name, "new_pair_dependencies"];
65        let sigmas_name                = name![name, "sigmas"];
66        let new_sigmas_name            = name![name, "new_sigmas"];
67        let visit_markers_name         = name![name, "visit_markers"];
68        let stack_name                 = name![name, "stack"];
69        let queue_name                 = name![name, "queue"];
70
71        Self {
72            name:                   name.to_owned(),
73            nodes_map,
74            edges,
75            label_map,
76            parents:                ParentsMap::new(len, parents_name),
77            path_counts:            PathCounts::new(len, path_counts_name),
78            new_path_counts:        PathCounts::new(len, new_path_counts_name),
79            inc_path_counts:        PathCounts::new(len, inc_path_counts_name),
80            distances:              DistanceMap::new(len, distances_name),
81            pair_dependencies:      PairDependencies::new(len, pair_dependencies_name),
82            new_pair_dependencies:  PairDependencies::new(len, new_pair_dependencies_name),
83            sigmas:                 SigmaMap::new(len, sigmas_name),
84            new_sigmas:             SigmaMap::new(len, new_sigmas_name),
85            visit_markers:          VisitMarkers::new(len, visit_markers_name),
86            stack:                  NodeIdStack::empty(stack_name),
87            queue:                  NodeIdQueue::empty(queue_name),
88        }
89    }
90
91    /// QUESTION: why is this impl different from
92    /// `&Graph`
93    ///
94    pub fn new_from_graph_hash_ref<GH>(gh: &GH, name: &str) -> Self 
95        where GH: NumNodes + MappedNodes + GetEdges + GetNodeIdRange + GetNeighborsForNode
96    {
97
98        debug!("creating new SubGraph named {} from GraphHash of len {}", name, gh.num_nodes());
99
100        let len = gh.num_nodes();
101
102        let nodes_map_name = name![name, "nodes_map"];
103        let edges_name     = name![name, "edges"];
104        let label_map_name = name![name, "label_map"];
105
106        let label_map = LabelMap::new_from_graph_ref(gh, label_map_name);
107        let nodes_map = NeighborsMap::new(len, nodes_map_name);
108        let edges     = Edges::new_remapped(&label_map,gh, edges_name);
109
110        SubGraph::new_from_nodes_edges_and_label_map(
111            nodes_map,
112            edges,
113            label_map,
114            name
115        )
116    }
117
118    /// QUESTION: why is this impl different from
119    /// `&GraphHash`
120    ///
121    pub fn new_from_graph_ref<G>(g: &G, name: &str) -> Self 
122        where G: NumNodes + MappedNodes + GetNodeIdRange + GetNeighborsForNode + GetEdges
123    {
124
125        let num_nodes = g.num_nodes();
126
127        let nodes_map_name = name![name, "nodes_map"];
128        let edges_name     = name![name, "edges"];
129        let label_map_name = name![name, "label_map"];
130
131        let nodes_map = NeighborsMap::new_from_graph_ref(g, nodes_map_name);
132        let edges     = Edges::new_from_graph_ref(g, edges_name);
133        let label_map = LabelMap::new_from_graph_ref(g, label_map_name);
134
135        SubGraph::new_from_nodes_edges_and_label_map(
136            nodes_map,
137            edges,
138            label_map,
139            name
140        )
141    }
142}