use crate::builder::CanBeAddedToModel;
use crate::{HeurTiming, Heuristic, Model, ProblemCreated};
pub struct HeurBuilder<H: Heuristic> {
name: Option<String>,
desc: Option<String>,
priority: i32,
dispchar: Option<char>,
freq: i32,
freqofs: i32,
maxdepth: i32,
timing: Option<HeurTiming>,
usessubscip: bool,
heur: H,
}
impl<H: Heuristic> HeurBuilder<H> {
pub fn new(heur: H) -> Self {
HeurBuilder {
name: None,
desc: None,
priority: 100000,
dispchar: None,
freq: 1,
freqofs: 0,
maxdepth: -1,
timing: None,
usessubscip: false,
heur,
}
}
pub fn name(mut self, name: &str) -> Self {
self.name = Some(name.to_string());
self
}
pub fn desc(mut self, desc: &str) -> Self {
self.desc = Some(desc.to_string());
self
}
pub fn priority(mut self, priority: i32) -> Self {
self.priority = priority;
self
}
pub fn dispchar(mut self, dispchar: char) -> Self {
self.dispchar = Some(dispchar);
self
}
pub fn freq(mut self, freq: i32) -> Self {
self.freq = freq;
self
}
pub fn freqofs(mut self, freqofs: i32) -> Self {
self.freqofs = freqofs;
self
}
pub fn maxdepth(mut self, maxdepth: i32) -> Self {
self.maxdepth = maxdepth;
self
}
pub fn timing(mut self, timing: HeurTiming) -> Self {
self.timing = Some(timing);
self
}
pub fn usessubscip(mut self, usessubscip: bool) -> Self {
self.usessubscip = usessubscip;
self
}
}
pub fn heur<H: Heuristic>(heur: H) -> HeurBuilder<H> {
HeurBuilder::new(heur)
}
impl<H: Heuristic + 'static> CanBeAddedToModel for HeurBuilder<H> {
type Return = ();
fn add(self, model: &mut Model<ProblemCreated>) {
let name = self.name.unwrap_or_else(|| "".into());
let desc = self.desc.unwrap_or_else(|| "".into());
let dispchar = self.dispchar.unwrap_or('?');
let timing = self.timing.unwrap_or(HeurTiming::BEFORE_NODE);
let heur_box = Box::new(self.heur);
model.include_heur(
&name,
&desc,
self.priority,
dispchar,
self.freq,
self.freqofs,
self.maxdepth,
timing,
self.usessubscip,
heur_box,
);
}
}