From 0aeec3402dfda05745feff4589e37ad3931c5a87 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Thu, 29 Oct 2026 21:01:31 +1300 Subject: [PATCH] Fix MOI.AbstractFunctionModification for SetDotScalingBridge --- .../Constraint/bridges/SetDotScalingBridge.jl | 29 +++++++++++++++++++ .../Constraint/test_SetDotScalingBridge.jl | 18 ++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/Bridges/Constraint/bridges/SetDotScalingBridge.jl b/src/Bridges/Constraint/bridges/SetDotScalingBridge.jl index 233f7118b5..e672b91391 100644 --- a/src/Bridges/Constraint/bridges/SetDotScalingBridge.jl +++ b/src/Bridges/Constraint/bridges/SetDotScalingBridge.jl @@ -108,6 +108,35 @@ function MOI.Bridges.inverse_adjoint_map_function( return _scale(T, S, func) end +function MOI.modify( + model::MOI.ModelLike, + bridge::SetDotScalingBridge{T,S}, + change::MOI.MultirowChange{T}, +) where {T,S} + set = MOI.get(model, MOI.ConstraintSet(), bridge.constraint).set + scale = MOI.Utilities.SetDotScalingVector{T}(set) + new_coefficients = Tuple{Int64,T}[ + (row, scale[row] * coef) for (row, coef) in change.new_coefficients + ] + MOI.modify( + model, + bridge.constraint, + MOI.MultirowChange(change.variable, new_coefficients), + ) + return +end + +function MOI.modify( + model::MOI.ModelLike, + bridge::SetDotScalingBridge, + change::MOI.VectorConstantChange, +) + new_constant = MOI.Bridges.map_function(bridge, change.new_constant) + new_change = MOI.VectorConstantChange(new_constant) + MOI.modify(model, bridge.constraint, new_change) + return +end + """ SetDotInverseScalingBridge{T,S,F,G} <: Bridges.Constraint.AbstractBridge diff --git a/test/Bridges/Constraint/test_SetDotScalingBridge.jl b/test/Bridges/Constraint/test_SetDotScalingBridge.jl index cec348aeb9..cd3f3f19fa 100644 --- a/test/Bridges/Constraint/test_SetDotScalingBridge.jl +++ b/test/Bridges/Constraint/test_SetDotScalingBridge.jl @@ -181,6 +181,24 @@ function test_set_dot_inverse_scaling_constraint_dual_start() return end +function test_modify() + inner = MOI.Utilities.Model{Float64}() + model = MOI.Bridges.Constraint.SetDotScaling{Float64}(inner) + x = MOI.add_variables(model, 3) + f = MOI.Utilities.vectorize(1.0 .* x) + c = MOI.add_constraint(model, f, MOI.PositiveSemidefiniteConeTriangle(2)) + @test ≈(MOI.get(model, MOI.ConstraintFunction(), c), f) + MOI.modify(model, c, MOI.VectorConstantChange([3.0, 4.0, 5.0])) + f.constants .= [3.0, 4.0, 5.0] + @test ≈(MOI.get(model, MOI.ConstraintFunction(), c), f) + MOI.modify(model, c, MOI.MultirowChange(x[1], [(1, 2.1)])) + MOI.modify(model, c, MOI.MultirowChange(x[2], [(2, 2.2)])) + MOI.modify(model, c, MOI.MultirowChange(x[3], [(3, 2.3)])) + f = MOI.Utilities.vectorize([2.1, 2.2, 2.3] .* x .+ [3.0, 4.0, 5.0]) + @test ≈(MOI.get(model, MOI.ConstraintFunction(), c), f) + return +end + end # module TestConstraintSetDotScaling.runtests()