From 8aacba99c977140e498d353f4db8824cb4c72a99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Thu, 23 May 2019 11:03:45 +0200 Subject: [PATCH 1/8] fix ambiguity --- src/Bridges/indicatorbridge.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Bridges/indicatorbridge.jl b/src/Bridges/indicatorbridge.jl index 2ed458eaec..68effe063a 100644 --- a/src/Bridges/indicatorbridge.jl +++ b/src/Bridges/indicatorbridge.jl @@ -52,6 +52,6 @@ end function concrete_bridge_type(::Type{<:IndicatorActiveOnFalseBridge{T}}, ::Type{F}, - ::Type{MOI.IndicatorSet{MOI.ACTIVATE_ON_ZERO, S}}) where {T, F, S} + ::Type{MOI.IndicatorSet{MOI.ACTIVATE_ON_ZERO, S}}) where {T, F<:MOI.VectorAffineFunction, S<:MOI.AbstractScalarSet} return IndicatorActiveOnFalseBridge{T, F, S} end From 572066810bdd12251eab74dd12753648ce733f76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Fri, 24 May 2019 11:44:34 +0200 Subject: [PATCH 2/8] use concrete bridge type --- src/Bridges/indicatorbridge.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Bridges/indicatorbridge.jl b/src/Bridges/indicatorbridge.jl index 68effe063a..8b9ad9e7db 100644 --- a/src/Bridges/indicatorbridge.jl +++ b/src/Bridges/indicatorbridge.jl @@ -36,8 +36,8 @@ function bridge_constraint(::Type{<:IndicatorActiveOnFalseBridge}, model::MOI.Mo f.constants ) ci = MOI.add_constraint(model, f2, MOI.IndicatorSet{MOI.ACTIVATE_ON_ONE}(s.set)) - - return IndicatorActiveOnFalseBridge{T, MOI.VectorAffineFunction{T}, S}(z2, zo_cons, dcons, ci) + BT = concrete_bridge_type(IndicatorActiveOnFalseBridge{T}, typeof(f), typeof(s)) + return BT(z2, zo_cons, dcons, ci) end function MOI.supports_constraint(::Type{<:IndicatorActiveOnFalseBridge}, From 1b55be7d6de61f834e57694f36f5007a403e30b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Tue, 28 May 2019 10:14:57 +0200 Subject: [PATCH 3/8] concrete bridge tests --- src/Bridges/indicatorbridge.jl | 12 +++++++++--- test/Bridges/indicator_bridge.jl | 6 ++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/Bridges/indicatorbridge.jl b/src/Bridges/indicatorbridge.jl index 8b9ad9e7db..f9d60852d5 100644 --- a/src/Bridges/indicatorbridge.jl +++ b/src/Bridges/indicatorbridge.jl @@ -40,9 +40,9 @@ function bridge_constraint(::Type{<:IndicatorActiveOnFalseBridge}, model::MOI.Mo return BT(z2, zo_cons, dcons, ci) end -function MOI.supports_constraint(::Type{<:IndicatorActiveOnFalseBridge}, - ::Type{<:MOI.VectorAffineFunction}, - ::Type{<:MOI.IndicatorSet{MOI.ACTIVATE_ON_ZERO}}) +function MOI.supports_constraint(::Type{IndicatorActiveOnFalseBridge{T,F,S}}, + ::Type{F}, + ::Type{<:MOI.IndicatorSet{MOI.ACTIVATE_ON_ZERO, S}}) where {T, S, F<:MOI.VectorAffineFunction} return true end @@ -55,3 +55,9 @@ function concrete_bridge_type(::Type{<:IndicatorActiveOnFalseBridge{T}}, ::Type{MOI.IndicatorSet{MOI.ACTIVATE_ON_ZERO, S}}) where {T, F<:MOI.VectorAffineFunction, S<:MOI.AbstractScalarSet} return IndicatorActiveOnFalseBridge{T, F, S} end + +function concrete_bridge_type(::Type{<:IndicatorActiveOnFalseBridge}, + ::Type{F}, + ::Type{MOI.IndicatorSet{MOI.ACTIVATE_ON_ZERO, S}}) where {F<:MOI.VectorAffineFunction, S<:MOI.AbstractScalarSet} + return IndicatorActiveOnFalseBridge{Float64, F, S} +end diff --git a/test/Bridges/indicator_bridge.jl b/test/Bridges/indicator_bridge.jl index ab7ddaebad..c85a226fd8 100644 --- a/test/Bridges/indicator_bridge.jl +++ b/test/Bridges/indicator_bridge.jl @@ -40,6 +40,12 @@ include("../model.jl") bridge = MOIB.bridge_constraint(MOIB.IndicatorActiveOnFalseBridge, model, f1, iset1) + BT = MOIB.concrete_bridge_type(MOIB.IndicatorActiveOnFalseBridge{Float64}, typeof(f1), typeof(iset1)) + BT2 = MOIB.concrete_bridge_type(MOIB.IndicatorActiveOnFalseBridge, typeof(f1), typeof(iset1)) + + @test BT == BT2 + @test bridge isa BT + z1comp = bridge.variable_index @test MOI.get(model, MOI.ConstraintFunction(), bridge.zero_one_cons) == MOI.SingleVariable(z1comp) @test MOI.get(model, MOI.ConstraintSet(), bridge.disjunction_cons) == MOI.EqualTo(1.0) From 9c00b0282ac679aea006141379f18b9e64b586c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Tue, 28 May 2019 11:49:39 +0200 Subject: [PATCH 4/8] fix subtyping --- src/Bridges/indicatorbridge.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Bridges/indicatorbridge.jl b/src/Bridges/indicatorbridge.jl index f9d60852d5..2d4fe48ca6 100644 --- a/src/Bridges/indicatorbridge.jl +++ b/src/Bridges/indicatorbridge.jl @@ -40,9 +40,9 @@ function bridge_constraint(::Type{<:IndicatorActiveOnFalseBridge}, model::MOI.Mo return BT(z2, zo_cons, dcons, ci) end -function MOI.supports_constraint(::Type{IndicatorActiveOnFalseBridge{T,F,S}}, +function MOI.supports_constraint(::Type{<:IndicatorActiveOnFalseBridge{T}}, ::Type{F}, - ::Type{<:MOI.IndicatorSet{MOI.ACTIVATE_ON_ZERO, S}}) where {T, S, F<:MOI.VectorAffineFunction} + ::Type{<:MOI.IndicatorSet{MOI.ACTIVATE_ON_ZERO}}) where {T,F<:MOI.VectorAffineFunction} return true end From a9853a455af6784d014227fc9efcc61f13b72cbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Tue, 28 May 2019 13:51:24 +0200 Subject: [PATCH 5/8] bridge constraint concrete type --- src/Bridges/indicatorbridge.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Bridges/indicatorbridge.jl b/src/Bridges/indicatorbridge.jl index 2d4fe48ca6..29c6f752bd 100644 --- a/src/Bridges/indicatorbridge.jl +++ b/src/Bridges/indicatorbridge.jl @@ -15,7 +15,7 @@ struct IndicatorActiveOnFalseBridge{T, F <: MOI.AbstractVectorFunction, S <: MOI indicator_cons_index::MOI.ConstraintIndex{F, MOI.IndicatorSet{MOI.ACTIVATE_ON_ONE, S}} end -function bridge_constraint(::Type{<:IndicatorActiveOnFalseBridge}, model::MOI.ModelLike, f::MOI.VectorAffineFunction{T}, s::IS) where {S <: MOI.AbstractScalarSet, T <: Real, F, IS <: MOI.IndicatorSet{MOI.ACTIVATE_ON_ZERO, S}} +function bridge_constraint(::Type{IndicatorActiveOnFalseBridge{T,F,S}}, model::MOI.ModelLike, f::MOI.VectorAffineFunction{T}, s::IS) where {S <: MOI.AbstractScalarSet, T <: Real, F, IS <: MOI.IndicatorSet{MOI.ACTIVATE_ON_ZERO, S}} z1 = f.terms[1].scalar_term.variable_index z2 = MOI.add_variable(model) zo_cons = MOI.add_constraint(model, MOI.SingleVariable(z2), MOI.ZeroOne()) From c6eea12b06190610511b7ec3aeb0d95d8406b0f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Tue, 28 May 2019 13:54:08 +0200 Subject: [PATCH 6/8] fix test --- test/Bridges/indicator_bridge.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Bridges/indicator_bridge.jl b/test/Bridges/indicator_bridge.jl index c85a226fd8..ea58c62845 100644 --- a/test/Bridges/indicator_bridge.jl +++ b/test/Bridges/indicator_bridge.jl @@ -38,10 +38,10 @@ include("../model.jl") ) iset1 = MOI.IndicatorSet{MOI.ACTIVATE_ON_ZERO}(MOI.LessThan(8.0)) - bridge = MOIB.bridge_constraint(MOIB.IndicatorActiveOnFalseBridge, model, f1, iset1) BT = MOIB.concrete_bridge_type(MOIB.IndicatorActiveOnFalseBridge{Float64}, typeof(f1), typeof(iset1)) BT2 = MOIB.concrete_bridge_type(MOIB.IndicatorActiveOnFalseBridge, typeof(f1), typeof(iset1)) + bridge = MOIB.bridge_constraint(BT, model, f1, iset1) @test BT == BT2 @test bridge isa BT From 9c03f61ce10157a3aaaa549dbab1c6aa494a73c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Tue, 28 May 2019 15:16:09 +0200 Subject: [PATCH 7/8] remove BT --- src/Bridges/indicatorbridge.jl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Bridges/indicatorbridge.jl b/src/Bridges/indicatorbridge.jl index 29c6f752bd..a65b2dd3ee 100644 --- a/src/Bridges/indicatorbridge.jl +++ b/src/Bridges/indicatorbridge.jl @@ -36,8 +36,7 @@ function bridge_constraint(::Type{IndicatorActiveOnFalseBridge{T,F,S}}, model::M f.constants ) ci = MOI.add_constraint(model, f2, MOI.IndicatorSet{MOI.ACTIVATE_ON_ONE}(s.set)) - BT = concrete_bridge_type(IndicatorActiveOnFalseBridge{T}, typeof(f), typeof(s)) - return BT(z2, zo_cons, dcons, ci) + return IndicatorActiveOnFalseBridge{T,F,S}(z2, zo_cons, dcons, ci) end function MOI.supports_constraint(::Type{<:IndicatorActiveOnFalseBridge{T}}, From 1bf0674f28c34ef67961c88d477a0c878ae9d22f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Tue, 28 May 2019 17:12:58 +0200 Subject: [PATCH 8/8] subtype directly in-place --- src/Bridges/indicatorbridge.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Bridges/indicatorbridge.jl b/src/Bridges/indicatorbridge.jl index a65b2dd3ee..ad9e185786 100644 --- a/src/Bridges/indicatorbridge.jl +++ b/src/Bridges/indicatorbridge.jl @@ -40,8 +40,8 @@ function bridge_constraint(::Type{IndicatorActiveOnFalseBridge{T,F,S}}, model::M end function MOI.supports_constraint(::Type{<:IndicatorActiveOnFalseBridge{T}}, - ::Type{F}, - ::Type{<:MOI.IndicatorSet{MOI.ACTIVATE_ON_ZERO}}) where {T,F<:MOI.VectorAffineFunction} + ::Type{<:MOI.VectorAffineFunction}, + ::Type{<:MOI.IndicatorSet{MOI.ACTIVATE_ON_ZERO}}) where {T} return true end