From f8b683d74601be53c931b14d1990e66bdb629f1a Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Mon, 7 Sep 2026 08:51:09 +1200 Subject: [PATCH 1/3] [Bridges] fix SquareBridge with differing constants in off-diagonal --- src/Bridges/Constraint/bridges/SquareBridge.jl | 2 +- test/Bridges/Constraint/test_SquareBridge.jl | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Bridges/Constraint/bridges/SquareBridge.jl b/src/Bridges/Constraint/bridges/SquareBridge.jl index ec8ad70d70..f562de7a7e 100644 --- a/src/Bridges/Constraint/bridges/SquareBridge.jl +++ b/src/Bridges/Constraint/bridges/SquareBridge.jl @@ -267,7 +267,7 @@ function MOI.get( f_ji = MOI.Utilities.operate(-, T, f[offset+i+(j-1)*dim], diff) # But we need to account for the constant moved into the set rhs = MOI.constant(MOI.get(model, MOI.ConstraintSet(), ci)) - f_ji = MOI.Utilities.operate!(-, T, f_ji, rhs) + f_ji = MOI.Utilities.operate!(+, T, f_ji, rhs) f[offset+j+(i-1)*dim] = MOI.Utilities.convert_approx(eltype(f), f_ji) end return MOI.Utilities.vectorize(f) diff --git a/test/Bridges/Constraint/test_SquareBridge.jl b/test/Bridges/Constraint/test_SquareBridge.jl index e9e1c0036a..d69604b23e 100644 --- a/test/Bridges/Constraint/test_SquareBridge.jl +++ b/test/Bridges/Constraint/test_SquareBridge.jl @@ -314,6 +314,22 @@ function test_VectorNonlinearFunction_mixed_type() return end +function test_square_bridge_with_constant() + MOI.Bridges.runtests( + MOI.Bridges.Constraint.SquareBridge, + """ + variables: x11, x21, x12, x22 + [x11 + 1.0, x21 + 2.0, x12 + 3.0, x22 + 4.0] in PositiveSemidefiniteConeSquare(2) + """, + """ + variables: x11, x21, x12, x22 + [x11 + 1.0, x12 + 3.0, x22 + 4.0] in PositiveSemidefiniteConeTriangle(2) + x12 + -1.0 * x21 == -1.0 + """, + ) + return +end + end # module TestConstraintSquare.runtests() From 1ccb1404dab244bd95154ad612ad78be13f43922 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Mon, 7 Sep 2026 10:32:24 +1200 Subject: [PATCH 2/3] Update --- src/Bridges/Constraint/bridges/SquareBridge.jl | 4 ++-- test/Bridges/Constraint/test_SquareBridge.jl | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Bridges/Constraint/bridges/SquareBridge.jl b/src/Bridges/Constraint/bridges/SquareBridge.jl index f562de7a7e..fe3132a791 100644 --- a/src/Bridges/Constraint/bridges/SquareBridge.jl +++ b/src/Bridges/Constraint/bridges/SquareBridge.jl @@ -320,7 +320,7 @@ function MOI.get( primal[offset+i+(j-1)*dim] = primal[offset+j+(i-1)*dim] = value[k] end for ((i, j), ci) in bridge.sym - primal[offset+i+(j-1)*dim] += MOI.get(model, attr, ci) + primal[offset+j+(i-1)*dim] -= MOI.get(model, attr, ci) end return primal end @@ -341,7 +341,7 @@ function MOI.set( k = offset for j in 1:dim, i in 1:j k += 1 - primal[k] = value[offset+j+(i-1)*dim] + primal[k] = value[offset+i+(j-1)*dim] end MOI.set(model, attr, bridge.triangle, primal) for ((i, j), ci) in bridge.sym diff --git a/test/Bridges/Constraint/test_SquareBridge.jl b/test/Bridges/Constraint/test_SquareBridge.jl index d69604b23e..fa6507c277 100644 --- a/test/Bridges/Constraint/test_SquareBridge.jl +++ b/test/Bridges/Constraint/test_SquareBridge.jl @@ -330,6 +330,24 @@ function test_square_bridge_with_constant() return end +function test_constraint_primal_start() + inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()) + model = MOI.Bridges.Constraint.Square{Float64}(inner) + x = MOI.add_variables(model, 4) + f = MOI.Utilities.vectorize(1.0 .* x .+ (1.0:4.0)) + ci = MOI.add_constraint(model, f, MOI.PositiveSemidefiniteConeSquare(2)) + bridge = MOI.Bridges.bridge(model, ci) + start = [11.0, 21.0, 12.0, 22.0] + MOI.set(model, MOI.ConstraintPrimalStart(), ci, start) + @test isapprox( + MOI.get(inner, MOI.ConstraintPrimalStart(), bridge.triangle), + [11.0, 12.0, 22.0] + ) + @test ≈(MOI.get(inner, MOI.ConstraintPrimalStart(), bridge.sym[1][2]), -9.0) + @test ≈(MOI.get(model, MOI.ConstraintFunction(), ci), f) + return +end + end # module TestConstraintSquare.runtests() From 9d4254bb7087d17ba465882dd40879affb46cb96 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Mon, 7 Sep 2026 11:22:59 +1200 Subject: [PATCH 3/3] Apply suggestion from @odow --- test/Bridges/Constraint/test_SquareBridge.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Bridges/Constraint/test_SquareBridge.jl b/test/Bridges/Constraint/test_SquareBridge.jl index fa6507c277..56715c3798 100644 --- a/test/Bridges/Constraint/test_SquareBridge.jl +++ b/test/Bridges/Constraint/test_SquareBridge.jl @@ -341,7 +341,7 @@ function test_constraint_primal_start() MOI.set(model, MOI.ConstraintPrimalStart(), ci, start) @test isapprox( MOI.get(inner, MOI.ConstraintPrimalStart(), bridge.triangle), - [11.0, 12.0, 22.0] + [11.0, 12.0, 22.0], ) @test ≈(MOI.get(inner, MOI.ConstraintPrimalStart(), bridge.sym[1][2]), -9.0) @test ≈(MOI.get(model, MOI.ConstraintFunction(), ci), f)