1use std::fmt;
6
7use crate::Phase;
8
9#[derive(Clone, Copy)]
11#[derive(Default)]
12pub struct KernelOptions {
13 pub enumeration: EnumOptions,
15 pub reserve_enc_vars: bool,
17 pub heuristic_improvements: HeurImprOptions,
19 pub solution_guided_search: bool,
21 pub core_trimming: bool,
23 pub core_minimization: bool,
25 pub core_exhaustion: bool,
27 pub store_cnf: bool,
29}
30
31
32impl KernelOptions {
33 pub fn set_enumeration(&mut self, enumeration: EnumOptions) {
34 self.enumeration = enumeration;
35 }
36}
37
38#[derive(Clone, Default)]
39pub struct CoreBoostingOptions {
40 pub rebase: bool,
42 pub after: AfterCbOptions,
44}
45
46#[derive(Clone, Default, PartialEq, Eq)]
47pub enum AfterCbOptions {
48 #[default]
50 Nothing,
51 Reset,
53 #[cfg(feature = "maxpre")]
55 Inpro(String),
56}
57
58pub type KernelWithCbOptions = (KernelOptions, Option<CoreBoostingOptions>);
59
60#[derive(Default, Clone, Copy, PartialEq, Eq)]
62pub enum EnumOptions {
63 #[default]
64 NoEnum,
66 Solutions(Option<usize>),
69 PMCSs(Option<usize>),
71}
72
73#[derive(Clone, Copy)]
75pub struct HeurImprOptions {
76 pub solution_tightening: HeurImprWhen,
79}
80
81impl HeurImprOptions {
82 pub fn none() -> Self {
84 Self {
85 solution_tightening: HeurImprWhen::Never,
86 }
87 }
88
89 pub fn all() -> Self {
91 Self {
92 solution_tightening: HeurImprWhen::Always,
93 }
94 }
95}
96
97impl Default for HeurImprOptions {
98 fn default() -> Self {
99 Self {
100 solution_tightening: HeurImprWhen::OuterLoop,
101 }
102 }
103}
104
105#[derive(Clone, Copy, Default, PartialEq, Eq)]
107#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
108pub enum HeurImprWhen {
109 #[default]
111 Never,
112 Always,
114 OuterLoop,
116}
117
118impl HeurImprWhen {
119 pub(crate) fn wanted(&self, phase: Phase) -> bool {
121 if phase == Phase::Enumeration {
122 return false;
123 }
124 match self {
125 HeurImprWhen::Never => false,
126 HeurImprWhen::Always => true,
127 HeurImprWhen::OuterLoop => phase == Phase::OuterLoop,
128 }
129 }
130}
131
132impl fmt::Display for HeurImprWhen {
133 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
134 match self {
135 HeurImprWhen::Never => write!(f, "never"),
136 HeurImprWhen::Always => write!(f, "always"),
137 HeurImprWhen::OuterLoop => write!(f, "outer-loop"),
138 }
139 }
140}
141
142#[derive(Clone, Copy, Default)]
144pub struct Limits {
145 pub pps: Option<usize>,
147 pub sols: Option<usize>,
149 pub candidates: Option<usize>,
151 pub oracle_calls: Option<usize>,
153}
154
155impl Limits {
156 pub fn none() -> Limits {
158 Limits {
159 pps: None,
160 sols: None,
161 candidates: None,
162 oracle_calls: None,
163 }
164 }
165}
166
167#[derive(Clone, Copy, Default, PartialEq, Eq, Debug)]
169pub enum DivConAnchor {
170 LinSu,
172 #[default]
174 BiOptSat,
175 PMinimal(SubProblemSize),
177 LowerBounding(SubProblemSize),
179 NMinus(usize),
182}
183
184impl fmt::Display for DivConAnchor {
185 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
186 match self {
187 DivConAnchor::LinSu => write!(f, "lin-su"),
188 DivConAnchor::BiOptSat => write!(f, "bioptsat"),
189 DivConAnchor::PMinimal(size) => write!(f, "p-minimal({})", size),
190 DivConAnchor::LowerBounding(size) => write!(f, "lower-bounding({})", size),
191 DivConAnchor::NMinus(x) => write!(f, "n-minus({})", x),
192 }
193 }
194}
195
196#[derive(Clone, Copy, Default, PartialEq, Eq, Debug)]
198#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
199pub enum BuildEncodings {
200 #[default]
202 Once,
203 Rebuild,
205 CleanRebuild,
207}
208
209impl fmt::Display for BuildEncodings {
210 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
211 match self {
212 BuildEncodings::Once => write!(f, "once"),
213 BuildEncodings::Rebuild => write!(f, "rebuild"),
214 BuildEncodings::CleanRebuild => write!(f, "clean-rebuild"),
215 }
216 }
217}
218
219#[derive(Clone, Copy, PartialEq, Eq, Debug)]
221pub enum SubProblemSize {
222 Abs(usize),
224 Smaller(usize),
226}
227
228impl SubProblemSize {
229 pub fn absolute(&self, prob_size: usize) -> usize {
231 match self {
232 SubProblemSize::Abs(abs) => *abs,
233 SubProblemSize::Smaller(smaller) => prob_size - *smaller,
234 }
235 }
236}
237
238impl fmt::Display for SubProblemSize {
239 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
240 match self {
241 SubProblemSize::Abs(size) => write!(f, "+{}", size),
242 SubProblemSize::Smaller(size) => write!(f, "-{}", size),
243 }
244 }
245}