backtrack 0.3.0

Solve hard constraints easily
Documentation
use crate::common::assert_unsat_unique;
use backtrack::problems::TotalSum;
use backtrack::solve::IterSolveExt;
use backtrack::solvers::IterSolveCached;

#[test]
fn total_sum_search_sat() {
    let sum = TotalSum::new(3, &[2, 0], 3);
    let solver = IterSolveCached::new(&sum);

    let mut sats = solver.sat_iter();

    assert_eq!(sats.next(), Some(vec![2, 2, 0]));
    assert_eq!(sats.next(), Some(vec![2, 0, 2]));
    assert_eq!(sats.next(), Some(vec![0, 2, 2]));
    assert_eq!(sats.next(), None);
}

#[test]
fn total_sum_unsat_unique() {
    let sum = TotalSum::new(3, &[2, 0], 3);
    let unsats = IterSolveCached::new(&sum).unsat_iter();
    assert_unsat_unique(unsats);
}

#[test]
fn total_sum_search_sat_cached() {
    let sum = TotalSum::new(3, &[2, 0], 3);
    let solver = IterSolveCached::new(&sum);

    let mut sats = solver.sat_iter();

    assert_eq!(sats.next(), Some(vec![2, 2, 0]));
    assert_eq!(sats.next(), Some(vec![2, 0, 2]));
    assert_eq!(sats.next(), Some(vec![0, 2, 2]));
    assert_eq!(sats.next(), None);
}

#[test]
fn total_sum_unsat_unique_cached() {
    let sum = TotalSum::new(3, &[2, 0], 3);
    let unsats = IterSolveCached::new(&sum).unsat_iter();
    assert_unsat_unique(unsats);
}