pub mod ac3;
pub(crate) mod adjacency;
pub mod gac;
pub mod monotonic;
pub mod optimize;
pub mod propagate;
pub mod search;
use crate::constraint::VarId;
use crate::domain::Domain;
use crate::variable::Variable;
pub type Solution<D> = Vec<<D as Domain>::Value>;
#[derive(Default)]
pub(crate) struct Trail {
touched: Vec<VarId>,
}
impl Trail {
#[inline]
pub(crate) fn checkpoint(&self) -> usize {
self.touched.len()
}
#[inline]
pub(crate) fn push(&mut self, var: VarId) {
self.touched.push(var);
}
#[inline]
pub(crate) fn undo_to<D: Domain>(
&mut self,
mark: usize,
depth: usize,
variables: &mut [Variable<D>],
) {
while self.touched.len() > mark {
let var = self.touched.pop().unwrap();
variables[var as usize].restore(depth);
}
}
}