From 0b468cee7f90f2c4d14644ffb0673acaafad35b4 Mon Sep 17 00:00:00 2001 From: odow Date: Wed, 20 Aug 2025 10:21:13 +1200 Subject: [PATCH 1/5] [Bridges] pass variable names through ParameterToEqualToBridge --- src/Bridges/bridge_optimizer.jl | 19 +++++++++++++++++++ test/Bridges/bridge_optimizer.jl | 22 ++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/Bridges/bridge_optimizer.jl b/src/Bridges/bridge_optimizer.jl index 02598ff409..a92e219b44 100644 --- a/src/Bridges/bridge_optimizer.jl +++ b/src/Bridges/bridge_optimizer.jl @@ -1757,6 +1757,20 @@ function MOI.get( end end +function _get_variable_if_equivalent(b, x) + return _get_variable_if_equivalent(bridged_variable_function(b, x)) +end + +function _get_variable_if_equivalent(f::MOI.ScalarAffineFunction) + if length(f.terms) == 1 + term = only(f.terms) + if isone(term.coefficient) + return term.variable + end + end + return nothing +end + function MOI.set( b::AbstractBridgeOptimizer, attr::MOI.VariableName, @@ -1766,6 +1780,11 @@ function MOI.set( if is_bridged(b, vi) b.var_to_name[vi] = name b.name_to_var = nothing # Invalidate the name map. + # Set the internal variable name iff the bridged variable is equivalent + # to `y := 1 * x`. + if (x = _get_variable_if_equivalent(b, vi)) !== nothing + MOI.set(b.model, attr, x, name) + 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() From ae3fe046e61f32e405fc094721451d1a4c712c66 Mon Sep 17 00:00:00 2001 From: odow Date: Wed, 20 Aug 2025 11:25:21 +1200 Subject: [PATCH 2/5] Update --- src/Bridges/bridge_optimizer.jl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Bridges/bridge_optimizer.jl b/src/Bridges/bridge_optimizer.jl index a92e219b44..647a1b1a24 100644 --- a/src/Bridges/bridge_optimizer.jl +++ b/src/Bridges/bridge_optimizer.jl @@ -1758,10 +1758,10 @@ function MOI.get( end function _get_variable_if_equivalent(b, x) - return _get_variable_if_equivalent(bridged_variable_function(b, x)) + return _get_variable_if_equivalent(bridged_variable_function(b, x), x) end -function _get_variable_if_equivalent(f::MOI.ScalarAffineFunction) +function _get_variable_if_equivalent(f::MOI.ScalarAffineFunction, x) if length(f.terms) == 1 term = only(f.terms) if isone(term.coefficient) @@ -1858,6 +1858,9 @@ function MOI.get( end vi_bridged = get(b.name_to_var, name, nothing) MOI.Utilities.throw_if_multiple_with_name(vi_bridged, name) + if _get_variable_if_equivalent(b, vi_bridged) !== nothing + return vi_bridged + end return MOI.Utilities.check_type_and_multiple_names( MOI.VariableIndex, vi_bridged, From 7e3c6b3828b8c7002a56ee58492e883988a82fd2 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Wed, 20 Aug 2025 14:30:22 +1200 Subject: [PATCH 3/5] Update src/Bridges/bridge_optimizer.jl --- src/Bridges/bridge_optimizer.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Bridges/bridge_optimizer.jl b/src/Bridges/bridge_optimizer.jl index 647a1b1a24..3a47b9dda8 100644 --- a/src/Bridges/bridge_optimizer.jl +++ b/src/Bridges/bridge_optimizer.jl @@ -1761,6 +1761,8 @@ function _get_variable_if_equivalent(b, x) return _get_variable_if_equivalent(bridged_variable_function(b, x), x) end +_get_variable_if_equivalent(b, ::Nothing) = nothing + function _get_variable_if_equivalent(f::MOI.ScalarAffineFunction, x) if length(f.terms) == 1 term = only(f.terms) From a2489735c4e8e6866e7262907dbf10bc0a852de6 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Wed, 20 Aug 2025 14:35:48 +1200 Subject: [PATCH 4/5] Update bridge_optimizer.jl --- src/Bridges/bridge_optimizer.jl | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Bridges/bridge_optimizer.jl b/src/Bridges/bridge_optimizer.jl index 3a47b9dda8..56595bad14 100644 --- a/src/Bridges/bridge_optimizer.jl +++ b/src/Bridges/bridge_optimizer.jl @@ -1757,13 +1757,19 @@ function MOI.get( end end -function _get_variable_if_equivalent(b, x) +function _get_variable_if_equivalent( + b::AbstractBridgeOptimizer, + x::VariableIndex, +) return _get_variable_if_equivalent(bridged_variable_function(b, x), x) end -_get_variable_if_equivalent(b, ::Nothing) = nothing +_get_variable_if_equivalent(::AbstractBridgeOptimizer, ::Nothing) = nothing -function _get_variable_if_equivalent(f::MOI.ScalarAffineFunction, x) +function _get_variable_if_equivalent( + f::MOI.ScalarAffineFunction, + x::MOI.VariableIndex, +) if length(f.terms) == 1 term = only(f.terms) if isone(term.coefficient) From a72cc0cfb311775d69fe376d16005711f750d527 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Wed, 20 Aug 2025 14:40:16 +1200 Subject: [PATCH 5/5] Update src/Bridges/bridge_optimizer.jl --- src/Bridges/bridge_optimizer.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Bridges/bridge_optimizer.jl b/src/Bridges/bridge_optimizer.jl index 56595bad14..951240e017 100644 --- a/src/Bridges/bridge_optimizer.jl +++ b/src/Bridges/bridge_optimizer.jl @@ -1759,7 +1759,7 @@ end function _get_variable_if_equivalent( b::AbstractBridgeOptimizer, - x::VariableIndex, + x::MOI.VariableIndex, ) return _get_variable_if_equivalent(bridged_variable_function(b, x), x) end