Skip to content

Commit 72b2cda

Browse files
committed
Enable adding iterators of objects too
1 parent 4c53929 commit 72b2cda

File tree

1 file changed

+44
-2
lines changed

1 file changed

+44
-2
lines changed

src/builder.rs

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,18 @@ pub trait CanBeAddedToModel {
55
/// The return type after adding to the model (e.g. `Variable` / `Constraint` ).
66
type Return;
77
/// How to add the value to the model.
8-
fn add(&self, model: &mut Model<ProblemCreated>) -> Self::Return;
8+
fn add(self, model: &mut Model<ProblemCreated>) -> Self::Return;
9+
}
10+
11+
impl<T, I> CanBeAddedToModel for I
12+
where
13+
T: CanBeAddedToModel,
14+
I: IntoIterator<Item = T>,
15+
{
16+
type Return = Vec<T::Return>;
17+
fn add(self, model: &mut Model<ProblemCreated>) -> Self::Return {
18+
self.into_iter().map(|x| x.add(model)).collect()
19+
}
920
}
1021

1122
/// A builder for variables.
@@ -77,7 +88,7 @@ impl VarBuilder {
7788

7889
impl CanBeAddedToModel for VarBuilder {
7990
type Return = Variable;
80-
fn add(&self, model: &mut Model<ProblemCreated>) -> Variable {
91+
fn add(self, model: &mut Model<ProblemCreated>) -> Variable {
8192
let name = self.name.clone().unwrap_or_else(|| {
8293
let n_vars = model.n_vars();
8394
format!("x{}", n_vars)
@@ -124,4 +135,35 @@ mod tests {
124135
assert_eq!(solved.status(), crate::Status::Optimal);
125136
assert_eq!(solved.obj_val(), 1.0);
126137
}
138+
139+
#[test]
140+
fn test_var_add_all() {
141+
let mut model = Model::default().set_obj_sense(crate::ObjSense::Maximize);
142+
let vars = vec![
143+
VarBuilder::default()
144+
.name("1".to_string())
145+
.obj(1.0)
146+
.continuous(0.0, 1.0),
147+
VarBuilder::default()
148+
.name("2".to_string())
149+
.obj(1.0)
150+
.continuous(0.0, 1.0),
151+
VarBuilder::default()
152+
.name("3".to_string())
153+
.obj(1.0)
154+
.continuous(0.0, 1.0),
155+
];
156+
157+
let vars = model.add(vars);
158+
for (i, var) in vars.iter().enumerate() {
159+
assert_eq!(var.name(), (i + 1).to_string());
160+
assert_eq!(var.obj(), 1.0);
161+
assert_eq!(var.lb(), 0.0);
162+
assert_eq!(var.ub(), 1.0);
163+
}
164+
165+
let solved = model.solve();
166+
assert_eq!(solved.status(), crate::Status::Optimal);
167+
assert_eq!(solved.obj_val(), 3.0);
168+
}
127169
}

0 commit comments

Comments
 (0)