use std::hash::Hash;
use smallbitset::Set256;
use crate::instance::TimeWindow;
#[derive(Clone, Hash, PartialEq, Eq)]
pub struct TsptwState {
pub position : Position,
pub elapsed : ElapsedTime,
pub must_visit : Set256,
pub maybe_visit: Option<Set256>,
pub depth: u16
}
#[derive(Clone, Hash, Eq, PartialEq)]
pub enum Position {
Node(u16),
Virtual(Set256),
}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
pub enum ElapsedTime {
FixedAmount{
duration: usize
},
FuzzyAmount{
earliest: usize,
latest : usize
}
}
impl ElapsedTime {
pub fn add_duration(self, d: usize) -> Self {
match self {
ElapsedTime::FixedAmount{duration} =>
ElapsedTime::FixedAmount{duration: duration + d},
ElapsedTime::FuzzyAmount{earliest,latest} =>
ElapsedTime::FuzzyAmount{earliest: earliest + d,latest: latest + d}
}
}
pub fn _intersects_with(self, tw: TimeWindow) -> bool {
match self {
ElapsedTime::FixedAmount{duration} =>
duration >= tw.earliest && duration <= tw.latest,
ElapsedTime::FuzzyAmount{earliest, latest} =>
(earliest >= tw.earliest && earliest <= tw.latest)
|| (latest >= tw.earliest && latest <= tw.latest),
}
}
pub fn earliest(self) -> usize {
match self {
ElapsedTime::FixedAmount{duration} => duration,
ElapsedTime::FuzzyAmount{earliest,..}=> earliest
}
}
pub fn _latest(self) -> usize {
match self {
ElapsedTime::FixedAmount{duration} => duration,
ElapsedTime::FuzzyAmount{latest,..}=> latest
}
}
}