routee-compass-core 0.11.3

The core routing algorithms and data structures of the RouteE-Compass energy-aware routing engine
Documentation
use super::{
    edge_traversal::EdgeTraversal, search_error::SearchError, search_instance::SearchInstance,
};
use crate::model::network::{Edge, EdgeId, VertexId};
use crate::model::state::StateVariable;
use serde::{Deserialize, Serialize};

#[derive(Copy, Clone, Serialize, Deserialize, Default)]
#[serde(rename = "snake_case")]
pub enum Direction {
    #[default]
    Forward,
    Reverse,
}

impl Direction {
    pub fn get_incident_edges<'a>(
        &'a self,
        vertex_id: &VertexId,
        si: &'a SearchInstance,
    ) -> Box<dyn Iterator<Item = &'a EdgeId> + 'a> {
        match self {
            Direction::Forward => si.graph.out_edges_iter(vertex_id),
            Direction::Reverse => si.graph.in_edges_iter(vertex_id),
        }
    }

    pub fn tree_key_vertex_id(&self, edge: &Edge) -> VertexId {
        match self {
            Direction::Forward => edge.dst_vertex_id,
            Direction::Reverse => edge.src_vertex_id,
        }
    }

    pub fn terminal_vertex_id(&self, edge: &Edge) -> VertexId {
        match self {
            Direction::Forward => edge.src_vertex_id,
            Direction::Reverse => edge.dst_vertex_id,
        }
    }

    pub fn perform_edge_traversal(
        &self,
        edge_id: EdgeId,
        last_edge_id: Option<EdgeId>,
        start_state: &[StateVariable],
        si: &SearchInstance,
    ) -> Result<EdgeTraversal, SearchError> {
        match self {
            Direction::Forward => {
                EdgeTraversal::forward_traversal(edge_id, last_edge_id, start_state, si)
            }
            Direction::Reverse => {
                EdgeTraversal::reverse_traversal(edge_id, last_edge_id, start_state, si)
            }
        }
    }
}