backtrack 0.3.0

Solve hard constraints easily
Documentation
use backtrack::problem::{Check, Scope};
use backtrack::solve::IterSolveExt;
use backtrack::solvers::{IterSolveCached, IterSolveNaive};

struct VarSizedProblem {
    size: usize,
    len: usize,
}

impl Scope<'_> for VarSizedProblem {
    fn size(&self) -> usize {
        self.size
    }

    fn value(&self, _index: usize) -> usize {
        if !self.is_empty() {
            0
        } else {
            unreachable!()
        }
    }

    fn len(&self) -> usize {
        self.len
    }
}

impl Check for VarSizedProblem {
    fn extends_sat(&self, _solution: &[usize], _x: &usize) -> bool {
        true
    }
}

//impl CheckInc for VarSizedProblem {}

#[test]
fn zero_sized_problem() {
    let prob = VarSizedProblem { size: 0, len: 4 };
    let solver = IterSolveNaive::new(&prob);

    let mut sats = solver.sat_iter();
    assert_eq!(sats.next(), None);
}

#[test]
fn zero_len_problem() {
    let prob = VarSizedProblem { size: 4, len: 0 };
    let solver = IterSolveNaive::new(&prob);

    let mut sats = solver.sat_iter();
    assert_eq!(sats.next(), None);
}

#[test]
fn zero_sized_len_problem() {
    let prob = VarSizedProblem { size: 0, len: 0 };
    let solver = IterSolveNaive::new(&prob);

    let mut sats = solver.sat_iter();
    assert_eq!(sats.next(), None);
}
#[test]
fn zero_sized_problem_cached() {
    let prob = VarSizedProblem { size: 0, len: 4 };
    let solver = IterSolveCached::new(&prob);

    let mut sats = solver.sat_iter();
    assert_eq!(sats.next(), None);
}

#[test]
fn zero_len_problem_cached() {
    let prob = VarSizedProblem { size: 4, len: 0 };
    let solver = IterSolveCached::new(&prob);

    let mut sats = solver.sat_iter();
    assert_eq!(sats.next(), None);
}

#[test]
fn zero_sized_len_problem_cached() {
    let prob = VarSizedProblem { size: 0, len: 0 };
    let solver = IterSolveCached::new(&prob);

    let mut sats = solver.sat_iter();
    assert_eq!(sats.next(), None);
}