use std::fmt;
use crate::Phase;
#[derive(Clone, Copy)]
#[derive(Default)]
pub struct KernelOptions {
pub enumeration: EnumOptions,
pub reserve_enc_vars: bool,
pub heuristic_improvements: HeurImprOptions,
pub solution_guided_search: bool,
pub core_trimming: bool,
pub core_minimization: bool,
pub core_exhaustion: bool,
pub store_cnf: bool,
}
impl KernelOptions {
pub fn set_enumeration(&mut self, enumeration: EnumOptions) {
self.enumeration = enumeration;
}
}
#[derive(Clone, Default)]
pub struct CoreBoostingOptions {
pub rebase: bool,
pub after: AfterCbOptions,
}
#[derive(Clone, Default, PartialEq, Eq)]
pub enum AfterCbOptions {
#[default]
Nothing,
Reset,
#[cfg(feature = "maxpre")]
Inpro(String),
}
pub type KernelWithCbOptions = (KernelOptions, Option<CoreBoostingOptions>);
#[derive(Default, Clone, Copy, PartialEq, Eq)]
pub enum EnumOptions {
#[default]
NoEnum,
Solutions(Option<usize>),
PMCSs(Option<usize>),
}
#[derive(Clone, Copy)]
pub struct HeurImprOptions {
pub solution_tightening: HeurImprWhen,
}
impl HeurImprOptions {
pub fn none() -> Self {
Self {
solution_tightening: HeurImprWhen::Never,
}
}
pub fn all() -> Self {
Self {
solution_tightening: HeurImprWhen::Always,
}
}
}
impl Default for HeurImprOptions {
fn default() -> Self {
Self {
solution_tightening: HeurImprWhen::OuterLoop,
}
}
}
#[derive(Clone, Copy, Default, PartialEq, Eq)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
pub enum HeurImprWhen {
#[default]
Never,
Always,
OuterLoop,
}
impl HeurImprWhen {
pub(crate) fn wanted(&self, phase: Phase) -> bool {
if phase == Phase::Enumeration {
return false;
}
match self {
HeurImprWhen::Never => false,
HeurImprWhen::Always => true,
HeurImprWhen::OuterLoop => phase == Phase::OuterLoop,
}
}
}
impl fmt::Display for HeurImprWhen {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
HeurImprWhen::Never => write!(f, "never"),
HeurImprWhen::Always => write!(f, "always"),
HeurImprWhen::OuterLoop => write!(f, "outer-loop"),
}
}
}
#[derive(Clone, Copy, Default)]
pub struct Limits {
pub pps: Option<usize>,
pub sols: Option<usize>,
pub candidates: Option<usize>,
pub oracle_calls: Option<usize>,
}
impl Limits {
pub fn none() -> Limits {
Limits {
pps: None,
sols: None,
candidates: None,
oracle_calls: None,
}
}
}
#[derive(Clone, Copy, Default, PartialEq, Eq, Debug)]
pub enum DivConAnchor {
LinSu,
#[default]
BiOptSat,
PMinimal(SubProblemSize),
LowerBounding(SubProblemSize),
NMinus(usize),
}
impl fmt::Display for DivConAnchor {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
DivConAnchor::LinSu => write!(f, "lin-su"),
DivConAnchor::BiOptSat => write!(f, "bioptsat"),
DivConAnchor::PMinimal(size) => write!(f, "p-minimal({})", size),
DivConAnchor::LowerBounding(size) => write!(f, "lower-bounding({})", size),
DivConAnchor::NMinus(x) => write!(f, "n-minus({})", x),
}
}
}
#[derive(Clone, Copy, Default, PartialEq, Eq, Debug)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
pub enum BuildEncodings {
#[default]
Once,
Rebuild,
CleanRebuild,
}
impl fmt::Display for BuildEncodings {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BuildEncodings::Once => write!(f, "once"),
BuildEncodings::Rebuild => write!(f, "rebuild"),
BuildEncodings::CleanRebuild => write!(f, "clean-rebuild"),
}
}
}
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum SubProblemSize {
Abs(usize),
Smaller(usize),
}
impl SubProblemSize {
pub fn absolute(&self, prob_size: usize) -> usize {
match self {
SubProblemSize::Abs(abs) => *abs,
SubProblemSize::Smaller(smaller) => prob_size - *smaller,
}
}
}
impl fmt::Display for SubProblemSize {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
SubProblemSize::Abs(size) => write!(f, "+{}", size),
SubProblemSize::Smaller(size) => write!(f, "-{}", size),
}
}
}