@@ -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
7889impl 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