use crate::LinExpr;
use std::fmt::Display;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum Sense {
Minimize,
Maximize,
}
#[derive(Clone, Debug)]
pub struct Objective {
pub sense: Sense,
pub expr: LinExpr,
pub name: Option<String>,
pub priority: Option<u32>,
}
pub struct ObjectiveBuilder {
objective: Objective,
}
impl ObjectiveBuilder {
pub fn priority(mut self, p: u32) -> Self {
self.objective.priority = Some(p);
unimplemented!(
"Multi-objective optimization is not yet implemented, so priority has no effect"
);
}
pub fn name<S: Into<String>>(mut self, name: S) -> Objective {
self.objective.name = Some(name.into());
self.objective
}
}
impl Objective {
pub fn minimize(expr: LinExpr) -> ObjectiveBuilder {
ObjectiveBuilder {
objective: Objective {
sense: Sense::Minimize,
expr,
name: None,
priority: None,
},
}
}
pub fn maximize(expr: LinExpr) -> ObjectiveBuilder {
ObjectiveBuilder {
objective: Objective {
sense: Sense::Maximize,
expr,
name: None,
priority: None,
},
}
}
}
impl Display for Objective {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let sense_str = match self.sense {
Sense::Minimize => "Minimize",
Sense::Maximize => "Maximize",
};
if let Some(name) = &self.name {
write!(f, "{} {}: {}", sense_str, name, self.expr)
} else {
write!(f, "{}: {}", sense_str, self.expr)
}
}
}