use crate::backbones::Backbone;
use crate::formulas::Variable;
use crate::solver::functions::backbone_function::BackboneType::PositiveAndNegative;
use crate::solver::minisat::MiniSat;
use BackboneType::{OnlyNegative, OnlyPositive};
#[derive(Eq, PartialEq, Copy, Clone, Debug)]
pub enum BackboneType {
OnlyPositive,
OnlyNegative,
PositiveAndNegative,
}
impl BackboneType {
pub const fn matches_phase(&self, phase: bool) -> bool {
match self {
OnlyPositive => phase,
OnlyNegative => !phase,
PositiveAndNegative => true,
}
}
}
pub struct BackboneConfig {
variables: Vec<Variable>,
backbone_type: BackboneType,
}
impl BackboneConfig {
pub fn new(variables: Vec<Variable>) -> Self {
Self { variables, backbone_type: PositiveAndNegative }
}
#[must_use]
pub const fn backbone_type(mut self, backbone_type: BackboneType) -> Self {
self.backbone_type = backbone_type;
self
}
pub fn compute_backbone(self, solver: &mut MiniSat) -> Backbone {
let state_before_backbone = if solver.underlying_solver.config.incremental { Some(solver.save_state()) } else { None };
let backbone = solver.underlying_solver.compute_backbone(self.variables, self.backbone_type);
if let Some(state) = state_before_backbone {
solver.load_state(&state);
}
backbone
}
}