use crate::builder::CanBeAddedToModel;
use crate::{Model, ProblemCreated, Separator};
pub struct SepaBuilder<S: Separator> {
name: Option<String>,
desc: Option<String>,
priority: i32,
freq: i32,
maxbounddist: f64,
usesubscip: bool,
delay: bool,
sepa: S,
}
impl<S: Separator> SepaBuilder<S> {
pub fn new(sepa: S) -> SepaBuilder<S> {
SepaBuilder {
name: None,
desc: None,
priority: 100000,
freq: 1,
maxbounddist: 1.0,
usesubscip: false,
delay: false,
sepa,
}
}
}
pub fn sepa<S: Separator>(sepa: S) -> SepaBuilder<S> {
SepaBuilder::new(sepa)
}
impl<S: Separator> SepaBuilder<S> {
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 freq(mut self, freq: i32) -> Self {
self.freq = freq;
self
}
pub fn maxbounddist(mut self, maxbounddist: f64) -> Self {
self.maxbounddist = maxbounddist;
self
}
pub fn usesubscip(mut self, usesubscip: bool) -> Self {
self.usesubscip = usesubscip;
self
}
pub fn delay(mut self, delay: bool) -> Self {
self.delay = delay;
self
}
}
impl<S: Separator + 'static> CanBeAddedToModel<ProblemCreated> for SepaBuilder<S> {
type Return = ();
fn add(self, model: &mut Model<ProblemCreated>) {
let name = self.name.clone().unwrap_or("".into());
let desc = self.desc.clone().unwrap_or("".into());
let sepa = self.sepa;
let sepa = Box::new(sepa);
model.include_separator(
&name,
&desc,
self.priority,
self.freq,
self.maxbounddist,
self.usesubscip,
self.delay,
sepa,
);
}
}