1- struct DiagonallyDominantBridge{T, F, G} <: MOI.Bridges.Constraint.AbstractBridge
1+ struct DiagonallyDominantBridge{T,F, G} <: MOI.Bridges.Constraint.AbstractBridge
22 # |Qij| variables
33 abs_vars:: Vector{MOI.VariableIndex}
44 # |Qij| ≥ +Qij
5- abs_plus:: Vector {MOI. ConstraintIndex{MOI. ScalarAffineFunction{T},
6- MOI. GreaterThan{T}}}
5+ abs_plus:: Vector {
6+ MOI. ConstraintIndex{MOI. ScalarAffineFunction{T},MOI. GreaterThan{T}},
7+ }
78 # |Qij| ≥ -Qij
8- abs_minus:: Vector {MOI. ConstraintIndex{MOI. ScalarAffineFunction{T},
9- MOI. GreaterThan{T}}}
9+ abs_minus:: Vector {
10+ MOI. ConstraintIndex{MOI. ScalarAffineFunction{T},MOI. GreaterThan{T}},
11+ }
1012 # inequalities Qjj ≥ sum_{i ≠ j} |Qij|
11- dominance:: Vector{MOI.ConstraintIndex{F, MOI.GreaterThan{T}}}
13+ dominance:: Vector{MOI.ConstraintIndex{F,MOI.GreaterThan{T}}}
1214end
1315
1416function MOI. Bridges. Constraint. bridge_constraint (
15- :: Type{DiagonallyDominantBridge{T, F, G}} ,
16- model:: MOI.ModelLike , f:: MOI.AbstractVectorFunction ,
17- s:: SOS.DiagonallyDominantConeTriangle ) where {T, F, G}
18-
17+ :: Type{DiagonallyDominantBridge{T,F,G}} ,
18+ model:: MOI.ModelLike ,
19+ f:: MOI.AbstractVectorFunction ,
20+ s:: SOS.DiagonallyDominantConeTriangle ,
21+ ) where {T,F,G}
1922 @assert MOI. output_dimension (f) == MOI. dimension (s)
2023 n = s. side_dimension
2124 g = F[zero (F) for i in 1 : n]
2225 fs = MOI. Utilities. eachscalar (f)
2326 num_off_diag = MOI. dimension (s) - n
24- CI = MOI. ConstraintIndex{MOI. ScalarAffineFunction{T}, MOI. GreaterThan{T}}
27+ CI = MOI. ConstraintIndex{MOI. ScalarAffineFunction{T},MOI. GreaterThan{T}}
2528 abs_vars = Vector {MOI.VariableIndex} (undef, num_off_diag)
2629 abs_plus = Vector {CI} (undef, num_off_diag)
2730 abs_minus = Vector {CI} (undef, num_off_diag)
@@ -38,27 +41,43 @@ function MOI.Bridges.Constraint.bridge_constraint(
3841 MOI. Utilities. operate! (- , T, g[j], fabs)
3942 MOI. Utilities. operate! (- , T, g[i], fabs)
4043 abs_plus[koff] = MOI. add_constraint (
41- model, MOI. Utilities. operate (+ , T, fabs, fs[k]), MOI. GreaterThan (0.0 ))
44+ model,
45+ MOI. Utilities. operate (+ , T, fabs, fs[k]),
46+ MOI. GreaterThan (0.0 ),
47+ )
4248 abs_minus[koff] = MOI. add_constraint (
43- model, MOI. Utilities. operate (- , T, fabs, fs[k]), MOI. GreaterThan (0.0 ))
49+ model,
50+ MOI. Utilities. operate (- , T, fabs, fs[k]),
51+ MOI. GreaterThan (0.0 ),
52+ )
4453 end
4554 k += 1
4655 MOI. Utilities. operate! (+ , T, g[j], fs[k])
4756 end
4857 dominance = map (f -> MOI. add_constraint (model, f, MOI. GreaterThan (0.0 )), g)
49- return DiagonallyDominantBridge {T, F, G} (abs_vars, abs_plus, abs_minus,
50- dominance)
58+ return DiagonallyDominantBridge {T,F,G} (
59+ abs_vars,
60+ abs_plus,
61+ abs_minus,
62+ dominance,
63+ )
5164end
5265
53- function MOI. supports_constraint (:: Type{<:DiagonallyDominantBridge} ,
54- :: Type{<:MOI.AbstractVectorFunction} ,
55- :: Type{<:SOS.DiagonallyDominantConeTriangle} )
66+ function MOI. supports_constraint (
67+ :: Type{<:DiagonallyDominantBridge} ,
68+ :: Type{<:MOI.AbstractVectorFunction} ,
69+ :: Type{<:SOS.DiagonallyDominantConeTriangle} ,
70+ )
5671 return true
5772end
58- function MOI. Bridges. added_constrained_variable_types (:: Type{<:DiagonallyDominantBridge} )
73+ function MOI. Bridges. added_constrained_variable_types (
74+ :: Type{<:DiagonallyDominantBridge} ,
75+ )
5976 return Tuple{DataType}[]
6077end
61- function MOI. Bridges. added_constraint_types (:: Type{<:DiagonallyDominantBridge{T, F}} ) where {T, F}
78+ function MOI. Bridges. added_constraint_types (
79+ :: Type{<:DiagonallyDominantBridge{T,F}} ,
80+ ) where {T,F}
6281 added = [(F, MOI. GreaterThan{T})]
6382 if F != MOI. ScalarAffineFunction{T}
6483 push! (added, (MOI. ScalarAffineFunction{T}, MOI. GreaterThan{T}))
6887function MOI. Bridges. Constraint. concrete_bridge_type (
6988 :: Type{<:DiagonallyDominantBridge{T}} ,
7089 G:: Type{<:MOI.AbstractVectorFunction} ,
71- :: Type{SOS.DiagonallyDominantConeTriangle} ) where T
72-
90+ :: Type{SOS.DiagonallyDominantConeTriangle} ,
91+ ) where {T}
7392 S = MOI. Utilities. scalar_type (G)
7493 F = MOI. Utilities. promote_operation (- , T, S, MOI. VariableIndex)
75- return DiagonallyDominantBridge{T, F, G}
94+ return DiagonallyDominantBridge{T,F, G}
7695end
7796
7897# Attributes, Bridge acting as an model
82101function MOI. get (bridge:: DiagonallyDominantBridge , :: MOI.ListOfVariableIndices )
83102 return bridge. abs_vars
84103end
85- function MOI. get (bridge:: DiagonallyDominantBridge{T, MOI.ScalarAffineFunction{T}} ,
86- :: MOI.NumberOfConstraints {MOI. ScalarAffineFunction{T},
87- MOI. GreaterThan{T}}) where T
88- return length (bridge. abs_plus) + length (bridge. abs_minus) + length (bridge. dominance)
89- end
90- function MOI. get (bridge:: DiagonallyDominantBridge{T} ,
91- :: MOI.NumberOfConstraints {MOI. ScalarAffineFunction{T},
92- MOI. GreaterThan{T}}) where T
104+ function MOI. get (
105+ bridge:: DiagonallyDominantBridge{T,MOI.ScalarAffineFunction{T}} ,
106+ :: MOI.NumberOfConstraints{MOI.ScalarAffineFunction{T},MOI.GreaterThan{T}} ,
107+ ) where {T}
108+ return length (bridge. abs_plus) +
109+ length (bridge. abs_minus) +
110+ length (bridge. dominance)
111+ end
112+ function MOI. get (
113+ bridge:: DiagonallyDominantBridge{T} ,
114+ :: MOI.NumberOfConstraints{MOI.ScalarAffineFunction{T},MOI.GreaterThan{T}} ,
115+ ) where {T}
93116 return length (bridge. abs_plus) + length (bridge. abs_minus)
94117end
95- function MOI. get (bridge:: DiagonallyDominantBridge{T, F} ,
96- :: MOI.NumberOfConstraints{F, MOI.GreaterThan{T}} ) where {T, F}
118+ function MOI. get (
119+ bridge:: DiagonallyDominantBridge{T,F} ,
120+ :: MOI.NumberOfConstraints{F,MOI.GreaterThan{T}} ,
121+ ) where {T,F}
97122 return length (bridge. dominance)
98123end
99- function MOI. get (bridge:: DiagonallyDominantBridge{T, MOI.ScalarAffineFunction{T}} ,
100- :: MOI.ListOfConstraintIndices {MOI. ScalarAffineFunction{T},
101- MOI. GreaterThan{T}}) where T
124+ function MOI. get (
125+ bridge:: DiagonallyDominantBridge{T,MOI.ScalarAffineFunction{T}} ,
126+ :: MOI.ListOfConstraintIndices {
127+ MOI. ScalarAffineFunction{T},
128+ MOI. GreaterThan{T},
129+ },
130+ ) where {T}
102131 return vcat (bridge. abs_plus, bridge. abs_minus, bridge. dominance)
103132end
104- function MOI. get (bridge:: DiagonallyDominantBridge{T} ,
105- :: MOI.ListOfConstraintIndices {MOI. ScalarAffineFunction{T},
106- MOI. GreaterThan{T}}) where T
133+ function MOI. get (
134+ bridge:: DiagonallyDominantBridge{T} ,
135+ :: MOI.ListOfConstraintIndices {
136+ MOI. ScalarAffineFunction{T},
137+ MOI. GreaterThan{T},
138+ },
139+ ) where {T}
107140 return vcat (bridge. abs_plus, bridge. abs_minus)
108141end
109- function MOI. get (bridge:: DiagonallyDominantBridge{T, F} ,
110- :: MOI.ListOfConstraintIndices{F, MOI.GreaterThan{T}} ) where {T, F}
142+ function MOI. get (
143+ bridge:: DiagonallyDominantBridge{T,F} ,
144+ :: MOI.ListOfConstraintIndices{F,MOI.GreaterThan{T}} ,
145+ ) where {T,F}
111146 return bridge. dominance
112147end
113148
@@ -128,37 +163,50 @@ function MOI.delete(model::MOI.ModelLike, bridge::DiagonallyDominantBridge)
128163end
129164
130165# Attributes, Bridge acting as a constraint
131- function MOI. get (:: MOI.ModelLike , :: MOI.ConstraintSet ,
132- bridge:: DiagonallyDominantBridge )
166+ function MOI. get (
167+ :: MOI.ModelLike ,
168+ :: MOI.ConstraintSet ,
169+ bridge:: DiagonallyDominantBridge ,
170+ )
133171 return SOS. DiagonallyDominantConeTriangle (length (bridge. dominance))
134172end
135- function MOI. get (model:: MOI.ModelLike , attr:: MOI.ConstraintFunction ,
136- bridge:: DiagonallyDominantBridge{T, F, G} ) where {T, F, G}
173+ function MOI. get (
174+ model:: MOI.ModelLike ,
175+ attr:: MOI.ConstraintFunction ,
176+ bridge:: DiagonallyDominantBridge{T,F,G} ,
177+ ) where {T,F,G}
137178 set = MOI. get (model, MOI. ConstraintSet (), bridge)
138179 H = MOI. Utilities. scalar_type (G)
139180 g = Vector {H} (undef, MOI. dimension (set))
140181 k = 0
141182 koff = 0
142183 for j in 1 : MOI. side_dimension (set)
143- for i in 1 : (j - 1 )
184+ for i in 1 : (j- 1 )
144185 k += 1
145186 koff += 1
146187 func = MOI. get (model, attr, bridge. abs_plus[koff])
147- g[k] = MOI. Utilities. convert_approx (H, MOI. Utilities. remove_variable (
148- func, bridge. abs_vars))
188+ g[k] = MOI. Utilities. convert_approx (
189+ H,
190+ MOI. Utilities. remove_variable (func, bridge. abs_vars),
191+ )
149192 end
150193 k += 1
151194 func = MOI. get (model, attr, bridge. dominance[j])
152- g[k] = MOI. Utilities. convert_approx (H, MOI. Utilities. remove_variable (
153- func, bridge. abs_vars))
195+ g[k] = MOI. Utilities. convert_approx (
196+ H,
197+ MOI. Utilities. remove_variable (func, bridge. abs_vars),
198+ )
154199 end
155200 return MOI. Utilities. vectorize (g)
156201end
157202
158203# TODO ConstraintPrimal
159204
160- function MOI. get (model:: MOI.ModelLike , attr:: MOI.ConstraintDual ,
161- bridge:: DiagonallyDominantBridge{T} ) where T
205+ function MOI. get (
206+ model:: MOI.ModelLike ,
207+ attr:: MOI.ConstraintDual ,
208+ bridge:: DiagonallyDominantBridge{T} ,
209+ ) where {T}
162210 dominance_dual = MOI. get (model, attr, bridge. dominance)
163211 side_dim = length (dominance_dual)
164212 dim = MOI. dimension (SOS. DiagonallyDominantConeTriangle (side_dim))
@@ -169,7 +217,7 @@ function MOI.get(model::MOI.ModelLike, attr::MOI.ConstraintDual,
169217 k += 1
170218 # Need to divide by 2 because of the custom scalar product for this
171219 # cone
172- dual[k] = (- dominance_dual[i] - dominance_dual[j]) / 2
220+ dual[k] = (- dominance_dual[i] - dominance_dual[j]) / 2
173221 end
174222 k += 1
175223 dual[k] = dominance_dual[j]
0 commit comments