From 1f334abc5af5ad048258223a848fc773e28fdbc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Sat, 16 May 2026 23:51:06 +0200 Subject: [PATCH 1/2] Fix bridging cost for QCQP --- src/QCQP/MOI_wrapper.jl | 10 ++++++++++ test/qcqp.jl | 30 +++++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/QCQP/MOI_wrapper.jl b/src/QCQP/MOI_wrapper.jl index 463c93a..35b666d 100644 --- a/src/QCQP/MOI_wrapper.jl +++ b/src/QCQP/MOI_wrapper.jl @@ -198,6 +198,16 @@ function MOI.supports_constraint( ) end +function MOI.get( + model::Optimizer{T}, + ::MOI.ConstraintBridgingCost{<:PolyJuMP.ScalarPolynomialFunction{T},S}, +) where {T,S<:MOI.AbstractScalarSet} + return MOI.get( + model.model, + MOI.ConstraintBridgingCost{MOI.ScalarQuadraticFunction{T},S}(), + ) +end + function MOI.add_constraint( model::Optimizer, func::MOI.AbstractFunction, diff --git a/test/qcqp.jl b/test/qcqp.jl index 3a517e7..40d86cd 100644 --- a/test/qcqp.jl +++ b/test/qcqp.jl @@ -293,7 +293,7 @@ function test_variable_primal(x, y, T) T, MOI.instantiate( () -> PolyJuMP.QCQP.Optimizer{T}(optimizer), - with_bridge_type = T, + with_bridge_type=T, ), ) JuMP.@variable(model, 1 <= a <= 3) @@ -324,7 +324,7 @@ function test_name(_, _, T) inner = Model{T}() qcqp = MOI.instantiate( () -> PolyJuMP.QCQP.Optimizer{T}(inner), - with_bridge_type = T, + with_bridge_type=T, ) idxmap = MOI.copy_to(qcqp, JuMP.backend(model)) attr = MOI.VariableName() @@ -373,8 +373,32 @@ function test_inner_bridge(x, y, T) MOI.get(inner, MOI.ListOfModelAttributesSet()) end +function test_constraint_bridging_cost_polynomial(x, y, T) + inner = MOI.Utilities.MockOptimizer(Model{T}()) + optimizer = PolyJuMP.QCQP.Optimizer{T}(inner) + F = typeof( + PolyJuMP.ScalarPolynomialFunction( + one(T) * x^3 - x * y^2, + [MOI.VariableIndex(1), MOI.VariableIndex(2)], + ), + ) + for S in ( + MOI.LessThan{T}, + MOI.GreaterThan{T}, + MOI.EqualTo{T}, + MOI.Interval{T}, + ) + @test MOI.supports_constraint(optimizer, F, S) + @test MOI.get(optimizer, MOI.ConstraintBridgingCost{F,S}()) == MOI.get( + optimizer, + MOI.ConstraintBridgingCost{MOI.ScalarQuadraticFunction{T},S}(), + ) + end + return +end + function runtests(x, y) - for name in names(@__MODULE__; all = true) + for name in names(@__MODULE__; all=true) if startswith("$name", "test_") @testset "$(name) $T" for T in [Int, Float64] getfield(@__MODULE__, name)(x, y, T) From c024fccfdbd27812b451b554ab63bda1fb9ee055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Sun, 17 May 2026 08:28:25 +0200 Subject: [PATCH 2/2] Fix format --- test/qcqp.jl | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/test/qcqp.jl b/test/qcqp.jl index 40d86cd..f190061 100644 --- a/test/qcqp.jl +++ b/test/qcqp.jl @@ -293,7 +293,7 @@ function test_variable_primal(x, y, T) T, MOI.instantiate( () -> PolyJuMP.QCQP.Optimizer{T}(optimizer), - with_bridge_type=T, + with_bridge_type = T, ), ) JuMP.@variable(model, 1 <= a <= 3) @@ -324,7 +324,7 @@ function test_name(_, _, T) inner = Model{T}() qcqp = MOI.instantiate( () -> PolyJuMP.QCQP.Optimizer{T}(inner), - with_bridge_type=T, + with_bridge_type = T, ) idxmap = MOI.copy_to(qcqp, JuMP.backend(model)) attr = MOI.VariableName() @@ -382,12 +382,8 @@ function test_constraint_bridging_cost_polynomial(x, y, T) [MOI.VariableIndex(1), MOI.VariableIndex(2)], ), ) - for S in ( - MOI.LessThan{T}, - MOI.GreaterThan{T}, - MOI.EqualTo{T}, - MOI.Interval{T}, - ) + for S in + (MOI.LessThan{T}, MOI.GreaterThan{T}, MOI.EqualTo{T}, MOI.Interval{T}) @test MOI.supports_constraint(optimizer, F, S) @test MOI.get(optimizer, MOI.ConstraintBridgingCost{F,S}()) == MOI.get( optimizer, @@ -398,7 +394,7 @@ function test_constraint_bridging_cost_polynomial(x, y, T) end function runtests(x, y) - for name in names(@__MODULE__; all=true) + for name in names(@__MODULE__; all = true) if startswith("$name", "test_") @testset "$(name) $T" for T in [Int, Float64] getfield(@__MODULE__, name)(x, y, T)