Skip to content

Commit a2aa54e

Browse files
authored
Merge pull request #510 from ResourceMind/external_setfunc_bridges_simpler
Support of bridges with external sets/funcs
2 parents 7c7f38b + 9fcbb3f commit a2aa54e

File tree

9 files changed

+96
-42
lines changed

9 files changed

+96
-42
lines changed

src/Bridges/Bridges.jl

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,16 @@ include("singlebridgeoptimizer.jl")
2424
include("lazybridgeoptimizer.jl")
2525

2626
# This is used by JuMP and removes the need to update JuMP everytime a bridge is added
27-
MOIU.@model AllBridgedConstraints () (Interval,) (SecondOrderCone, RotatedSecondOrderCone, GeometricMeanCone, LogDetConeTriangle, RootDetConeTriangle) () () (ScalarAffineFunction,) (VectorOfVariables,) (VectorAffineFunction,)
27+
MOIU.@model(AllBridgedConstraints,
28+
(),
29+
(MOI.Interval,),
30+
(MOI.SecondOrderCone, MOI.RotatedSecondOrderCone, MOI.GeometricMeanCone,
31+
MOI.LogDetConeTriangle, MOI.RootDetConeTriangle),
32+
(),
33+
(),
34+
(MOI.ScalarAffineFunction,),
35+
(MOI.VectorOfVariables,),
36+
(MOI.VectorAffineFunction,))
2837
"""
2938
fullbridgeoptimizer(model::MOI.ModelLike, ::Type{T}) where T
3039
@@ -44,18 +53,18 @@ function fullbridgeoptimizer(model::MOI.ModelLike, ::Type{T}) where T
4453
end
4554

4655
include("intervalbridge.jl")
47-
@bridge SplitInterval SplitIntervalBridge () (Interval,) () () (SingleVariable,) (ScalarAffineFunction, ScalarQuadraticFunction) () ()
56+
@bridge SplitInterval SplitIntervalBridge () (MOI.Interval,) () () (MOI.SingleVariable,) (MOI.ScalarAffineFunction, MOI.ScalarQuadraticFunction) () ()
4857
include("rsocbridge.jl")
49-
@bridge RSOC RSOCBridge () () (RotatedSecondOrderCone,) () () () (VectorOfVariables,) (VectorAffineFunction,)
58+
@bridge RSOC RSOCBridge () () (MOI.RotatedSecondOrderCone,) () () () (MOI.VectorOfVariables,) (MOI.VectorAffineFunction,)
5059
include("geomeanbridge.jl")
51-
@bridge GeoMean GeoMeanBridge () () (GeometricMeanCone,) () () () (VectorOfVariables,) (VectorAffineFunction,)
60+
@bridge GeoMean GeoMeanBridge () () (MOI.GeometricMeanCone,) () () () (MOI.VectorOfVariables,) (MOI.VectorAffineFunction,)
5261
include("squarepsdbridge.jl")
53-
@bridge SquarePSD SquarePSDBridge () () (PositiveSemidefiniteConeSquare,) () () () (VectorOfVariables,) (VectorAffineFunction, VectorQuadraticFunction)
62+
@bridge SquarePSD SquarePSDBridge () () (MOI.PositiveSemidefiniteConeSquare,) () () () (MOI.VectorOfVariables,) (MOI.VectorAffineFunction, MOI.VectorQuadraticFunction)
5463
include("detbridge.jl")
55-
@bridge LogDet LogDetBridge () () (LogDetConeTriangle,) () () () (VectorOfVariables,) (VectorAffineFunction,)
56-
@bridge RootDet RootDetBridge () () (RootDetConeTriangle,) () () () (VectorOfVariables,) (VectorAffineFunction,)
64+
@bridge LogDet LogDetBridge () () (MOI.LogDetConeTriangle,) () () () (MOI.VectorOfVariables,) (MOI.VectorAffineFunction,)
65+
@bridge RootDet RootDetBridge () () (MOI.RootDetConeTriangle,) () () () (MOI.VectorOfVariables,) (MOI.VectorAffineFunction,)
5766
include("soctopsdbridge.jl")
58-
@bridge SOCtoPSD SOCtoPSDBridge () () (SecondOrderCone,) () () () (VectorOfVariables,) (VectorAffineFunction,)
59-
@bridge RSOCtoPSD RSOCtoPSDBridge () () (RotatedSecondOrderCone,) () () () (VectorOfVariables,) (VectorAffineFunction,)
67+
@bridge SOCtoPSD SOCtoPSDBridge () () (MOI.SecondOrderCone,) () () () (MOI.VectorOfVariables,) (MOI.VectorAffineFunction,)
68+
@bridge RSOCtoPSD RSOCtoPSDBridge () () (MOI.RotatedSecondOrderCone,) () () () (MOI.VectorOfVariables,) (MOI.VectorAffineFunction,)
6069

6170
end # module

src/Bridges/singlebridgeoptimizer.jl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ is_bridged(b::SingleBridgeOptimizer, ::Type{<:MOI.AbstractFunction}, ::Type{<:MO
1717
bridge_type(b::SingleBridgeOptimizer{BT}, F::Type{<:MOI.AbstractFunction}, S::Type{<:MOI.AbstractSet}) where BT = BT
1818

1919
# :((Zeros, SecondOrderCone)) -> (:(MOI.Zeros), :(MOI.SecondOrderCone))
20-
_tuple_prefix_moi(t) = MOIU._moi.(t.args)
2120

2221
"""
2322
macro bridge(modelname, bridge, scalarsets, typedscalarsets, vectorsets, typedvectorsets, scalarfunctions, typedscalarfunctions, vectorfunctions, typedvectorfunctions)
@@ -39,13 +38,13 @@ will additionally support `ScalarAffineFunction`-in-`Interval`.
3938
"""
4039
macro bridge(modelname, bridge, ss, sst, vs, vst, sf, sft, vf, vft)
4140
bridged_model_name = Symbol(string(modelname) * "Instance")
42-
bridged_funs = :(Union{$(_tuple_prefix_moi(sf)...), $(_tuple_prefix_moi(sft)...), $(_tuple_prefix_moi(vf)...), $(_tuple_prefix_moi(vft)...)})
43-
bridged_sets = :(Union{$(_tuple_prefix_moi(ss)...), $(_tuple_prefix_moi(sst)...), $(_tuple_prefix_moi(vs)...), $(_tuple_prefix_moi(vst)...)})
41+
bridged_funs = :(Union{$((sf.args)...), $((sft.args)...), $((vf.args)...), $((vft.args)...)})
42+
bridged_sets = :(Union{$((ss.args)...), $((sst.args)...), $((vs.args)...), $((vst.args)...)})
4443

4544
esc(quote
4645
$MOIU.@model $bridged_model_name $ss $sst $vs $vst $sf $sft $vf $vft
4746
const $modelname{T, OT<:MOI.ModelLike} = $MOIB.SingleBridgeOptimizer{$bridge{T}, $bridged_model_name{T}, OT}
48-
is_bridged(::$modelname, ::Type{<:$bridged_funs}, ::Type{<:$bridged_sets}) = true
47+
$MOIB.is_bridged(::$modelname, ::Type{<:$bridged_funs}, ::Type{<:$bridged_sets}) = true
4948
supports_bridging_constraint(::$modelname, ::Type{<:$bridged_funs}, ::Type{<:$bridged_sets}) = true
5049
end)
5150
end

src/Utilities/model.jl

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -393,12 +393,12 @@ abstract type Constraints{F} end
393393

394394
abstract type SymbolFS end
395395
struct SymbolFun <: SymbolFS
396-
s::Symbol
396+
s::Union{Symbol, Expr}
397397
typed::Bool
398398
cname::Symbol
399399
end
400400
struct SymbolSet <: SymbolFS
401-
s::Symbol
401+
s::Union{Symbol, Expr}
402402
typed::Bool
403403
end
404404

@@ -409,11 +409,9 @@ end
409409
# Expr(:., MOI, :($(QuoteNode(s)))) is Expr(:., MOI, :(:EqualTo)) <- what we want
410410

411411
# (MOI, :Zeros) -> :(MOI.Zeros)
412-
_mod(m::Module, s::Symbol) = Expr(:., m, :($(QuoteNode(s))))
413412
# (:Zeros) -> :(MOI.Zeros)
414-
_moi(s::Symbol) = _mod(MOI, s)
415-
_set(s::SymbolSet) = _moi(s.s)
416-
_fun(s::SymbolFun) = _moi(s.s)
413+
_set(s::SymbolSet) = s.s
414+
_fun(s::SymbolFun) = s.s
417415
function _typedset(s::SymbolSet)
418416
if s.typed
419417
:($(_set(s)){T})
@@ -433,7 +431,7 @@ end
433431
if VERSION >= v"0.7.0-DEV.2813"
434432
using Unicode
435433
end
436-
_field(s::SymbolFS) = Symbol(lowercase(string(s.s)))
434+
_field(s::SymbolFS) = Symbol(replace(lowercase(string(s.s)), "." => "_"))
437435

438436
_getC(s::SymbolSet) = :($MOIU.C{F, $(_typedset(s))})
439437
_getC(s::SymbolFun) = _typedfun(s)
@@ -578,15 +576,14 @@ macro model(modelname, ss, sst, vs, vst, sf, sft, vf, vft)
578576
end
579577
end
580578

581-
for (func, T) in ((:_add_constraint, CI), (:_modify, CI), (:_delete, CI), (:_getindex, CI), (:_getfunction, CI), (:_getset, CI), (:_getnoc, MOI.NumberOfConstraints))
582-
funct = _mod(MOIU, func)
579+
for (funct, T) in ((:_add_constraint, CI), (:_modify, CI), (:_delete, CI), (:_getindex, CI), (:_getfunction, CI), (:_getset, CI), (:_getnoc, MOI.NumberOfConstraints))
583580
for (c, sets) in ((scname, scalarsets), (vcname, vectorsets))
584581
for s in sets
585582
set = _set(s)
586583
field = _field(s)
587584
code = quote
588585
$code
589-
$funct(model::$c, ci::$T{F, <:$set}, args...) where F = $funct(model.$field, ci, args...)
586+
$MOIU.$funct(model::$c, ci::$T{F, <:$set}, args...) where F = $MOIU.$funct(model.$field, ci, args...)
590587
end
591588
end
592589
end
@@ -596,12 +593,12 @@ macro model(modelname, ss, sst, vs, vst, sf, sft, vf, vft)
596593
field = _field(f)
597594
code = quote
598595
$code
599-
$funct(model::$modelname, ci::$T{<:$fun}, args...) = $funct(model.$field, ci, args...)
596+
$MOIU.$funct(model::$modelname, ci::$T{<:$fun}, args...) = $MOIU.$funct(model.$field, ci, args...)
600597
end
601598
end
602599
end
603600

604-
return esc(quote
601+
code = quote
605602
$scalarconstraints
606603
function $scname{T, F}() where {T, F}
607604
$scname{T, F}($(_getCV.(scalarsets)...))
@@ -624,6 +621,6 @@ macro model(modelname, ss, sst, vs, vst, sf, sft, vf, vft)
624621
$MOI.supports_constraint(model::$modelname{T}, ::Type{<:Union{$(_typedfun.(vectorfuns)...)}}, ::Type{<:Union{$(_typedset.(vectorsets)...)}}) where T = true
625622

626623
$code
627-
628-
end)
624+
end
625+
return esc(code)
629626
end

test/bridge.jl

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
# Model not supporting Interval
2-
MOIU.@model SimpleModel () (EqualTo, GreaterThan, LessThan) (Zeros, Nonnegatives, Nonpositives, SecondOrderCone, RotatedSecondOrderCone, GeometricMeanCone, PositiveSemidefiniteConeTriangle, ExponentialCone) () (SingleVariable,) (ScalarAffineFunction, ScalarQuadraticFunction) (VectorOfVariables,) (VectorAffineFunction,)
2+
MOIU.@model(SimpleModel,
3+
(),
4+
(MOI.EqualTo, MOI.GreaterThan, MOI.LessThan),
5+
(MOI.Zeros, MOI.Nonnegatives, MOI.Nonpositives, MOI.SecondOrderCone,
6+
MOI.RotatedSecondOrderCone, MOI.GeometricMeanCone,
7+
MOI.PositiveSemidefiniteConeTriangle, MOI.ExponentialCone),
8+
(),
9+
(MOI.SingleVariable,),
10+
(MOI.ScalarAffineFunction, MOI.ScalarQuadraticFunction),
11+
(MOI.VectorOfVariables,),
12+
(MOI.VectorAffineFunction,))
313

414
function test_noc(bridgedmock, F, S, n)
515
@test MOI.get(bridgedmock, MOI.NumberOfConstraints{F, S}()) == n
@@ -109,7 +119,16 @@ end
109119
end
110120

111121
# Model not supporting RotatedSecondOrderCone
112-
MOIU.@model NoRSOCModel () (EqualTo, GreaterThan, LessThan, Interval) (Zeros, Nonnegatives, Nonpositives, SecondOrderCone, ExponentialCone, PositiveSemidefiniteConeTriangle) () (SingleVariable,) (ScalarAffineFunction,) (VectorOfVariables,) (VectorAffineFunction,)
122+
MOIU.@model(NoRSOCModel,
123+
(),
124+
(MOI.EqualTo, MOI.GreaterThan, MOI.LessThan, MOI.Interval),
125+
(MOI.Zeros, MOI.Nonnegatives, MOI.Nonpositives, MOI.SecondOrderCone,
126+
MOI.ExponentialCone, MOI.PositiveSemidefiniteConeTriangle),
127+
(),
128+
(MOI.SingleVariable,),
129+
(MOI.ScalarAffineFunction,),
130+
(MOI.VectorOfVariables,),
131+
(MOI.VectorAffineFunction,))
113132

114133
@testset "LazyBridgeOptimizer" begin
115134
mock = MOIU.MockOptimizer(NoRSOCModel{Float64}())

test/cachingoptimizer.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@MOIU.model ModelForCachingOptimizer (ZeroOne, Integer) (EqualTo, GreaterThan, LessThan, Interval) (Zeros, Nonnegatives, Nonpositives, SecondOrderCone, RotatedSecondOrderCone, GeometricMeanCone, ExponentialCone, DualExponentialCone, PositiveSemidefiniteConeTriangle, RootDetConeTriangle, LogDetConeTriangle) () (SingleVariable,) (ScalarAffineFunction,ScalarQuadraticFunction) (VectorOfVariables,) (VectorAffineFunction,)
1+
@MOIU.model ModelForCachingOptimizer (MOI.ZeroOne, MOI.Integer) (MOI.EqualTo, MOI.GreaterThan, MOI.LessThan, MOI.Interval) (MOI.Zeros, MOI.Nonnegatives, MOI.Nonpositives, MOI.SecondOrderCone, MOI.RotatedSecondOrderCone, MOI.GeometricMeanCone, MOI.ExponentialCone, MOI.DualExponentialCone, MOI.PositiveSemidefiniteConeTriangle, MOI.RootDetConeTriangle, MOI.LogDetConeTriangle) () (MOI.SingleVariable,) (MOI.ScalarAffineFunction, MOI.ScalarQuadraticFunction) (MOI.VectorOfVariables,) (MOI.VectorAffineFunction,)
22

33
@testset "CachingOptimizer Manual mode" begin
44
m = MOIU.CachingOptimizer(ModelForCachingOptimizer{Float64}(), MOIU.Manual)

test/model.jl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
MOIU.@model LPModel () (EqualTo, GreaterThan, LessThan, Interval) (Zeros, Nonnegatives, Nonpositives) () (SingleVariable,) (ScalarAffineFunction,) (VectorOfVariables,) (VectorAffineFunction,)
1+
MOIU.@model(LPModel,
2+
(),
3+
(MOI.EqualTo, MOI.GreaterThan, MOI.LessThan, MOI.Interval),
4+
(MOI.Zeros, MOI.Nonnegatives, MOI.Nonpositives),
5+
(),
6+
(MOI.SingleVariable,),
7+
(MOI.ScalarAffineFunction,),
8+
(MOI.VectorOfVariables,),
9+
(MOI.VectorAffineFunction,))
210

311
@testset "Name test" begin
412
MOIT.nametest(Model{Float64}())

test/parser.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ end
3131
@test MOIU.separatelabel(:(con1: [x,y] in S)) == (:con1, :([x,y] in S))
3232
end
3333

34-
@MOIU.model GeneralModel (ZeroOne, Integer) (EqualTo, GreaterThan, LessThan, Interval) (Zeros, Nonnegatives, Nonpositives, SecondOrderCone, RotatedSecondOrderCone, PositiveSemidefiniteConeTriangle) () (SingleVariable,) (ScalarAffineFunction,ScalarQuadraticFunction) (VectorOfVariables,) (VectorAffineFunction,)
34+
@MOIU.model GeneralModel (MOI.ZeroOne, MOI.Integer) (MOI.EqualTo, MOI.GreaterThan, MOI.LessThan, MOI.Interval) (MOI.Zeros, MOI.Nonnegatives, MOI.Nonpositives, MOI.SecondOrderCone, MOI.RotatedSecondOrderCone, MOI.PositiveSemidefiniteConeTriangle) () (MOI.SingleVariable,) (MOI.ScalarAffineFunction, MOI.ScalarQuadraticFunction) (MOI.VectorOfVariables,) (MOI.VectorAffineFunction,)
3535

3636
@testset "loadfromstring" begin
3737
@testset "one variable" begin

test/runtests.jl

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,30 @@ end
2323
# Needed by test spread over several files, defining it here make it easier to comment out tests
2424
# Model supporting every MOI functions and sets
2525
MOIU.@model(Model,
26-
(ZeroOne, Integer),
27-
(EqualTo, GreaterThan, LessThan, Interval, Semicontinuous, Semiinteger),
28-
(Reals, Zeros, Nonnegatives, Nonpositives, SecondOrderCone, RotatedSecondOrderCone, GeometricMeanCone, ExponentialCone, DualExponentialCone, PositiveSemidefiniteConeTriangle, PositiveSemidefiniteConeSquare, RootDetConeTriangle, RootDetConeSquare, LogDetConeTriangle, LogDetConeSquare),
29-
(PowerCone, DualPowerCone, SOS1, SOS2),
30-
(SingleVariable,),
31-
(ScalarAffineFunction, ScalarQuadraticFunction),
32-
(VectorOfVariables,),
33-
(VectorAffineFunction, VectorQuadraticFunction))
26+
(MOI.ZeroOne, MOI.Integer),
27+
(MOI.EqualTo, MOI.GreaterThan, MOI.LessThan, MOI.Interval,
28+
MOI.Semicontinuous, MOI.Semiinteger),
29+
(MOI.Reals, MOI.Zeros, MOI.Nonnegatives, MOI.Nonpositives,
30+
MOI.SecondOrderCone, MOI.RotatedSecondOrderCone,
31+
MOI.GeometricMeanCone, MOI.ExponentialCone, MOI.DualExponentialCone,
32+
MOI.PositiveSemidefiniteConeTriangle, MOI.PositiveSemidefiniteConeSquare,
33+
MOI.RootDetConeTriangle, MOI.RootDetConeSquare, MOI.LogDetConeTriangle,
34+
MOI.LogDetConeSquare),
35+
(MOI.PowerCone, MOI.DualPowerCone, MOI.SOS1, MOI.SOS2),
36+
(MOI.SingleVariable,),
37+
(MOI.ScalarAffineFunction, MOI.ScalarQuadraticFunction),
38+
(MOI.VectorOfVariables,),
39+
(MOI.VectorAffineFunction, MOI.VectorQuadraticFunction))
40+
3441
# Model supporting only SecondOrderCone as non-LP cone.
35-
@MOIU.model ModelForMock (ZeroOne, Integer) (EqualTo, GreaterThan, LessThan, Interval) (Zeros, Nonnegatives, Nonpositives, SecondOrderCone) () (SingleVariable,) (ScalarAffineFunction, ScalarQuadraticFunction) (VectorOfVariables,) (VectorAffineFunction,)
42+
MOIU.@model(ModelForMock, (MOI.ZeroOne, MOI.Integer),
43+
(MOI.EqualTo, MOI.GreaterThan, MOI.LessThan, MOI.Interval),
44+
(MOI.Zeros, MOI.Nonnegatives, MOI.Nonpositives, MOI.SecondOrderCone),
45+
(),
46+
(MOI.SingleVariable,),
47+
(MOI.ScalarAffineFunction, MOI.ScalarQuadraticFunction),
48+
(MOI.VectorOfVariables,),
49+
(MOI.VectorAffineFunction,))
3650

3751
# Utilities submodule tests
3852
@testset "MOI.Utilities" begin

test/universalfallback.jl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,15 @@ struct UnknownOptimizerAttribute <: MOI.AbstractOptimizerAttribute end
4747

4848
# A few constraint types are supported to test both the fallback and the
4949
# delegation to the internal model
50-
@MOIU.model ModelForUniversalFallback () (LessThan,) () () (SingleVariable,) (ScalarAffineFunction,) () ()
50+
@MOIU.model(ModelForUniversalFallback,
51+
(),
52+
(MOI.LessThan,),
53+
(),
54+
(),
55+
(MOI.SingleVariable,),
56+
(MOI.ScalarAffineFunction,),
57+
(),
58+
())
5159

5260
@testset "UniversalFallback" begin
5361
model = ModelForUniversalFallback{Float64}()

0 commit comments

Comments
 (0)