pub const UNREACHABLE: i64 = i64::MAX;
pub(crate) const MAX_SAFE_LEG_COST: i64 = i64::MAX / 4;
#[derive(Clone, Debug)]
pub struct ProblemData {
pub capacity: i64,
pub depot: usize,
pub demands: Vec<i32>,
pub distance_matrix: Vec<Vec<i64>>,
pub time_windows: Vec<(i64, i64)>,
pub service_durations: Vec<i64>,
pub travel_times: Vec<Vec<i64>>,
pub vehicle_departure_time: i64,
}
impl ProblemData {
#[inline]
pub(crate) fn distance_cost(&self, from: usize, to: usize) -> i64 {
self.finite_matrix_value(&self.distance_matrix, from, to)
.unwrap_or(MAX_SAFE_LEG_COST)
}
#[inline]
pub(crate) fn finite_distance(&self, from: usize, to: usize) -> Option<i64> {
self.finite_matrix_value(&self.distance_matrix, from, to)
}
#[inline]
pub(crate) fn travel_time(&self, from: usize, to: usize) -> Option<i64> {
self.finite_matrix_value(&self.travel_times, from, to)
}
#[inline]
fn finite_matrix_value(&self, matrix: &[Vec<i64>], from: usize, to: usize) -> Option<i64> {
let value = matrix.get(from)?.get(to).copied()?;
(value >= 0 && value != UNREACHABLE).then_some(value)
}
}