transit_grid/graphs/transit_network/
repair.rs1use geo::{CoordNum, Distance, Euclidean};
2
3use crate::{
4 core::NodeId,
5 prelude::{TopologyGraphRepairer, TransitNetworkRepairer},
6};
7
8use super::TransitNetwork;
9
10impl<R: Copy, T: CoordNum> TransitNetworkRepairer<R, T> for TransitNetwork<R, T>
11where
12 Euclidean: Distance<T, R, geo::Coord<T>>,
13{
14 fn repair_edge(&mut self, node1: crate::core::NodeId, node2: crate::core::NodeId) {
15 self.physical_graph.repair_edge(node1, node2);
16 self.topology_graph.repair_edge(node1, node2);
17 }
18
19 fn repair(&mut self) {
20 let edges: Vec<(NodeId, NodeId)> = self
21 .physical_graph
22 .graph
23 .edge_weights()
24 .map(|edge| (edge.source, edge.target))
25 .collect();
26
27 for edge in edges {
28 self.repair_edge(edge.0, edge.1);
29 }
30 }
31}
32
33#[cfg(test)]
34mod tests {
35 use super::*;
36 use crate::{
37 core::{TransitEdge, TransitNode},
38 operations::TransitNetworkModifier,
39 };
40 use geo::{coord, LineString};
41 use petgraph::visit::IntoEdgeReferences;
42
43 #[test]
44 fn test_transit_network_edge_addition() {
45 let mut network = TransitNetwork::new();
47
48 let node1 = TransitNode {
50 id: 1,
51 location: coord!(x: 0.0, y: 0.0),
52 };
53
54 let node2 = TransitNode {
55 id: 2,
56 location: coord!(x: 1.0, y: 1.0),
57 };
58
59 let node3 = TransitNode {
60 id: 3,
61 location: coord!(x: 2.0, y: 2.0),
62 };
63
64 network.add_node(node1);
66 network.add_node(node2);
67 network.add_node(node3);
68
69 let edge1 = TransitEdge {
71 id: 1,
72 source: 1,
73 target: 2,
74 length: 1.0,
75 path: LineString(vec![coord! {x: 0.0, y: 0.0}, coord! {x: 1.0, y: 1.0}]),
76 };
77
78 let edge2 = TransitEdge {
79 id: 2,
80 source: 2,
81 target: 3,
82 length: 1.0,
83 path: LineString(vec![coord! {x: 0.0, y: 0.0}, coord! {x: 2.0, y: 2.0}]),
84 };
85
86 network.add_edge(edge1);
88 network.add_edge(edge2);
89
90 assert_eq!(network.physical_graph.graph.edge_count(), 2);
92
93 assert_eq!(network.topology_graph.graph.node_count(), 6);
95 assert_eq!(network.topology_graph.graph.edge_count(), 4);
96
97 let edge_ids: Vec<_> = network
99 .topology_graph
100 .graph
101 .edge_references()
102 .map(|edge| edge.weight().edge_id)
103 .collect();
104 assert_eq!(edge_ids, vec![1, 1, 2, 2]);
105
106 network.repair();
107 }
108}