diff --git a/src/MOI_wrapper.jl b/src/MOI_wrapper.jl index b5302628..a3c8aa63 100644 --- a/src/MOI_wrapper.jl +++ b/src/MOI_wrapper.jl @@ -323,6 +323,22 @@ function MOI.supports( return MOI.supports(model.optimizer, attr, tp) end +function MOI.get( + model::Optimizer, + attr::MOI.VariablePrimalStart, + v::MOI.VariableIndex, +) + if _variable_in_model(model, v) + return MOI.get(model.optimizer, attr, v) + elseif _parameter_in_model(model, v) + # this is effectivelly a no-op, but we do validation + _val = model.parameters[p_idx(v)] + return _val + else + error("Variable not in the model") + end +end + function MOI.set( model::Optimizer, attr::MOI.VariablePrimalStart, @@ -413,17 +429,25 @@ end function MOI.is_valid( model::Optimizer, c::MOI.ConstraintIndex{F,S}, -) where { - F<:Union{MOI.VariableIndex,MOI.VectorOfVariables,MOI.VectorAffineFunction}, - S<:MOI.AbstractSet, -} +) where {F<:Union{MOI.VariableIndex,MOI.VectorOfVariables},S<:MOI.AbstractSet} return MOI.is_valid(model.optimizer, c) end function MOI.is_valid( model::Optimizer, c::MOI.ConstraintIndex{F,S}, -) where {F<:MOI.ScalarAffineFunction,S<:MOI.AbstractSet} +) where { + F<:Union{ + MOI.ScalarAffineFunction, + MOI.ScalarQuadraticFunction, + MOI.VectorAffineFunction, + MOI.VectorQuadraticFunction, + }, + S<:MOI.AbstractSet, +} + if haskey(model.constraint_outer_to_inner, c) + return true + end return MOI.is_valid(model.optimizer, c) end diff --git a/test/jump_tests.jl b/test/jump_tests.jl index 807ca42a..9859c9dc 100644 --- a/test/jump_tests.jl +++ b/test/jump_tests.jl @@ -427,11 +427,10 @@ function test_jump_set_variable_start_value() @variable(model, p in MOI.Parameter(0.0)) set_start_value(x, 1.0) @test start_value(x) == 1 - err = ErrorException( - "MathOptInterface.VariablePrimalStart() is not supported for parameters", - ) - @test_throws err set_start_value(p, 1.0) - @test_throws err start_value(p) + @test_throws ErrorException( + "The parameter $(index(p)) value is 0.0, but trying to set VariablePrimalStart 1.0", + ) set_start_value(p, 1.0) + @test start_value(p) == 0.0 return end