use crate::cnf::Clause;
use crate::cnf::CnfFormula;
use crate::score::vtree_context_width_per_node;
use crate::tests::common::lit;
use crate::vtree::Vtree;
use crate::vtree::VtreeIdx;
use crate::vtree::{VarId, VtreeNode};
pub(crate) fn fixture_formula() -> CnfFormula {
CnfFormula {
num_vars: 4,
clauses: vec![
Clause::new(vec![lit(0, true), lit(1, true)]),
Clause::new(vec![lit(2, true), lit(3, true)]),
Clause::new(vec![lit(0, true), lit(2, true)]),
Clause::new(vec![lit(1, true), lit(3, false)]),
Clause::new(vec![lit(0, true), lit(1, false)]),
],
}
}
pub(crate) fn fixture_vtree() -> Vtree {
let leaf = |v: u32| VtreeNode::Leaf {
var: VarId(v),
parent: None,
};
let internal = |l: u32, r: u32| VtreeNode::Internal {
left: VtreeIdx(l),
right: VtreeIdx(r),
parent: None,
};
let nodes = vec![
leaf(0), leaf(1), internal(0, 1), leaf(2), leaf(3), internal(3, 4), internal(2, 5), ];
Vtree::from_nodes(nodes, VtreeIdx(6), 4)
}
pub(crate) fn vtree_peak_context_width(vtree: &Vtree, formula: &CnfFormula) -> u32 {
vtree_context_width_per_node(vtree, formula, None)
.into_iter()
.max()
.unwrap_or(0)
}