use crate::*;
use std::ops::AddAssign;
#[derive(Debug, Default)]
pub struct Model {
pub vars: Vec<Var>,
pub constraints: Vec<Constraint>,
pub objective: Option<Objective>,
}
impl Model {
pub fn new() -> Self {
Self { ..Default::default() }
}
pub fn shape(&self) -> (usize, usize) {
(self.constraints.len(), self.vars.len())
}
pub fn add_var(&mut self) -> VarBuilder<'_> {
let id = VarId(self.vars.len());
self.vars.push(Var {
id,
lb: Some(0.0),
ub: None,
is_integer: false,
is_artificial: false,
});
VarBuilder { model: self, var: id }
}
pub fn add_objective(&mut self, obj: Objective) {
self.objective = Some(obj);
}
pub fn vars(&self) -> &[Var] {
&self.vars
}
pub fn constraints(&self) -> &[Constraint] {
&self.constraints
}
pub fn objective(&self) -> Option<&Objective> {
self.objective.as_ref()
}
}
impl AddAssign<Constraint> for Model {
fn add_assign(&mut self, rhs: Constraint) {
self.constraints.push(rhs);
}
}