use crate::cnf::CnfFormula;
use crate::cnf::{Reduced, ShowSet};
use crate::decompose::TreeDecomposition;
use crate::score::*;
use crate::tests::common::make_td;
use crate::tests::score_fixture::{fixture_formula, fixture_vtree, vtree_peak_context_width};
use crate::vtree::Vtree;
fn fixture_td() -> TreeDecomposition {
make_td(
vec![vec![0, 1], vec![1, 2], vec![2, 3]],
vec![(0, 1), (1, 2)],
4,
)
}
fn vtree_peak_context_width_show(
vtree: &Vtree,
formula: &CnfFormula,
show_mask: Option<&crate::cnf::ShowMask>,
) -> Option<u32> {
show_mask.map(|mask| {
vtree_context_width_per_node(vtree, formula, Some(mask))
.into_iter()
.max()
.unwrap_or(0)
})
}
#[test]
fn compute_matches_individual_fns() {
let formula = fixture_formula();
let realized = crate::decompose::td_to_vtree_reading(
&fixture_td(),
formula.num_vars,
crate::decompose::Reading::default(),
Some(&formula),
None,
);
for vtree in [realized, fixture_vtree()] {
let nv = vtree.num_vars();
let mask = ShowSet::<Reduced>::from_zero_based((0..nv).filter(|i| i % 2 == 0)).mask(nv);
for show in [None, Some(&mask)] {
let fused = VtreeScores::compute(&vtree, &formula, show).expect("covering vtree");
assert_eq!(
fused.clause_load_stddev,
stddev_from_counts(&clause_lca_counts(&vtree, &formula)),
"clause_load_stddev"
);
assert_eq!(
fused.max_clause_load,
vtree_max_clause_load(&vtree, &formula),
"max_clause_load"
);
assert_eq!(
fused.peak_context_width_all,
vtree_peak_context_width(&vtree, &formula),
"peak_context_width_all"
);
assert_eq!(
fused.peak_context_width_show,
vtree_peak_context_width_show(&vtree, &formula, show),
"peak_context_width_show"
);
assert_eq!(
fused.cost,
vtree_cost(&vtree, &formula).expect("covering vtree"),
"cost"
);
}
}
}