diff --git a/src/constraints.jl b/src/constraints.jl index 9b49a9903a6..7564defba18 100644 --- a/src/constraints.jl +++ b/src/constraints.jl @@ -134,8 +134,19 @@ end Get a constraint's name attribute. """ -function name(con_ref::ConstraintRef{<:AbstractModel,<:_MOICON}) - return MOI.get(con_ref.model, MOI.ConstraintName(), con_ref)::String +function name(con_ref::ConstraintRef{<:AbstractModel,C}) where {C<:_MOICON} + model = owner_model(con_ref) + if !MOI.supports(backend(model), MOI.ConstraintName(), C) + return "" + end + return MOI.get(model, MOI.ConstraintName(), con_ref)::String +end + +# The name of VariableIndex constraints is empty. +function name( + ::ConstraintRef{<:AbstractModel,<:MOI.ConstraintIndex{MOI.VariableIndex}}, +) + return "" end """ @@ -554,8 +565,10 @@ function add_constraint( model.shapes[cindex] = cshape end con_ref = ConstraintRef(model, cindex, cshape) - if !(func isa MOI.VariableIndex) && !isempty(name) - # Don't set names for VariableIndex constraints! + # Only set names if appropriate! + if !(func isa MOI.VariableIndex) && + !isempty(name) && + MOI.supports(backend(model), MOI.ConstraintName(), typeof(cindex)) set_name(con_ref, name) end return con_ref diff --git a/src/variables.jl b/src/variables.jl index 1a3959fd6cb..daf349691b4 100644 --- a/src/variables.jl +++ b/src/variables.jl @@ -355,7 +355,13 @@ end Get a variable's name attribute. """ -name(v::VariableRef) = MOI.get(owner_model(v), MOI.VariableName(), v)::String +function name(v::VariableRef) + model = owner_model(v) + if !MOI.supports(backend(model), MOI.VariableName(), MOI.VariableIndex) + return "" + end + return MOI.get(model, MOI.VariableName(), v)::String +end """ set_name(v::VariableRef, s::AbstractString) @@ -1021,7 +1027,8 @@ function _moi_add_variable(moi_backend, model, v::ScalarVariable, name::String) index = MOI.add_variable(moi_backend) var_ref = VariableRef(model, index) _moi_constrain_variable(moi_backend, index, v.info) - if !isempty(name) + if !isempty(name) && + MOI.supports(moi_backend, MOI.VariableName(), MOI.VariableIndex) set_name(var_ref, name) end return var_ref diff --git a/test/constraint.jl b/test/constraint.jl index a638154ec1e..5b8c26d98c9 100644 --- a/test/constraint.jl +++ b/test/constraint.jl @@ -986,6 +986,33 @@ function test_constraint_inference(ModelType, ::Any) @test obj.set == MOI.LessThan(1.0) end +struct _UnsupportedConstraintName <: MOI.AbstractOptimizer end +MOI.add_variable(::_UnsupportedConstraintName) = MOI.VariableIndex(1) +function MOI.supports_constraint( + ::_UnsupportedConstraintName, + ::Type{MOI.VectorOfVariables}, + ::Type{MOI.SOS1{Float64}}, +) + return true +end +function MOI.add_constraint( + ::_UnsupportedConstraintName, + ::MOI.VectorOfVariables, + ::MOI.SOS1{Float64}, +) + return MOI.ConstraintIndex{MOI.VectorOfVariables,MOI.SOS1{Float64}}(1) +end +MOI.is_empty(::_UnsupportedConstraintName) = true + +function test_Model_unsupported_ConstraintName(::Any, ::Any) + model = direct_model(_UnsupportedConstraintName()) + @variable(model, x) + @constraint(model, c, [x, x] in SOS1()) + @test c isa ConstraintRef + @test name(c) == "" + return +end + function runtests() for name in names(@__MODULE__; all = true) if !startswith("$(name)", "test_") diff --git a/test/variable.jl b/test/variable.jl index ab1d3347363..83550a7bfa7 100644 --- a/test/variable.jl +++ b/test/variable.jl @@ -990,6 +990,18 @@ function test_Model_inf_fixed(::Any, ::Any) end end +struct _UnsupportedVariableName <: MOI.AbstractOptimizer end +MOI.add_variable(::_UnsupportedVariableName) = MOI.VariableIndex(1) +MOI.is_empty(::_UnsupportedVariableName) = true + +function test_Model_unsupported_VariableName(::Any, ::Any) + model = direct_model(_UnsupportedVariableName()) + @variable(model, x) + @test x isa VariableRef + @test name(x) == "" + return +end + function runtests() for name in names(@__MODULE__; all = true) if !startswith("$(name)", "test_")