@@ -253,6 +253,70 @@ function test_single_point()
253253 return
254254end
255255
256+ function _solve_mock (mock)
257+ highs = HiGHS. Optimizer ()
258+ MOI. set (highs, MOI. Silent (), true )
259+ index_map = MOI. copy_to (highs, mock)
260+ MOI. optimize! (highs)
261+ x = [index_map[xi] for xi in MOI. get (mock, MOI. ListOfVariableIndices ())]
262+ MOI. Utilities. mock_optimize! (
263+ mock,
264+ MOI. get (highs, MOI. TerminationStatus ()),
265+ MOI. get (highs, MOI. VariablePrimal (), x),
266+ )
267+ obj = MOI. get (highs, MOI. ObjectiveValue ())
268+ MOI. set (mock, MOI. ObjectiveValue (), obj)
269+ return
270+ end
271+
272+ function mock_optimizer (fail_after:: Int )
273+ return () -> begin
274+ model = MOI. Utilities. MockOptimizer (
275+ MOI. Utilities. Model {Float64} (),
276+ )
277+ MOI. Utilities. set_mock_optimize! (
278+ model,
279+ ntuple (i -> _solve_mock, fail_after)... ,
280+ mock -> MOI. Utilities. mock_optimize! (mock, MOI. NUMERICAL_ERROR),
281+ )
282+ return model
283+ end
284+ end
285+
286+ function test_solve_failures ()
287+ m, n = 2 , 10
288+ p1 = [5.0 1 10 8 3 5 3 3 7 2 ; 10 6 1 6 8 3 2 10 6 1 ]
289+ p2 = [4.0 6 4 3 1 6 8 2 9 7 ; 8 8 8 2 4 8 8 1 10 1 ]
290+ w = [5.0 9 3 5 10 5 7 10 7 8 ; 4 8 8 6 10 8 10 7 5 1 ]
291+ b = [34.0 , 33.0 ]
292+ for fail_after in 0 : 3
293+ model = MOA. Optimizer (mock_optimizer (fail_after))
294+ MOI. set (model, MOA. Algorithm (), MOA. Chalmet ())
295+ x_ = MOI. add_variables (model, m * n)
296+ x = reshape (x_, m, n)
297+ # MOI.add_constraint.(model, x, MOI.ZeroOne())
298+ MOI. add_constraint .(model, x, MOI. Interval (0.0 , 1.0 ))
299+ f = MOI. Utilities. operate (
300+ vcat,
301+ Float64,
302+ sum (p1 .* x),
303+ sum (p2 .* x),
304+ )
305+ MOI. set (model, MOI. ObjectiveSense (), MOI. MAX_SENSE)
306+ MOI. set (model, MOI. ObjectiveFunction {typeof(f)} (), f)
307+ for i in 1 : m
308+ f_i = sum (w[i, j] * x[i, j] for j in 1 : n)
309+ MOI. add_constraint (model, f_i, MOI. LessThan (b[i]))
310+ end
311+ for j in 1 : n
312+ MOI. add_constraint (model, sum (1.0 .* x[:, j]), MOI. EqualTo (1.0 ))
313+ end
314+ MOI. optimize! (model)
315+ @test MOI. get (model, MOI. TerminationStatus ()) == MOI. NUMERICAL_ERROR
316+ end
317+ return
318+ end
319+
256320end # module TestChalmet
257321
258322TestChalmet. run_tests ()
0 commit comments