From 5e5d185341d81f0e55415af0d579dd5b99cb32cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Tue, 12 Aug 2025 14:23:41 +0200 Subject: [PATCH 1/4] Add a check that bridge is used --- src/Bridges/Bridges.jl | 12 ++++++++++++ test/Bridges/Constraint/IndicatorSOS1Bridge.jl | 1 + test/Bridges/Constraint/NumberConversionBridge.jl | 1 + 3 files changed, 14 insertions(+) diff --git a/src/Bridges/Bridges.jl b/src/Bridges/Bridges.jl index f7c67308aa..9a8659dd12 100644 --- a/src/Bridges/Bridges.jl +++ b/src/Bridges/Bridges.jl @@ -303,17 +303,22 @@ function _runtests( model_eltype = eltype, print_inner_model::Bool = false, cannot_unbridge::Bool = false, + no_bridge_used::Bool = false, ) # Load model and bridge it inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{model_eltype}()) model = _bridged_model(Bridge{eltype}, inner) input_fn(model) + _check_bridged(model; no_bridge_used) final_touch(model) # Should be able to call final_touch multiple times. final_touch(model) if print_inner_model print(inner) end + if no_bridge_used + return + end Test.@testset "Test outer bridged model appears like the input" begin # COV_EXCL_LINE test = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{model_eltype}()) @@ -512,6 +517,13 @@ function _general_bridge_tests(bridge::B) where {B<:AbstractBridge} return end +function _check_bridged(model; no_bridge_used) + unused = isempty(MOI.Bridges.Variable.bridges(model)) && + isempty(MOI.Bridges.Constraint.bridges(model)) && + isempty(MOI.Bridges.Objective.bridges(model)) + Test.@test unused == no_bridge_used +end + """ BridgeRequiresFiniteDomainError{ B<:AbstractBridge, diff --git a/test/Bridges/Constraint/IndicatorSOS1Bridge.jl b/test/Bridges/Constraint/IndicatorSOS1Bridge.jl index fe592488af..82cab6eb02 100644 --- a/test/Bridges/Constraint/IndicatorSOS1Bridge.jl +++ b/test/Bridges/Constraint/IndicatorSOS1Bridge.jl @@ -345,6 +345,7 @@ function test_runtests() [z, 2.0 * x * x] in Indicator{ACTIVATE_ON_ONE}(LessThan(2.0)) z in ZeroOne() """, + no_bridge_used = true, ) return end diff --git a/test/Bridges/Constraint/NumberConversionBridge.jl b/test/Bridges/Constraint/NumberConversionBridge.jl index b40908e08b..c8a4e6afdf 100644 --- a/test/Bridges/Constraint/NumberConversionBridge.jl +++ b/test/Bridges/Constraint/NumberConversionBridge.jl @@ -104,6 +104,7 @@ function test_runtests() variables: x ::Float64: [x, x] in Zeros(2) """, + no_bridge_used = true, ) # VectorAffineFunction MOI.Bridges.runtests( From db141418ae6fb156cd233d68244934a4e96c5bf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Tue, 12 Aug 2025 14:25:34 +0200 Subject: [PATCH 2/4] testset --- src/Bridges/Bridges.jl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Bridges/Bridges.jl b/src/Bridges/Bridges.jl index 9a8659dd12..37939a742f 100644 --- a/src/Bridges/Bridges.jl +++ b/src/Bridges/Bridges.jl @@ -309,7 +309,9 @@ function _runtests( inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{model_eltype}()) model = _bridged_model(Bridge{eltype}, inner) input_fn(model) - _check_bridged(model; no_bridge_used) + @testset "Bridge used" begin + _check_bridged(model; no_bridge_used) + end final_touch(model) # Should be able to call final_touch multiple times. final_touch(model) From 7863a8c82b081c57607f4ed473b4b3c59bf86b06 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Thu, 14 Aug 2025 07:47:04 +1200 Subject: [PATCH 3/4] Apply suggestions from code review --- src/Bridges/Bridges.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Bridges/Bridges.jl b/src/Bridges/Bridges.jl index 37939a742f..43f16e47f5 100644 --- a/src/Bridges/Bridges.jl +++ b/src/Bridges/Bridges.jl @@ -309,7 +309,7 @@ function _runtests( inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{model_eltype}()) model = _bridged_model(Bridge{eltype}, inner) input_fn(model) - @testset "Bridge used" begin + Test.@testset "Bridge used" begin _check_bridged(model; no_bridge_used) end final_touch(model) @@ -524,6 +524,7 @@ function _check_bridged(model; no_bridge_used) isempty(MOI.Bridges.Constraint.bridges(model)) && isempty(MOI.Bridges.Objective.bridges(model)) Test.@test unused == no_bridge_used + return end """ From 703af5af5778f33559a930bfb6f0f18c1510e5dd Mon Sep 17 00:00:00 2001 From: odow Date: Wed, 20 Aug 2025 09:59:53 +1200 Subject: [PATCH 4/4] Rebase and fix test --- docs/src/submodules/Bridges/implementation.md | 4 ++-- src/Bridges/Bridges.jl | 7 ++++--- test/Bridges/Objective/VectorSlackBridge.jl | 3 ++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/src/submodules/Bridges/implementation.md b/docs/src/submodules/Bridges/implementation.md index ae821f0087..2a7d278963 100644 --- a/docs/src/submodules/Bridges/implementation.md +++ b/docs/src/submodules/Bridges/implementation.md @@ -79,7 +79,7 @@ julia> MOI.Bridges.runtests( """, ) Test Summary: | Pass Total Time -Bridges.runtests | 29 29 0.0s +Bridges.runtests | 30 30 0.0s ``` There are a number of other useful keyword arguments. @@ -123,5 +123,5 @@ Subject to: ScalarAffineFunction{Int64}-in-LessThan{Int64} (0) - (1) x <= (-1) Test Summary: | Pass Total Time -Bridges.runtests | 29 29 0.0s +Bridges.runtests | 30 30 0.0s ``` diff --git a/src/Bridges/Bridges.jl b/src/Bridges/Bridges.jl index 43f16e47f5..b4bfee9b35 100644 --- a/src/Bridges/Bridges.jl +++ b/src/Bridges/Bridges.jl @@ -283,7 +283,7 @@ julia> MOI.Bridges.runtests( end, ) Test Summary: | Pass Total Time -Bridges.runtests | 32 32 0.8s +Bridges.runtests | 33 33 0.8s ``` """ function runtests(args...; kwargs...) @@ -444,7 +444,7 @@ julia> MOI.Bridges.runtests( \"\"\", ) Test Summary: | Pass Total Time -Bridges.runtests | 32 32 0.0s +Bridges.runtests | 33 33 0.0s ``` """ function runtests( @@ -520,7 +520,8 @@ function _general_bridge_tests(bridge::B) where {B<:AbstractBridge} end function _check_bridged(model; no_bridge_used) - unused = isempty(MOI.Bridges.Variable.bridges(model)) && + unused = + isempty(MOI.Bridges.Variable.bridges(model)) && isempty(MOI.Bridges.Constraint.bridges(model)) && isempty(MOI.Bridges.Objective.bridges(model)) Test.@test unused == no_bridge_used diff --git a/test/Bridges/Objective/VectorSlackBridge.jl b/test/Bridges/Objective/VectorSlackBridge.jl index 142007c4fa..3c6000ec2b 100644 --- a/test/Bridges/Objective/VectorSlackBridge.jl +++ b/test/Bridges/Objective/VectorSlackBridge.jl @@ -103,7 +103,8 @@ function test_runtests() """ variables: x maxobjective: [x] - """, + """; + no_bridge_used = true, ) return end