use super::*;
use crate::cnf::{Original, Reduced, ShowSet, Weights};
pub(super) fn compile_preserving_bundle(
formula: &CnfFormula,
meta: &CnfMeta,
config: &RunConfig,
) -> PreprocessBundle {
let orig_nv = formula.num_vars as usize;
let mode = Mode::Compile;
let simplified = simplify(
formula,
&preprocess_config(config, SimplifyPurpose::Function, &Weights::empty()),
);
let telemetry = PreprocessTelemetry::from_simplified(&simplified, config.stages.simplify);
let stages = StageReport {
simplify: Some(super::stage::simplify_outcome(config)),
..StageReport::default()
};
if let Some(mut bundle) = refuted(
&simplified.reduced_formula().clauses,
formula.num_vars,
mode,
None,
stages.clone(),
telemetry,
) {
bundle.decision_trace = simplified.decision_trace.clone();
return bundle;
}
let reduced = simplified.reduced_formula().clone();
let reduced_to_original_dimacs: VarMap<Reduced, Original> = simplified.composed_var_map();
let fates = simplified.original_fates();
let (forced_literals_original_dimacs, free_vars_original_dimacs) =
simplified.stripped_forced_and_free();
let show_vars_reduced_dimacs = meta.declared_show_vars().map(|show| {
let mut class_declared = vec![false; orig_nv];
for (original, fate) in fates.iter().enumerate() {
if let OriginalFate::Variable { index, .. } = *fate
&& show.contains(VarId(original as u32))
{
class_declared[simplified.reduced_var_to_original(index)] = true;
}
}
let widened = ShowSet::<Original>::from_zero_based(
(0..orig_nv as u32).filter(|v| class_declared[*v as usize]),
);
reduced_to_original_dimacs.carry_show(&widened)
});
let reduced_weights = meta.declared_weights().map(|t| {
reduced_to_original_dimacs
.carry_weights(&t.resolve(orig_nv))
.to_record_rows()
});
let record = PreprocessRecord {
original_to_reduced_dimacs: Some(OriginalMap::from_fates(&fates)),
forced_literals_original_dimacs,
free_vars_original_dimacs,
show_vars_reduced_dimacs,
reduced_weights,
..PreprocessRecord::new(
mode,
RecordLift::Pow2(simplified.count_lift_pow2(0)),
formula.num_vars,
reduced_to_original_dimacs,
)
};
PreprocessBundle {
reduced,
record,
learnt_clauses_reduced_dimacs: Vec::new(),
stages,
count_lift: CountLift {
simplify_pow2: simplified.count_lift_pow2(0),
arjun_pow2: 0,
},
telemetry,
decision_trace: simplified.decision_trace.clone(),
arjun_input: None,
independent_support_reduced: None,
}
}