use crate::cnf::CnfFormula;
use crate::cnf::stats::*;
use crate::tests::common::{grid_fixture, mixed_width_fixture};
fn formula_of(s: &str) -> CnfFormula {
crate::tests::common::parse(s).0
}
#[test]
fn clause_width_cv_pins_the_predicate_threshold() {
let cv_uniform = clause_width_cv(&grid_fixture());
assert!(
cv_uniform < COLORING_WIDTH_CV_MAX,
"uniform-width CNF must pass the width half, got {cv_uniform}"
);
let cv_mixed = clause_width_cv(&mixed_width_fixture());
assert!(
cv_mixed > COLORING_WIDTH_CV_MAX,
"mixed-width CNF must fail the width half, got {cv_mixed}"
);
assert_eq!(clause_width_cv(&formula_of("p cnf 2 1\n1 2 0\n")), 0.0);
}
#[test]
fn var_occurrence_cv_counts_every_variable() {
let first_is_frequent = formula_of("p cnf 3 4\n1 2 0\n1 3 0\n1 2 0\n1 3 0\n");
let last_is_frequent = formula_of("p cnf 3 4\n3 2 0\n3 1 0\n3 2 0\n3 1 0\n");
let cv_first = var_occurrence_cv(&first_is_frequent);
assert!(
cv_first > 0.0,
"unequal occurrence counts must disperse, got {cv_first}"
);
assert_eq!(
cv_first,
var_occurrence_cv(&last_is_frequent),
"the statistic must not depend on which variable id carries a count",
);
}
#[test]
fn coloring_like_needs_both_halves() {
assert!(coloring_like_predicate(0.013, 0.206));
assert!(!coloring_like_predicate(0.014, 0.66));
assert!(!coloring_like_predicate(0.3, 0.46));
assert!(!coloring_like_predicate(0.9, 0.01));
}
#[test]
fn the_two_statistics_classify_the_two_fixtures() {
let grid = grid_fixture();
assert!(
coloring_like_predicate(var_occurrence_cv(&grid), clause_width_cv(&grid)),
"a uniform grid must be coloring-like",
);
let mixed = mixed_width_fixture();
assert!(
!coloring_like_predicate(var_occurrence_cv(&mixed), clause_width_cv(&mixed)),
"dispersed clause widths must not be coloring-like",
);
}