Skip to content

Commit 4e249f1

Browse files
committed
Add tests for solve failures in Chalmet
1 parent b4c016a commit 4e249f1

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

src/algorithms/Chalmet.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ function minimize_multiobjective!(algorithm::Chalmet, model::Optimizer)
6767
MOI.LessThan(y1[2]),
6868
)
6969
MOI.optimize!(model.inner)
70+
status = MOI.get(model.inner, MOI.TerminationStatus())
71+
if !_is_scalar_status_optimal(status)
72+
return status, nothing
73+
end
7074
x1, y1[1] = _compute_point(model, variables, f1)
7175
MOI.delete(model.inner, y1_constraint)
7276
push!(solutions, SolutionPoint(x1, y1))
@@ -87,6 +91,10 @@ function minimize_multiobjective!(algorithm::Chalmet, model::Optimizer)
8791
MOI.LessThan(y2[1]),
8892
)
8993
MOI.optimize!(model.inner)
94+
status = MOI.get(model.inner, MOI.TerminationStatus())
95+
if !_is_scalar_status_optimal(status)
96+
return status, nothing
97+
end
9098
x2, y2[2] = _compute_point(model, variables, f2)
9199
MOI.delete(model.inner, y2_constraint)
92100
push!(solutions, SolutionPoint(x2, y2))

test/algorithms/Chalmet.jl

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,70 @@ function test_single_point()
253253
return
254254
end
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+
256320
end # module TestChalmet
257321

258322
TestChalmet.run_tests()

0 commit comments

Comments
 (0)