use crate::bundle::components::*;
use crate::cnf::CnfFormula;
use crate::component::build_vtree;
use crate::config::RunConfig;
use crate::decompose::SelectionCtx;
use crate::tests::common::{Scratch, chain_components};
#[test]
fn manifest_states_the_local_to_reduced_numbering() {
let formula = chain_components(&[5, 1, 5]);
let cfg = RunConfig {
vtree_spec: "minfill-primal".to_string(),
..Default::default()
};
let built = build_vtree(&formula, &cfg, &SelectionCtx::plain()).expect("the vtree must build");
assert!(built.components.is_some(), "two chains must split");
let whole = built.vtree.clone();
let dir = Scratch::new("numbering");
let (m, paths) = write_components(
dir.path(),
&formula,
&built,
None,
ComponentWriteOptions::default(),
)
.expect("components must write");
assert_eq!(m.components.len(), 2);
assert_eq!(m.free_vars_reduced_dimacs, vec![6]);
assert!(
manifest_matches_vtree(&m, &whole),
"components + free vars must cover the reduced space"
);
let a = &m.components[0];
let b = &m.components[1];
assert_eq!(a.local_to_reduced_dimacs, vec![1, 2, 3, 4, 5]);
assert_eq!(b.local_to_reduced_dimacs, vec![7, 8, 9, 10, 11]);
let cnf = std::fs::read_to_string(dir.path().join(&b.cnf)).unwrap();
let (parsed, _) =
CnfFormula::from_dimacs(std::io::Cursor::new(&cnf)).expect("component CNF parses");
assert_eq!(parsed.num_vars as usize, b.local_to_reduced_dimacs.len());
let max_lit = parsed
.clauses
.iter()
.flat_map(|c| c.literals.iter())
.map(|l| l.var.0 + 1)
.max()
.unwrap();
assert!(
max_lit as usize <= b.local_to_reduced_dimacs.len(),
"component CNF must be renumbered into a dense local space",
);
assert_eq!(paths.files.len(), 4, "two files per component");
}