1#![feature(try_trait_v2)]
5
6use std::fmt;
7
8use rustsat::solvers::{SolverResult, SolverStats};
9
10pub mod options;
11pub use options::{CoreBoostingOptions, KernelOptions, Limits};
12
13pub mod types;
14use types::NonDomPoint;
15
16pub mod prepro;
17
18pub mod algs;
19pub use algs::{
20 CoreBoost, Init, InitCert, InitCertDefaultBlock, InitDefaultBlock, KernelFunctions, Solve,
21};
22
23pub use algs::bioptsat::BiOptSat;
25pub use algs::lowerbounding::LowerBounding;
26pub use algs::pminimal::PMinimal;
27
28pub(crate) mod termination;
29pub use termination::MaybeTerminated;
30pub use termination::MaybeTerminatedError;
31pub use termination::Termination;
32
33pub trait ExtendedSolveStats {
35 fn oracle_stats(&self) -> SolverStats;
37 fn encoding_stats(&self) -> Vec<EncodingStats>;
39}
40
41#[derive(Clone, Copy, Debug, PartialEq, Eq)]
43pub enum Phase {
44 OuterLoop,
46 Minimization,
48 Enumeration,
50 Linsu,
52}
53
54impl fmt::Display for Phase {
55 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
56 match self {
57 Phase::OuterLoop => write!(f, "outer-loop"),
58 Phase::Minimization => write!(f, "minimization"),
59 Phase::Enumeration => write!(f, "enumeration"),
60 Phase::Linsu => write!(f, "linsu"),
61 }
62 }
63}
64
65#[derive(Debug, PartialEq, Eq, Clone, Copy, Default)]
67pub struct Stats {
68 pub n_solve_calls: usize,
70 pub n_solutions: usize,
72 pub n_non_dominated: usize,
74 pub n_candidates: usize,
76 pub n_oracle_calls: usize,
78 pub n_objs: usize,
80 pub n_real_objs: usize,
82 pub n_orig_clauses: usize,
84}
85
86#[derive(Debug, PartialEq, Eq, Clone, Copy, Default)]
88pub struct EncodingStats {
89 pub n_clauses: usize,
91 pub n_vars: u32,
93 pub offset: isize,
95 pub unit_weight: Option<usize>,
97}
98
99pub trait WriteSolverLog {
101 fn log_candidate(&mut self, costs: &[usize], phase: Phase) -> anyhow::Result<()>;
103 fn log_oracle_call(&mut self, result: SolverResult) -> anyhow::Result<()>;
105 fn log_solution(&mut self) -> anyhow::Result<()>;
107 fn log_non_dominated(&mut self, pareto_point: &NonDomPoint) -> anyhow::Result<()>;
109 #[cfg(feature = "sol-tightening")]
110 fn log_heuristic_obj_improvement(
112 &mut self,
113 obj_idx: usize,
114 apparent_cost: usize,
115 improved_cost: usize,
116 ) -> anyhow::Result<()>;
117 fn log_fence(&mut self, fence: &[usize]) -> anyhow::Result<()>;
119 fn log_routine_start(&mut self, desc: &'static str) -> anyhow::Result<()>;
121 fn log_routine_end(&mut self) -> anyhow::Result<()>;
123 fn log_end_solve(&mut self) -> anyhow::Result<()>;
125 fn log_ideal(&mut self, ideal: &[usize]) -> anyhow::Result<()>;
127 fn log_nadir(&mut self, nadir: &[usize]) -> anyhow::Result<()>;
129 fn log_core(&mut self, weight: usize, len: usize, red_len: usize) -> anyhow::Result<()>;
131 fn log_core_exhaustion(&mut self, exhausted: usize, weight: usize) -> anyhow::Result<()>;
133 fn log_inprocessing(
135 &mut self,
136 cls_before_after: (usize, usize),
137 fixed_lits: usize,
138 obj_range_before_after: Vec<(usize, usize)>,
139 ) -> anyhow::Result<()>;
140 fn log_message(&mut self, msg: &str) -> anyhow::Result<()>;
142}