Skip to content

Commit 950a540

Browse files
committed
[Bridges.Constraint] add bridges in alphabetical order
1 parent c4cd518 commit 950a540

File tree

1 file changed

+85
-61
lines changed

1 file changed

+85
-61
lines changed

src/Bridges/Constraint/Constraint.jl

Lines changed: 85 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -30,83 +30,107 @@ The coefficient type used is `T`.
3030
"""
3131
function add_all_bridges(model, ::Type{T}) where {T}
3232
if T <: AbstractFloat
33+
# Out of order: put these bridges at the start for backwards
34+
# compatibility.
3335
MOI.Bridges.add_bridge(model, GreaterToIntervalBridge{T})
3436
MOI.Bridges.add_bridge(model, LessToIntervalBridge{T})
3537
end
38+
MOI.Bridges.add_bridge(model, AllDifferentToCountDistinctBridge{T})
39+
MOI.Bridges.add_bridge(model, BinPackingToMILPBridge{T})
40+
MOI.Bridges.add_bridge(model, CircuitToMILPBridge{T})
41+
MOI.Bridges.add_bridge(model, ComplexNormInfinityToSecondOrderConeBridge{T})
42+
MOI.Bridges.add_bridge(model, CountAtLeastToCountBelongsBridge{T})
43+
MOI.Bridges.add_bridge(model, CountBelongsToMILPBridge{T})
44+
MOI.Bridges.add_bridge(model, CountDistinctToMILPBridge{T})
45+
MOI.Bridges.add_bridge(model, CountGreaterThanToMILPBridge{T})
46+
MOI.Bridges.add_bridge(
47+
model,
48+
ExponentialConeToScalarNonlinearFunctionBridge{T},
49+
)
50+
# * FunctionConversionBridge{T}
51+
# This bridge is not added because, even though it is not abstract, it
52+
# is highly parameterized, and parameterized versions such as
53+
# ScalarFunctionizeBridge are added.
54+
MOI.Bridges.add_bridge(model, GeoMeanBridge{T})
55+
MOI.Bridges.add_bridge(model, GeoMeanToPowerBridge{T})
56+
MOI.Bridges.add_bridge(model, GeoMeantoRelEntrBridge{T})
3657
MOI.Bridges.add_bridge(model, GreaterToLessBridge{T})
58+
MOI.Bridges.add_bridge(model, HermitianToSymmetricPSDBridge{T})
59+
MOI.Bridges.add_bridge(model, IndicatorActiveOnFalseBridge{T})
60+
MOI.Bridges.add_bridge(model, IndicatorGreaterToLessThanBridge{T})
61+
MOI.Bridges.add_bridge(model, IndicatorLessToGreaterThanBridge{T})
62+
# * IndicatorSetMapBridge{T}
63+
# This bridge is not added because, even though it is not abstract, it
64+
# is highly parameterized, and parameterized versions such as
65+
# IndicatorGreaterToLessThanBridge are added.
66+
MOI.Bridges.add_bridge(model, IndicatorSOS1Bridge{T})
67+
MOI.Bridges.add_bridge(model, IndicatorToMILPBridge{T})
68+
MOI.Bridges.add_bridge(model, InequalityToComplementsBridge{T})
69+
MOI.Bridges.add_bridge(model, IntegerToZeroOneBridge{T})
3770
MOI.Bridges.add_bridge(model, LessToGreaterBridge{T})
71+
MOI.Bridges.add_bridge(model, LogDetBridge{T})
3872
MOI.Bridges.add_bridge(model, NonnegToNonposBridge{T})
3973
MOI.Bridges.add_bridge(model, NonposToNonnegBridge{T})
40-
MOI.Bridges.add_bridge(model, ScalarizeBridge{T})
41-
MOI.Bridges.add_bridge(model, VectorizeBridge{T})
42-
MOI.Bridges.add_bridge(model, ScalarSlackBridge{T})
43-
MOI.Bridges.add_bridge(model, VectorSlackBridge{T})
44-
MOI.Bridges.add_bridge(model, ScalarFunctionizeBridge{T})
45-
MOI.Bridges.add_bridge(model, VectorFunctionizeBridge{T})
46-
MOI.Bridges.add_bridge(model, ToScalarQuadraticBridge{T})
47-
MOI.Bridges.add_bridge(model, ToVectorQuadraticBridge{T})
48-
MOI.Bridges.add_bridge(model, ToScalarNonlinearBridge{T})
49-
MOI.Bridges.add_bridge(model, SplitHyperRectangleBridge{T})
50-
MOI.Bridges.add_bridge(model, SplitIntervalBridge{T})
51-
MOI.Bridges.add_bridge(model, SplitComplexEqualToBridge{T})
52-
MOI.Bridges.add_bridge(model, SplitComplexZerosBridge{T})
53-
MOI.Bridges.add_bridge(model, QuadtoSOCBridge{T})
54-
# We do not add `(R)SOCtoNonConvexQuad` because it starts with a convex
55-
# conic constraint and generate a non-convex constraint (in the QCP
56-
# interpretation).
5774
MOI.Bridges.add_bridge(model, NormInfinityBridge{T})
75+
MOI.Bridges.add_bridge(model, NormInfinityConeToNormConeBridge{T})
76+
MOI.Bridges.add_bridge(model, NormNuclearBridge{T})
5877
MOI.Bridges.add_bridge(model, NormOneBridge{T})
59-
MOI.Bridges.add_bridge(model, GeoMeantoRelEntrBridge{T})
60-
MOI.Bridges.add_bridge(model, GeoMeanBridge{T})
61-
MOI.Bridges.add_bridge(model, GeoMeanToPowerBridge{T})
62-
MOI.Bridges.add_bridge(model, NormToPowerBridge{T})
6378
MOI.Bridges.add_bridge(model, NormOneConeToNormConeBridge{T})
64-
MOI.Bridges.add_bridge(model, SecondOrderConeToNormConeBridge{T})
65-
MOI.Bridges.add_bridge(model, NormInfinityConeToNormConeBridge{T})
66-
MOI.Bridges.add_bridge(model, ComplexNormInfinityToSecondOrderConeBridge{T})
67-
MOI.Bridges.add_bridge(model, RelativeEntropyBridge{T})
79+
# * NormSpecialCaseBridge{T}
80+
# This bridge is not added because, even though it is not abstract, it
81+
# is highly parameterized, and parameterized versions such as
82+
# NormOneConeToNormConeBridge are added.
6883
MOI.Bridges.add_bridge(model, NormSpectralBridge{T})
69-
MOI.Bridges.add_bridge(model, NormNuclearBridge{T})
70-
MOI.Bridges.add_bridge(model, HermitianToSymmetricPSDBridge{T})
71-
MOI.Bridges.add_bridge(model, SquareBridge{T})
72-
MOI.Bridges.add_bridge(model, SetDotScalingBridge{T})
73-
MOI.Bridges.add_bridge(model, SetDotInverseScalingBridge{T})
74-
MOI.Bridges.add_bridge(model, LogDetBridge{T})
84+
MOI.Bridges.add_bridge(model, NormToPowerBridge{T})
85+
# * NumberConversionBridge{T}
86+
# This bridge is not added by default because it would silently enable
87+
# models with mixed precision. In most cases, this is a bug in the
88+
# user's code, so we leave this bridge as opt-in.
89+
MOI.Bridges.add_bridge(model, QuadtoSOCBridge{T})
90+
MOI.Bridges.add_bridge(model, ReifiedAllDifferentToCountDistinctBridge{T})
91+
MOI.Bridges.add_bridge(model, ReifiedCountDistinctToMILPBridge{T})
92+
MOI.Bridges.add_bridge(model, RelativeEntropyBridge{T})
7593
MOI.Bridges.add_bridge(model, RootDetBridge{T})
76-
MOI.Bridges.add_bridge(model, RSOCtoSOCBridge{T})
77-
MOI.Bridges.add_bridge(model, SOCtoRSOCBridge{T})
78-
# We do not add `SOCtoPSDBridge` as transforming the `SOC` to `RSOC` and
79-
# then to `PSD` produces a smaller SDP constraint.
80-
# MOI.Bridges.add_bridge(model, SOCtoPSDBridge{T})
94+
# * RSOCtoNonConvexQuadBridge{T}
95+
# This bridge is not added by default because it starts with a convex
96+
# conic constraint and generate a non-convex constraint (in the QCP
97+
# interpretation).
8198
MOI.Bridges.add_bridge(model, RSOCtoPSDBridge{T})
82-
MOI.Bridges.add_bridge(model, IndicatorActiveOnFalseBridge{T})
83-
MOI.Bridges.add_bridge(model, IndicatorSOS1Bridge{T})
84-
MOI.Bridges.add_bridge(model, IndicatorLessToGreaterThanBridge{T})
85-
MOI.Bridges.add_bridge(model, IndicatorGreaterToLessThanBridge{T})
99+
MOI.Bridges.add_bridge(model, RSOCtoSOCBridge{T})
100+
MOI.Bridges.add_bridge(model, ScalarFunctionizeBridge{T})
101+
MOI.Bridges.add_bridge(model, ScalarizeBridge{T})
102+
MOI.Bridges.add_bridge(model, ScalarSlackBridge{T})
103+
MOI.Bridges.add_bridge(model, SecondOrderConeToNormConeBridge{T})
86104
MOI.Bridges.add_bridge(model, SemiToBinaryBridge{T})
87-
MOI.Bridges.add_bridge(model, ZeroOneBridge{T})
88-
MOI.Bridges.add_bridge(model, IntegerToZeroOneBridge{T})
89-
MOI.Bridges.add_bridge(model, InequalityToComplementsBridge{T})
90-
# Do not add by default
91-
# MOI.Bridges.add_bridge(model, NumberConversionBridge{T})
92-
# Constraint programming bridges
93-
MOI.Bridges.add_bridge(model, AllDifferentToCountDistinctBridge{T})
94-
MOI.Bridges.add_bridge(model, ReifiedAllDifferentToCountDistinctBridge{T})
95-
MOI.Bridges.add_bridge(model, BinPackingToMILPBridge{T})
96-
MOI.Bridges.add_bridge(model, CircuitToMILPBridge{T})
97-
MOI.Bridges.add_bridge(model, CountAtLeastToCountBelongsBridge{T})
98-
MOI.Bridges.add_bridge(model, CountBelongsToMILPBridge{T})
99-
MOI.Bridges.add_bridge(model, CountDistinctToMILPBridge{T})
100-
MOI.Bridges.add_bridge(model, ReifiedCountDistinctToMILPBridge{T})
101-
MOI.Bridges.add_bridge(model, CountGreaterThanToMILPBridge{T})
102-
MOI.Bridges.add_bridge(model, TableToMILPBridge{T})
105+
# * SetConversionBridge{T}
106+
# This bridge is not added because, even though it is not abstract, it
107+
# is highly parameterized, and it intended for use by MOI extensions.
108+
MOI.Bridges.add_bridge(model, SetDotInverseScalingBridge{T})
109+
MOI.Bridges.add_bridge(model, SetDotScalingBridge{T})
110+
# * SOCtoNonConvexQuadBridge{T}
111+
# This bridge is not added by default because it starts with a convex
112+
# conic constraint and generate a non-convex constraint (in the QCP
113+
# interpretation).
114+
# * SOCtoPSDBridge{T}
115+
# This bridge is not added because transforming the `SOC` to `RSOC` and
116+
# then to `PSD` produces a smaller SDP constraint. `RSOCtoPSDBridge` is
117+
# added by default.
118+
MOI.Bridges.add_bridge(model, SOCtoRSOCBridge{T})
103119
MOI.Bridges.add_bridge(model, SOS1ToMILPBridge{T})
104120
MOI.Bridges.add_bridge(model, SOS2ToMILPBridge{T})
105-
MOI.Bridges.add_bridge(model, IndicatorToMILPBridge{T})
106-
MOI.Bridges.add_bridge(
107-
model,
108-
ExponentialConeToScalarNonlinearFunctionBridge{T},
109-
)
121+
MOI.Bridges.add_bridge(model, SplitComplexEqualToBridge{T})
122+
MOI.Bridges.add_bridge(model, SplitComplexZerosBridge{T})
123+
MOI.Bridges.add_bridge(model, SplitHyperRectangleBridge{T})
124+
MOI.Bridges.add_bridge(model, SplitIntervalBridge{T})
125+
MOI.Bridges.add_bridge(model, SquareBridge{T})
126+
MOI.Bridges.add_bridge(model, TableToMILPBridge{T})
127+
MOI.Bridges.add_bridge(model, ToScalarNonlinearBridge{T})
128+
MOI.Bridges.add_bridge(model, ToScalarQuadraticBridge{T})
129+
MOI.Bridges.add_bridge(model, ToVectorQuadraticBridge{T})
130+
MOI.Bridges.add_bridge(model, VectorFunctionizeBridge{T})
131+
MOI.Bridges.add_bridge(model, VectorizeBridge{T})
132+
MOI.Bridges.add_bridge(model, VectorSlackBridge{T})
133+
MOI.Bridges.add_bridge(model, ZeroOneBridge{T})
110134
return
111135
end
112136

0 commit comments

Comments
 (0)