Skip to content

Commit 6d236d1

Browse files
committed
Store center node in replaced_edge_in field temporarily to save memory during preparation
This saves 16 bytes per fast graph edge during preparation, (e.g. ~11MB for NYC)
1 parent 9a954e0 commit 6d236d1

File tree

1 file changed

+16
-16
lines changed

1 file changed

+16
-16
lines changed

src/fast_graph_builder.rs

+16-16
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,13 @@ use crate::witness_search::WitnessSearch;
3535
pub struct FastGraphBuilder {
3636
fast_graph: FastGraph,
3737
num_nodes: usize,
38-
center_nodes_fwd: Vec<NodeId>,
39-
center_nodes_bwd: Vec<NodeId>,
4038
}
4139

4240
impl FastGraphBuilder {
4341
fn new(input_graph: &InputGraph) -> Self {
4442
FastGraphBuilder {
4543
fast_graph: FastGraph::new(input_graph.get_num_nodes()),
4644
num_nodes: input_graph.get_num_nodes(),
47-
center_nodes_fwd: vec![],
48-
center_nodes_bwd: vec![],
4945
}
5046
}
5147

@@ -113,10 +109,9 @@ impl FastGraphBuilder {
113109
node,
114110
out_edge.adj_node,
115111
out_edge.weight,
116-
INVALID_EDGE,
112+
out_edge.center_node,
117113
INVALID_EDGE,
118114
));
119-
self.center_nodes_fwd.push(out_edge.center_node);
120115
}
121116
self.fast_graph.first_edge_ids_fwd[rank + 1] = self.fast_graph.get_num_out_edges();
122117

@@ -126,10 +121,9 @@ impl FastGraphBuilder {
126121
node,
127122
in_edge.adj_node,
128123
in_edge.weight,
129-
INVALID_EDGE,
124+
in_edge.center_node,
130125
INVALID_EDGE,
131126
));
132-
self.center_nodes_bwd.push(in_edge.center_node)
133127
}
134128
self.fast_graph.first_edge_ids_bwd[rank + 1] = self.fast_graph.get_num_in_edges();
135129

@@ -181,10 +175,9 @@ impl FastGraphBuilder {
181175
node,
182176
out_edge.adj_node,
183177
out_edge.weight,
184-
INVALID_EDGE,
178+
out_edge.center_node,
185179
INVALID_EDGE,
186180
));
187-
self.center_nodes_fwd.push(out_edge.center_node);
188181
}
189182
self.fast_graph.first_edge_ids_fwd[rank + 1] = self.fast_graph.get_num_out_edges();
190183

@@ -193,10 +186,9 @@ impl FastGraphBuilder {
193186
node,
194187
in_edge.adj_node,
195188
in_edge.weight,
196-
INVALID_EDGE,
189+
in_edge.center_node,
197190
INVALID_EDGE,
198191
));
199-
self.center_nodes_bwd.push(in_edge.center_node)
200192
}
201193
self.fast_graph.first_edge_ids_bwd[rank + 1] = self.fast_graph.get_num_in_edges();
202194

@@ -221,10 +213,15 @@ impl FastGraphBuilder {
221213
fn finish_contraction(&mut self) {
222214
for i in 0..self.num_nodes {
223215
for edge_id in self.fast_graph.begin_out_edges(i)..self.fast_graph.end_out_edges(i) {
224-
let c = self.center_nodes_fwd[edge_id];
216+
// we temporarily stored the center node in the replaced_in_edge field. now we
217+
// set the actual replaced edges
218+
let c = self.fast_graph.edges_fwd[edge_id].replaced_in_edge;
225219
if c == INVALID_NODE {
226220
self.fast_graph.edges_fwd[edge_id].replaced_in_edge = INVALID_EDGE;
227-
self.fast_graph.edges_fwd[edge_id].replaced_out_edge = INVALID_EDGE;
221+
debug_assert_eq!(
222+
INVALID_EDGE,
223+
self.fast_graph.edges_fwd[edge_id].replaced_out_edge
224+
);
228225
} else {
229226
self.fast_graph.edges_fwd[edge_id].replaced_in_edge = self.get_in_edge_id(c, i);
230227
self.fast_graph.edges_fwd[edge_id].replaced_out_edge =
@@ -235,10 +232,13 @@ impl FastGraphBuilder {
235232

236233
for i in 0..self.num_nodes {
237234
for edge_id in self.fast_graph.begin_in_edges(i)..self.fast_graph.end_in_edges(i) {
238-
let c = self.center_nodes_bwd[edge_id];
235+
let c = self.fast_graph.edges_bwd[edge_id].replaced_in_edge;
239236
if c == INVALID_NODE {
240237
self.fast_graph.edges_bwd[edge_id].replaced_in_edge = INVALID_EDGE;
241-
self.fast_graph.edges_bwd[edge_id].replaced_out_edge = INVALID_EDGE;
238+
debug_assert_eq!(
239+
INVALID_EDGE,
240+
self.fast_graph.edges_bwd[edge_id].replaced_out_edge
241+
);
242242
} else {
243243
self.fast_graph.edges_bwd[edge_id].replaced_in_edge =
244244
self.get_in_edge_id(c, self.fast_graph.edges_bwd[edge_id].adj_node);

0 commit comments

Comments
 (0)