diff --git a/src/Bridges/Variable/bridges/ParameterToEqualToBridge.jl b/src/Bridges/Variable/bridges/ParameterToEqualToBridge.jl index d740e61033..61f8205bce 100644 --- a/src/Bridges/Variable/bridges/ParameterToEqualToBridge.jl +++ b/src/Bridges/Variable/bridges/ParameterToEqualToBridge.jl @@ -58,3 +58,29 @@ function MOI.Bridges.inverse_adjoint_map_function( ) return f end + +function MOI.supports( + ::MOI.ModelLike, + ::MOI.VariableName, + ::Type{<:ParameterToEqualToBridge}, +) + return true +end + +function MOI.get( + model::MOI.ModelLike, + attr::MOI.VariableName, + bridge::ParameterToEqualToBridge, +) + return MOI.get(model, attr, bridge.variable) +end + +function MOI.set( + model::MOI.ModelLike, + attr::MOI.VariableName, + bridge::ParameterToEqualToBridge, + name::String, +) + MOI.set(model, attr, bridge.variable, name) + return +end diff --git a/src/Bridges/bridge_optimizer.jl b/src/Bridges/bridge_optimizer.jl index 02598ff409..5e59dc391c 100644 --- a/src/Bridges/bridge_optimizer.jl +++ b/src/Bridges/bridge_optimizer.jl @@ -1751,6 +1751,10 @@ function MOI.get( vi::MOI.VariableIndex, ) if is_bridged(b, vi) + bridge_ = bridge(b, vi) + if MOI.supports(b, MOI.VariableName(), typeof(bridge_)) + return MOI.get(b, MOI.VariableName(), bridge_) + end return get(b.var_to_name, vi, "") else return MOI.get(b.model, attr, vi) @@ -1764,8 +1768,13 @@ function MOI.set( name::String, ) if is_bridged(b, vi) - b.var_to_name[vi] = name - b.name_to_var = nothing # Invalidate the name map. + bridge_ = bridge(b, vi) + if MOI.supports(b, MOI.VariableName(), typeof(bridge_)) + MOI.set(b, MOI.VariableName(), bridge_, name) + else + b.var_to_name[vi] = name + b.name_to_var = nothing # Invalidate the name map. + end else MOI.set(b.model, attr, vi, name) end diff --git a/test/Bridges/bridge_optimizer.jl b/test/Bridges/bridge_optimizer.jl index 4a4c1a3c04..3e23366a49 100644 --- a/test/Bridges/bridge_optimizer.jl +++ b/test/Bridges/bridge_optimizer.jl @@ -1570,6 +1570,28 @@ function test_issue_2817c() return end +function test_issue_2762_success() + inner = MOI.Utilities.Model{Float64}() + model = MOI.Bridges.Variable.ParameterToEqualTo{Float64}(inner) + p, _ = MOI.add_constrained_variable(model, MOI.Parameter(1.0)) + MOI.set(model, MOI.VariableName(), p, "p") + @test MOI.get(model, MOI.VariableName(), p) == "p" + x = only(MOI.get(inner, MOI.ListOfVariableIndices())) + @test MOI.get(inner, MOI.VariableName(), x) == "p" + return +end + +function test_issue_2762_fail() + inner = MOI.Utilities.Model{Float64}() + model = MOI.Bridges.Variable.NonposToNonneg{Float64}(inner) + y, _ = MOI.add_constrained_variables(model, MOI.Nonpositives(2)) + MOI.set(model, MOI.VariableName(), y[1], "y1") + @test MOI.get(model, MOI.VariableName(), y[1]) == "y1" + x = MOI.get(inner, MOI.ListOfVariableIndices()) + @test all(isempty, MOI.get(inner, MOI.VariableName(), x)) + return +end + end # module TestBridgeOptimizer.runtests()