@@ -11,6 +11,7 @@ def test_getConsNVars():
1111 x [i ] = m .addVar ("%i" % i )
1212
1313 c = m .addCons (quicksum (x [i ] for i in x ) <= 10 )
14+ print (c .__hash__ ())
1415 assert m .getConsNVars (c ) == n_vars
1516
1617 m .optimize ()
@@ -117,7 +118,9 @@ def test_cons_indicator():
117118 assert c .getConshdlrName () == "indicator"
118119
119120
120- @pytest .mark .xfail (reason = "addConsIndicator doesn't behave as expected when binary variable is False. See Issue #717." )
121+ @pytest .mark .xfail (
122+ reason = "addConsIndicator doesn't behave as expected when binary variable is False. See Issue #717."
123+ )
121124def test_cons_indicator_fail ():
122125 m = Model ()
123126 binvar = m .addVar (vtype = "B" )
@@ -131,23 +134,6 @@ def test_cons_indicator_fail():
131134 m .setSolVal (sol , binvar , 0 )
132135 assert m .checkSol (sol ) # solution should be feasible
133136
134- def test_addConsDisjunction ():
135- m = Model ()
136-
137- x1 = m .addVar (vtype = "C" , lb = - 1 , ub = 1 )
138- x2 = m .addVar (vtype = "C" , lb = - 3 , ub = 3 )
139- o = m .addVar (vtype = "C" )
140-
141- c = m .addConsDisjunction ([x1 <= 0 , x2 <= 0 ])
142- m .addCons (o <= x1 + x2 )
143-
144- m .setObjective (o , "maximize" )
145- m .optimize ()
146-
147- assert m .isEQ (m .getVal (x1 ), 0.0 )
148- assert m .isEQ (m .getVal (x2 ), 3.0 )
149- assert m .isEQ (m .getVal (o ), 3.0 )
150- #assert c.getConshdlrName() == "disjunction"
151137
152138def test_addConsCardinality ():
153139 m = Model ()
@@ -170,6 +156,42 @@ def test_printCons():
170156 m .printCons (c )
171157
172158
159+ def test_addConsElemDisjunction ():
160+ m = Model ()
161+ x = m .addVar (vtype = "c" , lb = - 10 , ub = 2 )
162+ y = m .addVar (vtype = "c" , lb = - 10 , ub = 5 )
163+ o = m .addVar (vtype = "c" )
164+
165+ m .addCons (o <= (x + y ))
166+ disj_cons = m .addConsDisjunction ([])
167+ c1 = m .createExprCons (x <= 1 )
168+ c2 = m .createExprCons (x <= 0 )
169+ c3 = m .createExprCons (y <= 0 )
170+ m .addConsElemDisjunction (disj_cons , c1 )
171+ disj_cons = m .addConsElemDisjunction (disj_cons , c2 )
172+ disj_cons = m .addConsElemDisjunction (disj_cons , c3 )
173+ m .setObjective (o , "maximize" )
174+ m .optimize ()
175+ assert m .isEQ (m .getVal (x ), 1 )
176+ assert m .isEQ (m .getVal (y ), 5 )
177+ assert m .isEQ (m .getVal (o ), 6 )
178+
179+
180+ def test_addConsDisjunction_expr_init ():
181+ m = Model ()
182+ x = m .addVar (vtype = "c" , lb = - 10 , ub = 2 )
183+ y = m .addVar (vtype = "c" , lb = - 10 , ub = 5 )
184+ o = m .addVar (vtype = "c" )
185+
186+ m .addCons (o <= (x + y ))
187+ m .addConsDisjunction ([x <= 1 , x <= 0 , y <= 0 ])
188+ m .setObjective (o , "maximize" )
189+ m .optimize ()
190+ assert m .isEQ (m .getVal (x ), 1 )
191+ assert m .isEQ (m .getVal (y ), 5 )
192+ assert m .isEQ (m .getVal (o ), 6 )
193+
194+
173195@pytest .mark .skip (reason = "TODO: test getValsLinear()" )
174196def test_getValsLinear ():
175197 assert True
@@ -178,3 +200,7 @@ def test_getValsLinear():
178200@pytest .mark .skip (reason = "TODO: test getRowLinear()" )
179201def test_getRowLinear ():
180202 assert True
203+
204+
205+ if __name__ == "__main__" :
206+ test_getConsNVars ()
0 commit comments