use crate::dump_wkt;
use crate::transition::*;
use crate::definition::Layers;
use crate::generation::LayerGeneration;
use geo::LineString;
use routers_network::Network;
use routers_network::{Entry, Metadata};
type LayerId = usize;
type NodeId = usize;
pub struct Transition<'a, Emission, Transition, E, M, N>
where
E: Entry,
M: Metadata,
N: Network<E, M>,
Emission: EmissionStrategy,
Transition: TransitionStrategy<E, M, N>,
{
pub(crate) map: &'a N,
pub(crate) heuristics: &'a CostingStrategies<Emission, Transition, E, M, N>,
pub(crate) candidates: Candidates<E>,
pub(crate) layers: Layers,
}
impl<'a, Emmis, Trans, E, M, N> Transition<'a, Emmis, Trans, E, M, N>
where
E: Entry,
M: Metadata,
N: Network<E, M>,
Emmis: EmissionStrategy + Send + Sync,
Trans: TransitionStrategy<E, M, N> + Send + Sync,
{
pub fn new(
map: &'a N,
linestring: LineString,
heuristics: &'a CostingStrategies<Emmis, Trans, E, M, N>,
generator: impl LayerGeneration<E>,
) -> Transition<'a, Emmis, Trans, E, M, N> {
let points = linestring.into_points();
let (layers, candidates) = generator.generate(&points);
dump_wkt!(
"geometry:positions.wkt",
layers.geometry(&candidates.lookup)
);
Transition {
map,
candidates,
layers,
heuristics,
}
}
pub fn context<'b>(&'a self, runtime: &'b M::Runtime) -> RoutingContext<'b, E, M, N>
where
'a: 'b,
{
RoutingContext {
candidates: &self.candidates,
map: self.map,
runtime,
}
}
pub fn solve(
self,
solver: impl Solver<E, M, N>,
runtime: &M::Runtime,
) -> Result<CollapsedPath<E>, MatchError> {
solver.solve(self, runtime)
}
pub(crate) fn collapse(self) -> Result<CollapsedPath<E>, MatchError> {
self.candidates
.collapse()
.map_err(MatchError::CollapseFailure)
}
}