use super::cadical_ffi::CaDiCal;
use crate::cnf::{Literal, VarId};
pub(super) struct BackboneResult {
pub forced: Vec<Literal>,
pub probes_completed: usize,
pub solve_ms: u64,
pub unsat: bool,
pub fixed_found: usize,
pub flippable_eliminated: usize,
pub model_eliminated: usize,
pub elapsed_ms: u64,
}
pub(super) struct EquivResult {
pub equivalences: Vec<(Literal, Literal)>,
pub probes_completed: usize,
pub unsat: bool,
pub elapsed_ms: u64,
}
pub(super) fn refine_candidates(
candidates: &[i32],
new_model: &[i32],
rep_true_in_model: bool,
) -> (Vec<i32>, Vec<i32>) {
let mut stay = Vec::new();
let mut split = Vec::new();
for &lit in candidates {
let model_val = new_model[VarId::from_dimacs(lit).idx()];
let lit_true_in_model = (lit > 0 && model_val > 0) || (lit < 0 && model_val < 0);
if lit_true_in_model == rep_true_in_model {
stay.push(lit);
} else {
split.push(lit);
}
}
(stay, split)
}
pub(super) fn read_model(solver: &mut CaDiCal, num_vars: usize) -> Vec<i32> {
let mut model = vec![0i32; num_vars];
for (i, slot) in model.iter_mut().enumerate() {
*slot = solver.val(VarId(i as u32).to_dimacs());
}
model
}