Skip to content

Commit

Permalink
refactor: factor out solver integration tests
Browse files Browse the repository at this point in the history
  • Loading branch information
chrjabs committed Apr 4, 2024
1 parent d768c48 commit fb625b9
Show file tree
Hide file tree
Showing 18 changed files with 367 additions and 688 deletions.
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ members = [
"glucose",
"minisat",
"ipasir",
"solvertests",
]
resolver = "2"

Expand Down
3 changes: 3 additions & 0 deletions cadical/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,6 @@ cc = { version = "1.0.83", features = ["parallel"] }
git2 = "0.18.1"
glob = "0.3.1"
chrono = "0.4.31"

[dev-dependencies]
rustsat-solvertests = { path = "../solvertests" }
87 changes: 1 addition & 86 deletions cadical/tests/incremental.rs
Original file line number Diff line number Diff line change
@@ -1,86 +1 @@
use rustsat::{
instances::{BasicVarManager, SatInstance},
lit,
solvers::{SolveIncremental, SolverResult},
};
use rustsat_cadical::CaDiCaL;

fn test_assumption_sequence<S: SolveIncremental>(mut solver: S) {
let inst: SatInstance<BasicVarManager> =
SatInstance::from_dimacs_path("./data/small.cnf").unwrap();
solver.add_cnf(inst.as_cnf().0).unwrap();
let res = solver.solve().unwrap();
assert_eq!(res, SolverResult::Sat);
let res = solver.solve_assumps(&[!lit![0], !lit![1]]).unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[lit![0], lit![1], lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[lit![0], lit![1], lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[lit![0], lit![1], !lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[lit![0], lit![1], !lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Sat);
let res = solver
.solve_assumps(&[lit![0], !lit![1], lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[lit![0], !lit![1], lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Sat);
let res = solver
.solve_assumps(&[lit![0], !lit![1], !lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[lit![0], !lit![1], !lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[!lit![0], lit![1], lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[!lit![0], lit![1], lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[!lit![0], lit![1], !lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Sat);
let res = solver
.solve_assumps(&[!lit![0], lit![1], !lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Sat);
let res = solver
.solve_assumps(&[!lit![0], !lit![1], lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[!lit![0], !lit![1], lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[!lit![0], !lit![1], !lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[!lit![0], !lit![1], !lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
}

#[test]
fn assumption_sequence() {
let solver = CaDiCaL::default();
test_assumption_sequence(solver);
}
rustsat_solvertests::incremental_tests!(rustsat_cadical::CaDiCaL);
39 changes: 5 additions & 34 deletions cadical/tests/phasing.rs
Original file line number Diff line number Diff line change
@@ -1,34 +1,5 @@
use rustsat::{
instances::{BasicVarManager, SatInstance},
lit,
solvers::{PhaseLit, Solve, SolverResult},
types::TernaryVal,
var,
};
use rustsat_cadical::CaDiCaL;

fn test_phase_saving<S: Solve + PhaseLit>(mut solver: S) {
let inst: SatInstance<BasicVarManager> =
SatInstance::from_dimacs_path("./data/small.cnf").unwrap();
solver.add_cnf(inst.as_cnf().0).unwrap();
solver.phase_lit(lit![0]).unwrap();
solver.phase_lit(!lit![1]).unwrap();
solver.phase_lit(lit![2]).unwrap();
solver.phase_lit(!lit![3]).unwrap();
let res = solver.solve().unwrap();
assert_eq!(res, SolverResult::Sat);
let sol = solver.solution(var![3]).unwrap();
assert_eq!(sol.lit_value(lit![0]), TernaryVal::True);
assert_eq!(sol.lit_value(lit![1]), TernaryVal::False);
assert_eq!(sol.lit_value(lit![2]), TernaryVal::True);
assert_eq!(sol.lit_value(lit![3]), TernaryVal::False);
solver.unphase_var(var![1]).unwrap();
solver.unphase_var(var![0]).unwrap();
}

#[test]
fn phase_saving() {
let mut solver = CaDiCaL::default();
solver.set_option("lucky", 0).unwrap();
test_phase_saving(solver);
}
rustsat_solvertests::phasing_tests!({
let mut slv = rustsat_cadical::CaDiCaL::default();
slv.set_option("lucky", 0).unwrap();
slv
});
112 changes: 15 additions & 97 deletions cadical/tests/small.rs
Original file line number Diff line number Diff line change
@@ -1,102 +1,20 @@
use rustsat::{
instances::{BasicVarManager, SatInstance},
solvers::{Solve, SolverResult},
};
use rustsat_cadical::CaDiCaL;

fn small_sat_instance<S: Solve>(mut solver: S) {
let inst: SatInstance<BasicVarManager> =
SatInstance::from_dimacs_path("./data/AProVE11-12.cnf").unwrap();
solver.add_cnf(inst.as_cnf().0).unwrap();
let res = solver.solve().unwrap();
assert_eq!(res, SolverResult::Sat);
}

fn small_unsat_instance<S: Solve>(mut solver: S) {
let inst: SatInstance<BasicVarManager> =
SatInstance::from_dimacs_path("./data/smtlib-qfbv-aigs-ext_con_032_008_0256-tseitin.cnf")
.unwrap();
solver.add_cnf(inst.as_cnf().0).unwrap();
let res = solver.solve().unwrap();
assert_eq!(res, SolverResult::Unsat);
}

fn ms_segfault_instance<S: Solve>(mut solver: S) {
let inst: SatInstance<BasicVarManager> =
SatInstance::from_dimacs_path("./data/minisat-segfault.cnf").unwrap();
solver.add_cnf(inst.as_cnf().0).unwrap();
let res = solver.solve().unwrap();
assert_eq!(res, SolverResult::Unsat);
mod base {
rustsat_solvertests::base_tests!(rustsat_cadical::CaDiCaL);
}

#[test]
fn small_sat() {
let solver = CaDiCaL::default();
small_sat_instance(solver);
mod sat {
rustsat_solvertests::base_tests!({
let mut slv = rustsat_cadical::CaDiCaL::default();
slv.set_configuration(rustsat_cadical::Config::SAT).unwrap();
slv
});
}

#[test]
fn small_unsat() {
let solver = CaDiCaL::default();
small_unsat_instance(solver);
}

#[test]
fn ms_segfault() {
let solver = CaDiCaL::default();
ms_segfault_instance(solver);
}

#[test]
fn sat_small_sat() {
let mut solver = CaDiCaL::default();
solver
.set_configuration(rustsat_cadical::Config::SAT)
.unwrap();
small_sat_instance(solver);
}

#[test]
fn sat_small_unsat() {
let mut solver = CaDiCaL::default();
solver
.set_configuration(rustsat_cadical::Config::SAT)
.unwrap();
small_unsat_instance(solver);
}

#[test]
fn sat_ms_segfault() {
let mut solver = CaDiCaL::default();
solver
.set_configuration(rustsat_cadical::Config::SAT)
.unwrap();
ms_segfault_instance(solver);
}

#[test]
fn unsat_small_sat() {
let mut solver = CaDiCaL::default();
solver
.set_configuration(rustsat_cadical::Config::UNSAT)
.unwrap();
small_sat_instance(solver);
}

#[test]
fn unsat_small_unsat() {
let mut solver = CaDiCaL::default();
solver
.set_configuration(rustsat_cadical::Config::UNSAT)
.unwrap();
small_unsat_instance(solver);
}

#[test]
fn unsat_ms_segfault() {
let mut solver = CaDiCaL::default();
solver
.set_configuration(rustsat_cadical::Config::UNSAT)
.unwrap();
ms_segfault_instance(solver);
mod unsat {
rustsat_solvertests::base_tests!({
let mut slv = rustsat_cadical::CaDiCaL::default();
slv.set_configuration(rustsat_cadical::Config::UNSAT)
.unwrap();
slv
});
}
3 changes: 3 additions & 0 deletions glucose/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,6 @@ git2 = "0.18.1"
glob = "0.3.1"
chrono = "0.4.31"
cmake = "0.1.50"

[dev-dependencies]
rustsat-solvertests = { path = "../solvertests" }
88 changes: 4 additions & 84 deletions glucose/tests/incremental.rs
Original file line number Diff line number Diff line change
@@ -1,86 +1,6 @@
use rustsat::{
instances::{BasicVarManager, SatInstance},
lit,
solvers::{SolveIncremental, SolverResult},
};
use rustsat_glucose::core::Glucose;

fn test_assumption_sequence<S: SolveIncremental>(mut solver: S) {
let inst: SatInstance<BasicVarManager> =
SatInstance::from_dimacs_path("./data/small.cnf").unwrap();
solver.add_cnf(inst.as_cnf().0).unwrap();
let res = solver.solve().unwrap();
assert_eq!(res, SolverResult::Sat);
let res = solver.solve_assumps(&[!lit![0], !lit![1]]).unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[lit![0], lit![1], lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[lit![0], lit![1], lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[lit![0], lit![1], !lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[lit![0], lit![1], !lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Sat);
let res = solver
.solve_assumps(&[lit![0], !lit![1], lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[lit![0], !lit![1], lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Sat);
let res = solver
.solve_assumps(&[lit![0], !lit![1], !lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[lit![0], !lit![1], !lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[!lit![0], lit![1], lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[!lit![0], lit![1], lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[!lit![0], lit![1], !lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Sat);
let res = solver
.solve_assumps(&[!lit![0], lit![1], !lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Sat);
let res = solver
.solve_assumps(&[!lit![0], !lit![1], lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[!lit![0], !lit![1], lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[!lit![0], !lit![1], !lit![2], lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
let res = solver
.solve_assumps(&[!lit![0], !lit![1], !lit![2], !lit![3]])
.unwrap();
assert_eq!(res, SolverResult::Unsat);
mod core {
rustsat_solvertests::incremental_tests!(rustsat_glucose::core::Glucose);
}

#[test]
fn assumption_sequence() {
let solver = Glucose::default();
test_assumption_sequence(solver);
}
// Note: Cannot test prepro version of glucose with this small example because
// the variable are eliminated by preprocessing
Loading

0 comments on commit fb625b9

Please sign in to comment.