From d487a083ae48308fb819fdf38df4060372cab088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Mon, 12 Jul 2021 23:45:06 -0400 Subject: [PATCH 1/2] Fix Constraint/Objective.SingleBridgeOptimizer with inner variable bridges --- .../Constraint/single_bridge_optimizer.jl | 16 ++++++ .../Objective/single_bridge_optimizer.jl | 4 ++ test/Bridges/bridge_optimizer.jl | 49 +++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/src/Bridges/Constraint/single_bridge_optimizer.jl b/src/Bridges/Constraint/single_bridge_optimizer.jl index 290144961b..48b1987e1e 100644 --- a/src/Bridges/Constraint/single_bridge_optimizer.jl +++ b/src/Bridges/Constraint/single_bridge_optimizer.jl @@ -44,6 +44,22 @@ function MOIB.is_bridged(b::SingleBridgeOptimizer, S::Type{<:MOI.AbstractSet}) return MOIB.supports_bridging_constrained_variable(b, S) end +MOIB.is_bridged(::SingleBridgeOptimizer, ::MOI.VariableIndex) = false +function MOIB.is_bridged( + b::SingleBridgeOptimizer, + ci::MOI.ConstraintIndex{MOI.SingleVariable,S}, +) where {S} + return MOIB.is_bridged(b, MOI.SingleVariable, S) && + haskey(Constraint.bridges(b), ci) +end +function MOIB.is_bridged( + b::SingleBridgeOptimizer, + ci::MOI.ConstraintIndex{MOI.VectorOfVariables,S}, +) where {S} + return MOIB.is_bridged(b, MOI.VectorOfVariables, S) && + haskey(Constraint.bridges(b), ci) +end + function MOIB.supports_bridging_constrained_variable( b::SingleBridgeOptimizer, S::Type{<:MOI.AbstractSet}, diff --git a/src/Bridges/Objective/single_bridge_optimizer.jl b/src/Bridges/Objective/single_bridge_optimizer.jl index 8762843de7..a0c4dbd52f 100644 --- a/src/Bridges/Objective/single_bridge_optimizer.jl +++ b/src/Bridges/Objective/single_bridge_optimizer.jl @@ -36,6 +36,10 @@ function MOIB.is_bridged( return false end +MOIB.is_bridged(::SingleBridgeOptimizer, ::MOI.VariableIndex) = false +MOIB.is_bridged(::SingleBridgeOptimizer, ::MOI.ConstraintIndex{MOI.SingleVariable}) = false +MOIB.is_bridged(::SingleBridgeOptimizer, ::MOI.ConstraintIndex{MOI.VectorOfVariables}) = false + function MOIB.supports_bridging_objective_function( ::SingleBridgeOptimizer{BT}, F::Type{<:MOI.AbstractScalarFunction}, diff --git a/test/Bridges/bridge_optimizer.jl b/test/Bridges/bridge_optimizer.jl index 3535bde62e..06d265039c 100644 --- a/test/Bridges/bridge_optimizer.jl +++ b/test/Bridges/bridge_optimizer.jl @@ -539,3 +539,52 @@ end @test all(vi -> !MOI.is_valid(model, vi), x) end end + +function test_nesting_SingleBridgeOptimizer(::Type{T}) where {T} + model = MOIU.Model{T}() + b0 = MOIB.Variable.Free{T}(model) + b1 = MOIB.Constraint.ScalarFunctionize{T}(b0) + b2 = MOIB.Constraint.VectorFunctionize{T}(b1) + b = MOIB.Objective.Functionize{T}(b2) + x = MOI.add_variable(b) + @test MOI.is_valid(b, x) + @test !MOIB.is_bridged(b, x) + @test MOI.is_valid(b2, x) + @test !MOIB.is_bridged(b2, x) + @test MOI.is_valid(b1, x) + @test !MOIB.is_bridged(b1, x) + @test MOI.is_valid(b0, x) + @test MOIB.is_bridged(b0, x) + @test !MOI.is_valid(model, x) + fx = MOI.SingleVariable(x) + clt = MOI.add_constraint(b, fx, MOI.LessThan(one(T))) + @test MOI.is_valid(b, clt) + @test !MOIB.is_bridged(b, clt) + @test MOI.is_valid(b2, clt) + @test !MOIB.is_bridged(b2, clt) + @test MOI.is_valid(b1, clt) + @test MOIB.is_bridged(b1, clt) + @test !MOI.is_valid(b0, clt) + @test !MOI.is_valid(model, clt) + cnn = MOI.add_constraint(b, MOIU.vectorize([fx]), MOI.Nonnegatives(1)) + @test MOI.is_valid(b, cnn) + @test !MOIB.is_bridged(b, cnn) + @test MOI.is_valid(b2, cnn) + @test MOIB.is_bridged(b2, cnn) + @test !MOI.is_valid(b1, cnn) + @test !MOI.is_valid(b0, cnn) + @test !MOI.is_valid(model, cnn) + obj = fx + attr = MOI.ObjectiveFunction{typeof(obj)}() + MOI.set(b, attr, obj) + @test MOIB.is_bridged(b, attr) + obj = one(T) * fx + attr = MOI.ObjectiveFunction{typeof(obj)}() + MOI.set(b, attr, obj) + @test !MOIB.is_bridged(b, attr) + @test !MOIB.is_bridged(b2, attr) + @test !MOIB.is_bridged(b1, attr) + @test !MOIB.is_bridged(b0, attr) +end + +test_nesting_SingleBridgeOptimizer(Float64) From d560111ed1cfae57da315d0ea09b4965df412915 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Wed, 14 Jul 2021 15:43:31 -0400 Subject: [PATCH 2/2] Fix format --- src/Bridges/Objective/single_bridge_optimizer.jl | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Bridges/Objective/single_bridge_optimizer.jl b/src/Bridges/Objective/single_bridge_optimizer.jl index a0c4dbd52f..048c220192 100644 --- a/src/Bridges/Objective/single_bridge_optimizer.jl +++ b/src/Bridges/Objective/single_bridge_optimizer.jl @@ -37,8 +37,18 @@ function MOIB.is_bridged( end MOIB.is_bridged(::SingleBridgeOptimizer, ::MOI.VariableIndex) = false -MOIB.is_bridged(::SingleBridgeOptimizer, ::MOI.ConstraintIndex{MOI.SingleVariable}) = false -MOIB.is_bridged(::SingleBridgeOptimizer, ::MOI.ConstraintIndex{MOI.VectorOfVariables}) = false +function MOIB.is_bridged( + ::SingleBridgeOptimizer, + ::MOI.ConstraintIndex{MOI.SingleVariable}, +) + return false +end +function MOIB.is_bridged( + ::SingleBridgeOptimizer, + ::MOI.ConstraintIndex{MOI.VectorOfVariables}, +) + return false +end function MOIB.supports_bridging_objective_function( ::SingleBridgeOptimizer{BT},