From 812ffd313a6152681a8813481de7008faf3bddd3 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Sun, 7 Feb 2021 16:42:02 +1300 Subject: [PATCH] Fix handling of solution statuses for multiple results (#393) --- Project.toml | 2 +- src/MOI_wrapper.jl | 13 ++++++++----- test/MOI/MOI_wrapper.jl | 4 ++++ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Project.toml b/Project.toml index 33694f41..be213bbe 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "Gurobi" uuid = "2e9cd046-0924-5485-92f1-d5272153d98b" repo = "https://github.com/jump-dev/Gurobi.jl" -version = "0.9.8" +version = "0.9.9" [deps] CEnum = "fa961155-64e5-5f13-b03f-caf6b980ea82" diff --git a/src/MOI_wrapper.jl b/src/MOI_wrapper.jl index e7cc4d9b..9e6d81d1 100644 --- a/src/MOI_wrapper.jl +++ b/src/MOI_wrapper.jl @@ -2474,21 +2474,22 @@ end function MOI.get(model::Optimizer, attr::MOI.PrimalStatus) _throw_if_optimize_in_progress(model, attr) - if attr.N != 1 - return MOI.NO_SOLUTION - end term = MOI.get(model, MOI.TerminationStatus()) if term == MOI.DUAL_INFEASIBLE || term == MOI.INFEASIBLE_OR_UNBOUNDED - if _has_primal_ray(model) + if attr.N != 1 + return MOI.NO_SOLUTION + elseif _has_primal_ray(model) return MOI.INFEASIBILITY_CERTIFICATE else return MOI.NO_SOLUTION end end + # Check SolCount explicitly instead of ResultCount to avoid returning 1 when + # there is a certiticate. valueP = Ref{Cint}() ret = GRBgetintattr(model, "SolCount", valueP) _check_ret(model, ret) - return valueP[] > 0 ? MOI.FEASIBLE_POINT : MOI.NO_SOLUTION + return 1 <= attr.N <= valueP[] ? MOI.FEASIBLE_POINT : MOI.NO_SOLUTION end function _has_dual_ray(model::Optimizer) @@ -2519,6 +2520,8 @@ function MOI.get(model::Optimizer, attr::MOI.DualStatus) return MOI.NO_SOLUTION end end + # Check SolCount explicitly instead of ResultCount to avoid returning 1 when + # there is a certiticate. valueP = Ref{Cint}() ret = GRBgetintattr(model, "SolCount", valueP) _check_ret(model, ret) diff --git a/test/MOI/MOI_wrapper.jl b/test/MOI/MOI_wrapper.jl index 9961df1b..bdc56136 100644 --- a/test/MOI/MOI_wrapper.jl +++ b/test/MOI/MOI_wrapper.jl @@ -1572,6 +1572,8 @@ function test_multiple_solutions() MOI.ResultIndexBoundsError, MOI.get(model, MOI.ObjectiveValue(n)), ) + @test MOI.get(model, MOI.PrimalStatus(n)) == MOI.NO_SOLUTION + @test MOI.get(model, MOI.DualStatus(n)) == MOI.NO_SOLUTION end for n = 1:RC xn = MOI.get(model, MOI.VariablePrimal(n), x) @@ -1581,6 +1583,8 @@ function test_multiple_solutions() item_values' * xn, atol=1e-6, ) + @test MOI.get(model, MOI.PrimalStatus(n)) == MOI.FEASIBLE_POINT + @test MOI.get(model, MOI.DualStatus(n)) == MOI.NO_SOLUTION end end