From ac50cb2712ce5a03c8ebc3b2b43083337919d1a1 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Mon, 13 Apr 2026 13:03:51 +1200 Subject: [PATCH 1/3] Use SCS in test_iis_spare_scs --- test/runtests.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runtests.jl b/test/runtests.jl index 9d49fce..377d6c6 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -569,7 +569,7 @@ function test_iis_spare_scs() optimize!(model) solver = MathOptIIS.Optimizer() MOI.set(solver, MathOptIIS.InfeasibleModel(), backend(model)) - MOI.set(solver, MathOptIIS.InnerOptimizer(), HiGHS.Optimizer) + MOI.set(solver, MathOptIIS.InnerOptimizer(), SCS.Optimizer) MOI.compute_conflict!(solver) data = solver.results @test length(data) == 1 From 626618c475cdb26036dc7e2614fe857f8a485e31 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Mon, 13 Apr 2026 13:37:52 +1200 Subject: [PATCH 2/3] Update --- src/MathOptIIS.jl | 3 +++ test/runtests.jl | 16 ++++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/MathOptIIS.jl b/src/MathOptIIS.jl index b769d97..0f1d509 100644 --- a/src/MathOptIIS.jl +++ b/src/MathOptIIS.jl @@ -1004,6 +1004,9 @@ function _dual_certificate!( ) for (F, S) in MOI.get(model, MOI.ListOfConstraintTypesPresent()) for ci in MOI.get(model, MOI.ListOfConstraintIndices{F,S}()) + # This iszero check here is rather tight. We may want to consider + # relaxing it for solvers like SCS that have some tolerance for what + # is a certificate. if !iszero(MOI.get(model, MOI.ConstraintDual(), ci)) push!(dual_certificate, ci) end diff --git a/test/runtests.jl b/test/runtests.jl index 377d6c6..c41bc8e 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -570,15 +570,19 @@ function test_iis_spare_scs() solver = MathOptIIS.Optimizer() MOI.set(solver, MathOptIIS.InfeasibleModel(), backend(model)) MOI.set(solver, MathOptIIS.InnerOptimizer(), SCS.Optimizer) + MOI.set(solver, MOI.Silent(), false) MOI.compute_conflict!(solver) - data = solver.results - @test length(data) == 1 - @test data[1].metadata === nothing - @test _isequal_unordered(data[].constraints, [index(c2), index(c1)]) + data = only(solver.results) + @test data.metadata === nothing + @test _isequal_unordered(data.constraints, [index(c2), index(c1)]) result = Dict(c1 => MOI.IN_CONFLICT, c2 => MOI.IN_CONFLICT) for ci in all_constraints(model; include_variable_in_set_constraints = true) - @test MOI.get(solver, MOI.ConstraintConflictStatus(), index(ci)) == - get(result, ci, MOI.NOT_IN_CONFLICT) + stat = MOI.get(solver, MOI.ConstraintConflictStatus(), index(ci)) + if haskey(result, ci) + @test stat == result[ci] + else + @test stat != MOI.IN_CONFLICT + end end return end From 7373703e3131493def48bc1c2b2683a6bc1b4e1e Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Mon, 13 Apr 2026 13:48:22 +1200 Subject: [PATCH 3/3] Update --- test/runtests.jl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/runtests.jl b/test/runtests.jl index c41bc8e..4e4d05d 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1161,7 +1161,11 @@ function test_time_limit_interrupt() F, S = MOI.ScalarAffineFunction{Float64}, MOI.EqualTo{Float64} # We've set N such that it cannot find the full IIS in the time # allowed. - @test MOI.get(iis, MOI.NumberOfConstraints{F,S}()) > 8 + if N < 16 + @test MOI.get(iis, MOI.NumberOfConstraints{F,S}()) > 8 + else + @test MOI.get(iis, MOI.NumberOfConstraints{F,S}()) >= 8 + end end end return