use super::*;
fn make_strengthen_scenario() -> crate::preprocess::dve::types::DveResult {
use crate::preprocess::dve::types::{DveFate, DveResult};
let formula = make_formula(
3,
vec![
vec![-3, 1], vec![-3, 2], vec![3, -1, -2], vec![1, 2], ],
);
DveResult {
formula,
definition_clauses: Vec::new(),
renumbering: Some(crate::preprocess::renumber::Renumber::of_kept(
5,
[VarId(2), VarId(3), VarId(4)],
)),
fates: vec![
DveFate::Free,
DveFate::Free,
DveFate::Kept,
DveFate::Kept,
DveFate::Kept,
],
elapsed_ms: 0,
}
}
#[test]
fn post_dve_strengthen_keeps_provenance_consistent() {
let mut dve = make_strengthen_scenario();
crate::preprocess::dve::post_dve_strengthen(&mut dve, &rustc_hash::FxHashSet::default());
assert!(
dve.formula.num_vars < 3,
"inner strengthen pass did not eliminate the gate output (num_vars={}); \
test no longer exercises the bug",
dve.formula.num_vars
);
let elim_count = dve.total_eliminated();
assert_eq!(
elim_count,
dve.original_num_vars() - dve.formula.num_vars as usize,
"elimination provenance ({} eliminated) inconsistent with final formula \
({} of {} survive): post_dve_strengthen dropped the inner pass's \
eliminations from the per-var fates",
elim_count,
dve.formula.num_vars,
dve.original_num_vars(),
);
assert!(dve.fates[0].eliminated() && dve.fates[1].eliminated());
assert!(
dve.fates[4].eliminated(),
"inner-pass elimination of original var 4 not recorded"
);
}
#[test]
fn post_dve_strengthen_respects_frozen() {
let mut frozen: rustc_hash::FxHashSet<VarId> = rustc_hash::FxHashSet::default();
frozen.insert(VarId(4));
let mut dve = make_strengthen_scenario();
crate::preprocess::dve::post_dve_strengthen(&mut dve, &frozen);
assert!(
!dve.fates[4].eliminated(),
"frozen original var 4 was eliminated by the post-DVE strengthen pass"
);
}
fn strengthenable_formula() -> crate::cnf::CnfFormula {
make_formula(
5,
vec![
vec![1, 2, 3],
vec![1, 2, -3],
vec![-1, 4],
vec![-2, -4, 5],
vec![3, 4, -5],
vec![-3, -4, 5],
],
)
}
#[test]
fn strengthening_is_cut_by_the_stage_wall_it_was_handed() {
use crate::preprocess::dve::strengthen::strengthen_clauses;
let f = strengthenable_formula();
let mut unbounded = f.clauses.clone();
assert!(
strengthen_clauses(&mut unbounded, f.num_vars as usize, None),
"the fixture is no longer strengthened at all; this test guards nothing"
);
let past = std::time::Instant::now() - std::time::Duration::from_secs(1);
let mut cut = f.clauses.clone();
let changed = strengthen_clauses(&mut cut, f.num_vars as usize, Some(past));
assert!(
!changed,
"a vivification round with no time left strengthened anyway — the stage wall did not \
reach CaDiCaL's terminator"
);
assert_eq!(
cut, f.clauses,
"a cut round returned something other than its input"
);
}
#[test]
fn strengthening_under_a_generous_stage_wall_matches_the_unbounded_round() {
use crate::preprocess::dve::strengthen::strengthen_clauses;
let f = strengthenable_formula();
let mut unbounded = f.clauses.clone();
let a = strengthen_clauses(&mut unbounded, f.num_vars as usize, None);
let far = std::time::Instant::now() + std::time::Duration::from_secs(3_600);
let mut bounded = f.clauses.clone();
let b = strengthen_clauses(&mut bounded, f.num_vars as usize, Some(far));
assert_eq!(
a, b,
"a wall it cannot reach changed whether the round reduced"
);
assert_eq!(
bounded, unbounded,
"a wall it cannot reach changed the reduction"
);
}