11import unittest
2- from pyscipopt import Model
2+ from pyscipopt import Model , quicksum , Expr
3+
34
45class ReoptimizationTest (unittest .TestCase ):
56
67 def test_reopt (self ):
7-
8+ """Test basic reoptimization."""
89 m = Model ()
910 m .enableReoptimization ()
1011
1112 x = m .addVar (name = "x" , ub = 5 )
1213 y = m .addVar (name = "y" , lb = - 2 , ub = 10 )
1314
14-
1515 m .addCons (2 * x + y >= 8 )
1616 m .setObjective (x + y )
1717 m .optimize ()
@@ -31,6 +31,70 @@ def test_reopt(self):
3131 self .assertEqual (m .getVal (x ), 3.0 )
3232 self .assertEqual (m .getVal (y ), 3.0 )
3333
34+ def test_reopt_maximize (self ):
35+ """Test reoptimization with maximize sense."""
36+ m = Model ()
37+ m .enableReoptimization ()
38+ m .hideOutput ()
39+
40+ x = m .addVar (name = "x" , lb = 0 , ub = 10 )
41+ y = m .addVar (name = "y" , lb = 0 , ub = 10 )
42+
43+ m .addCons (x + y <= 15 )
44+ m .setObjective (x + y , sense = "maximize" )
45+ m .optimize ()
46+
47+ self .assertAlmostEqual (m .getObjVal (), 15.0 )
48+
49+ m .freeReoptSolve ()
50+ m .chgReoptObjective (x , sense = "maximize" )
51+ m .optimize ()
52+
53+ self .assertAlmostEqual (m .getVal (x ), 10.0 )
54+
55+ def test_reopt_many_variables_sparse_objective (self ):
56+ """Test with many variables but only few in the new objective."""
57+ m = Model ()
58+ m .enableReoptimization ()
59+ m .hideOutput ()
60+
61+ n_vars = 100
62+ vars = [m .addVar (name = f"x_{ i } " , lb = 0 , ub = 10 ) for i in range (n_vars )]
63+
64+ m .addCons (quicksum (vars ) >= 50 )
65+ m .setObjective (quicksum (vars ))
66+ m .optimize ()
67+
68+ m .freeReoptSolve ()
69+ m .chgReoptObjective (vars [0 ] + vars [50 ] + vars [99 ])
70+ m .optimize ()
71+
72+ self .assertAlmostEqual (m .getVal (vars [0 ]), 0.0 )
73+ self .assertAlmostEqual (m .getVal (vars [50 ]), 0.0 )
74+ self .assertAlmostEqual (m .getVal (vars [99 ]), 0.0 )
75+
76+ def test_reopt_zero_objective (self ):
77+ """Test reoptimization with zero objective (no variables, all coefficients zero)."""
78+ m = Model ()
79+ m .enableReoptimization ()
80+ m .hideOutput ()
81+
82+ x = m .addVar (name = "x" , lb = 0 , ub = 10 )
83+ y = m .addVar (name = "y" , lb = 0 , ub = 10 )
84+
85+ m .addCons (x + y >= 5 )
86+ m .setObjective (x + y )
87+ m .optimize ()
88+
89+ self .assertAlmostEqual (m .getObjVal (), 5.0 )
90+
91+ m .freeReoptSolve ()
92+ m .chgReoptObjective (Expr ())
93+ m .optimize ()
94+
95+ self .assertGreaterEqual (m .getVal (x ) + m .getVal (y ), 5.0 )
96+ self .assertAlmostEqual (m .getObjVal (), 0.0 )
97+
3498
3599if __name__ == '__main__' :
36100 unittest .main ()
0 commit comments