diff --git a/src/MOI_wrapper.jl b/src/MOI_wrapper.jl index 37310f1..17dd080 100644 --- a/src/MOI_wrapper.jl +++ b/src/MOI_wrapper.jl @@ -2271,9 +2271,10 @@ function _active_bound(l, x, u, d) end elseif isfinite(l) return l - else - @assert isfinite(u) + elseif isfinite(u) return u + else + return 0.0 end end diff --git a/test/MOI_wrapper.jl b/test/MOI_wrapper.jl index 11b0482..bd272ad 100644 --- a/test/MOI_wrapper.jl +++ b/test/MOI_wrapper.jl @@ -941,11 +941,13 @@ function test_active_bound() (0.0, 1.0, 1.0, -2.0) => 1.0, (0.0, 0.6, 1.0, -2.0) => 1.0, (0.0, 0.6, 1.0, 2.0) => 1.0, # incorrect d but doesn't matter + (-Inf, 0.0, Inf, 0.0) => 0.0, # It's a ray. Choose based on sign (0.0, NaN, 1.0, 2.0) => 0.0, (0.0, NaN, 1.0, 1e-10) => 0.0, (0.0, NaN, 1.0, -2.0) => 1.0, (0.0, NaN, 1.0, -1e-10) => 1.0, + (-Inf, NaN, Inf, 0.0) => 0.0, # It's a one-sided ray (0.0, NaN, Inf, 2.0) => 0.0, (0.0, NaN, Inf, -1e-10) => 0.0, @@ -972,6 +974,18 @@ function test_add_constrained_variable_tuple() return end +function test_dual_objective_value_infeasible() + model = HiGHS.Optimizer() + x = MOI.add_variable(model) + MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) + f = 1.0 * x + MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f) + MOI.optimize!(model) + @test MOI.get(model, MOI.DualStatus()) == MOI.INFEASIBLE_POINT + @test MOI.get(model, MOI.DualObjectiveValue()) == 0.0 + return +end + end # module TestMOIHighs.runtests()