use crate::adjacency::Adjacency;
use crate::cancel::CancelToken;
use crate::constraint::ConstraintEnum;
use crate::domain::Domain;
use crate::ordering::Ordering;
use crate::variable::Variable;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Pruning {
None,
ForwardChecking,
Ac3,
AcFc,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PropagationStrategy {
Auto,
Ac3,
Sweep,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OptimizationMode {
Feasibility,
MinimizeCost,
MaximizeCost,
}
#[derive(Debug, Clone)]
pub struct SolveConfig {
pub pruning: Pruning,
pub ordering: Ordering,
pub max_solutions: usize,
pub optimization_mode: OptimizationMode,
pub node_budget: Option<u64>,
pub cancel: Option<CancelToken>,
}
impl Default for SolveConfig {
fn default() -> Self {
Self {
pruning: Pruning::Ac3,
ordering: Ordering::FailFirst,
max_solutions: 1,
optimization_mode: OptimizationMode::Feasibility,
node_budget: Some(1_000_000),
cancel: None,
}
}
}
#[derive(Debug, Clone, Default)]
pub struct SolveStats {
pub backtracks: u64,
pub nodes_explored: u64,
pub propagations: u64,
pub budget_exceeded: bool,
pub cancelled: bool,
}
pub struct Csp<D: Domain> {
pub variables: Vec<Variable<D>>,
pub(crate) constraints: Vec<ConstraintEnum<D>>,
pub(crate) adjacency: Option<Adjacency>,
pub(crate) stats: SolveStats,
pub(crate) constraint_weights: Vec<f64>,
pub(crate) var_constraint_ids: Vec<Vec<usize>>,
}