Skip to content

Commit 7a73e7b

Browse files
authored
Fix bridging cost (#240)
* Fix bridging cost * Fix format
1 parent 2219828 commit 7a73e7b

2 files changed

Lines changed: 61 additions & 0 deletions

File tree

src/MOI_wrapper.jl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,16 @@ function MOI.supports_constraint(
601601
)
602602
end
603603

604+
function MOI.get(
605+
model::Optimizer{T},
606+
::MOI.ConstraintBridgingCost{MOI.ScalarQuadraticFunction{T},S},
607+
) where {T,S<:MOI.AbstractSet}
608+
return MOI.get(
609+
model.optimizer,
610+
MOI.ConstraintBridgingCost{MOI.ScalarAffineFunction{T},S}(),
611+
)
612+
end
613+
604614
function MOI.supports_constraint(
605615
model::Optimizer,
606616
::Type{MOI.VectorQuadraticFunction{T}},
@@ -613,6 +623,16 @@ function MOI.supports_constraint(
613623
)
614624
end
615625

626+
function MOI.get(
627+
model::Optimizer{T},
628+
::MOI.ConstraintBridgingCost{MOI.VectorQuadraticFunction{T},S},
629+
) where {T,S<:MOI.AbstractSet}
630+
return MOI.get(
631+
model.optimizer,
632+
MOI.ConstraintBridgingCost{MOI.VectorAffineFunction{T},S}(),
633+
)
634+
end
635+
616636
function MOI.supports(
617637
model::Optimizer,
618638
attr::MOI.ConstraintName,

test/test_MathOptInterface.jl

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2111,6 +2111,47 @@ function test_constrained_variables()
21112111
return
21122112
end
21132113

2114+
function test_constraint_bridging_cost_quadratic()
2115+
# POI rewrites `Vector/ScalarQuadraticFunction` constraints into their
2116+
# affine counterparts at solve time, so `supports_constraint` for the
2117+
# quadratic variant delegates to the affine one. `ConstraintBridgingCost`
2118+
# must do the same: otherwise `LazyBridgeOptimizer` sees
2119+
# `supports = true, cost = Inf` and treats the node as unreachable when
2120+
# building the bridge graph.
2121+
optimizer = POI.Optimizer(SCS.Optimizer)
2122+
for S in (MOI.Zeros, MOI.Nonnegatives, MOI.SecondOrderCone)
2123+
@test MOI.supports_constraint(
2124+
optimizer,
2125+
MOI.VectorQuadraticFunction{Float64},
2126+
S,
2127+
)
2128+
@test MOI.get(
2129+
optimizer,
2130+
MOI.ConstraintBridgingCost{MOI.VectorQuadraticFunction{Float64},S}(),
2131+
) == MOI.get(
2132+
optimizer,
2133+
MOI.ConstraintBridgingCost{MOI.VectorAffineFunction{Float64},S}(),
2134+
)
2135+
end
2136+
optimizer = POI.Optimizer(HiGHS.Optimizer)
2137+
for S in
2138+
(MOI.LessThan{Float64}, MOI.GreaterThan{Float64}, MOI.EqualTo{Float64})
2139+
@test MOI.supports_constraint(
2140+
optimizer,
2141+
MOI.ScalarQuadraticFunction{Float64},
2142+
S,
2143+
)
2144+
@test MOI.get(
2145+
optimizer,
2146+
MOI.ConstraintBridgingCost{MOI.ScalarQuadraticFunction{Float64},S}(),
2147+
) == MOI.get(
2148+
optimizer,
2149+
MOI.ConstraintBridgingCost{MOI.ScalarAffineFunction{Float64},S}(),
2150+
)
2151+
end
2152+
return
2153+
end
2154+
21142155
function test_parameter_index_error()
21152156
model = POI.Optimizer(MOI.Utilities.Model{Float64}())
21162157
POI._add_variable(model, MOI.VariableIndex(1))

0 commit comments

Comments
 (0)