Skip to main content

transit_grid/graphs/transit_network/
repair.rs

1use 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        // Create a new TransitNetwork
46        let mut network = TransitNetwork::new();
47
48        // Define some nodes
49        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        // Add nodes to the network
65        network.add_node(node1);
66        network.add_node(node2);
67        network.add_node(node3);
68
69        // Define edges
70        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        // Add edges to the network
87        network.add_edge(edge1);
88        network.add_edge(edge2);
89
90        // Check that the edges were added successfully
91        assert_eq!(network.physical_graph.graph.edge_count(), 2);
92
93        // Check that the topology graph was populated correctly
94        assert_eq!(network.topology_graph.graph.node_count(), 6);
95        assert_eq!(network.topology_graph.graph.edge_count(), 4);
96
97        // Check that the topology edges were computed correctly
98        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}