|
58 | 58 | ] |
59 | 59 | nlp_solvers = [('ipopt', Ipopt)] |
60 | 60 | qcp_solvers = [('gurobi', GurobiPersistent), ('ipopt', Ipopt)] |
| 61 | +qp_solvers = qcp_solvers + [("highs", Highs)] |
61 | 62 | miqcqp_solvers = [('gurobi', GurobiPersistent)] |
62 | 63 | nl_solvers = [('ipopt', Ipopt)] |
63 | 64 | nl_solvers_set = {i[0] for i in nl_solvers} |
@@ -1097,7 +1098,7 @@ def test_mutable_quadratic_coefficient( |
1097 | 1098 | self.assertAlmostEqual(m.y.value, 0.0869525991355825, 4) |
1098 | 1099 |
|
1099 | 1100 | @parameterized.expand(input=_load_tests(qcp_solvers)) |
1100 | | - def test_mutable_quadratic_objective( |
| 1101 | + def test_mutable_quadratic_objective_qcp( |
1101 | 1102 | self, name: str, opt_class: Type[SolverBase], use_presolve: bool |
1102 | 1103 | ): |
1103 | 1104 | opt: SolverBase = opt_class() |
@@ -1128,6 +1129,44 @@ def test_mutable_quadratic_objective( |
1128 | 1129 | self.assertAlmostEqual(m.x.value, 0.6962249634573562, 4) |
1129 | 1130 | self.assertAlmostEqual(m.y.value, 0.09227926676152151, 4) |
1130 | 1131 |
|
| 1132 | + @parameterized.expand(input=_load_tests(qp_solvers)) |
| 1133 | + def test_mutable_quadratic_objective_qp( |
| 1134 | + self, name: str, opt_class: Type[SolverBase], use_presolve: bool |
| 1135 | + ): |
| 1136 | + opt: SolverBase = opt_class() |
| 1137 | + if not opt.available(): |
| 1138 | + raise unittest.SkipTest(f'Solver {opt.name} not available.') |
| 1139 | + if any(name.startswith(i) for i in nl_solvers_set): |
| 1140 | + if use_presolve: |
| 1141 | + opt.config.writer_config.linear_presolve = True |
| 1142 | + else: |
| 1143 | + opt.config.writer_config.linear_presolve = False |
| 1144 | + # test issue #3381 |
| 1145 | + m = pyo.ConcreteModel() |
| 1146 | + |
| 1147 | + m.x1 = pyo.Var(name='x1', domain=pyo.Reals) |
| 1148 | + m.x2 = pyo.Var(name='x2', domain=pyo.Reals) |
| 1149 | + |
| 1150 | + m.p = pyo.Param(initialize=1, mutable=True) |
| 1151 | + |
| 1152 | + m.obj = pyo.Objective( |
| 1153 | + expr=m.p * m.x1 * m.x1 + m.x2 * m.x2 - m.x1 * m.x2, sense=pyo.minimize |
| 1154 | + ) |
| 1155 | + |
| 1156 | + m.con1 = pyo.Constraint(expr=m.x1 >= 1) |
| 1157 | + m.con2 = pyo.Constraint(expr=m.x2 >= 1) |
| 1158 | + |
| 1159 | + results = opt.solve(m) |
| 1160 | + self.assertAlmostEqual(m.x1.value, 1, places=4) |
| 1161 | + self.assertAlmostEqual(m.x2.value, 1, places=4) |
| 1162 | + self.assertAlmostEqual(results.incumbent_objective, 1, 4) |
| 1163 | + |
| 1164 | + m.p.value = 2.0 |
| 1165 | + results = opt.solve(m) |
| 1166 | + self.assertAlmostEqual(m.x1.value, 1, places=4) |
| 1167 | + self.assertAlmostEqual(m.x2.value, 1, places=4) |
| 1168 | + self.assertAlmostEqual(results.incumbent_objective, 2, 4) |
| 1169 | + |
1131 | 1170 | @parameterized.expand(input=_load_tests(all_solvers)) |
1132 | 1171 | def test_fixed_vars( |
1133 | 1172 | self, name: str, opt_class: Type[SolverBase], use_presolve: bool |
|
0 commit comments