#![feature(try_trait_v2)]
use std::fmt;
use rustsat::solvers::{SolverResult, SolverStats};
pub mod options;
pub use options::{CoreBoostingOptions, KernelOptions, Limits};
pub mod types;
use types::NonDomPoint;
pub mod prepro;
pub mod algs;
pub use algs::{
CoreBoost, Init, InitCert, InitCertDefaultBlock, InitDefaultBlock, KernelFunctions, Solve,
};
pub use algs::bioptsat::BiOptSat;
pub use algs::lowerbounding::LowerBounding;
pub use algs::pminimal::PMinimal;
pub(crate) mod termination;
pub use termination::MaybeTerminated;
pub use termination::MaybeTerminatedError;
pub use termination::Termination;
pub trait ExtendedSolveStats {
fn oracle_stats(&self) -> SolverStats;
fn encoding_stats(&self) -> Vec<EncodingStats>;
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Phase {
OuterLoop,
Minimization,
Enumeration,
Linsu,
}
impl fmt::Display for Phase {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Phase::OuterLoop => write!(f, "outer-loop"),
Phase::Minimization => write!(f, "minimization"),
Phase::Enumeration => write!(f, "enumeration"),
Phase::Linsu => write!(f, "linsu"),
}
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Default)]
pub struct Stats {
pub n_solve_calls: usize,
pub n_solutions: usize,
pub n_non_dominated: usize,
pub n_candidates: usize,
pub n_oracle_calls: usize,
pub n_objs: usize,
pub n_real_objs: usize,
pub n_orig_clauses: usize,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Default)]
pub struct EncodingStats {
pub n_clauses: usize,
pub n_vars: u32,
pub offset: isize,
pub unit_weight: Option<usize>,
}
pub trait WriteSolverLog {
fn log_candidate(&mut self, costs: &[usize], phase: Phase) -> anyhow::Result<()>;
fn log_oracle_call(&mut self, result: SolverResult) -> anyhow::Result<()>;
fn log_solution(&mut self) -> anyhow::Result<()>;
fn log_non_dominated(&mut self, pareto_point: &NonDomPoint) -> anyhow::Result<()>;
#[cfg(feature = "sol-tightening")]
fn log_heuristic_obj_improvement(
&mut self,
obj_idx: usize,
apparent_cost: usize,
improved_cost: usize,
) -> anyhow::Result<()>;
fn log_fence(&mut self, fence: &[usize]) -> anyhow::Result<()>;
fn log_routine_start(&mut self, desc: &'static str) -> anyhow::Result<()>;
fn log_routine_end(&mut self) -> anyhow::Result<()>;
fn log_end_solve(&mut self) -> anyhow::Result<()>;
fn log_ideal(&mut self, ideal: &[usize]) -> anyhow::Result<()>;
fn log_nadir(&mut self, nadir: &[usize]) -> anyhow::Result<()>;
fn log_core(&mut self, weight: usize, len: usize, red_len: usize) -> anyhow::Result<()>;
fn log_core_exhaustion(&mut self, exhausted: usize, weight: usize) -> anyhow::Result<()>;
fn log_inprocessing(
&mut self,
cls_before_after: (usize, usize),
fixed_lits: usize,
obj_range_before_after: Vec<(usize, usize)>,
) -> anyhow::Result<()>;
fn log_message(&mut self, msg: &str) -> anyhow::Result<()>;
}