routee_compass_core/algorithm/search/
direction.rs

1use super::SearchInstance;
2use crate::model::network::{Edge, EdgeId, EdgeListId, VertexId};
3use allocative::Allocative;
4use serde::{Deserialize, Serialize};
5
6#[derive(Copy, Clone, Serialize, Deserialize, Default, Debug, PartialEq, Eq, Allocative)]
7#[serde(rename = "snake_case")]
8pub enum Direction {
9    #[default]
10    Forward,
11    Reverse,
12}
13
14impl Direction {
15    pub fn get_incident_edges<'a>(
16        &'a self,
17        vertex_id: &'a VertexId,
18        si: &'a SearchInstance,
19    ) -> Box<dyn Iterator<Item = &'a (EdgeListId, EdgeId)> + 'a> {
20        match self {
21            Direction::Forward => si.graph.out_edges_iter(vertex_id),
22            Direction::Reverse => si.graph.in_edges_iter(vertex_id),
23        }
24    }
25
26    pub fn tree_key_vertex_id(&self, edge: &Edge) -> VertexId {
27        match self {
28            Direction::Forward => edge.dst_vertex_id,
29            Direction::Reverse => edge.src_vertex_id,
30        }
31    }
32
33    pub fn terminal_vertex_id(&self, edge: &Edge) -> VertexId {
34        match self {
35            Direction::Forward => edge.src_vertex_id,
36            Direction::Reverse => edge.dst_vertex_id,
37        }
38    }
39
40    // pub fn perform_edge_traversal(
41    //     &self,
42    //     edge_id: EdgeId,
43    //     last_edge_id: Option<EdgeId>,
44    //     start_state: &[StateVariable],
45    //     si: &SearchInstance,
46    // ) -> Result<EdgeTraversal, SearchError> {
47    //     match self {
48    //         Direction::Forward => {
49    //             EdgeTraversal::forward_traversal(edge_id, last_edge_id, start_state, si)
50    //         }
51    //         Direction::Reverse => {
52    //             EdgeTraversal::reverse_traversal(edge_id, last_edge_id, start_state, si)
53    //         }
54    //     }
55    // }
56}