1
- struct DiagonallyDominantBridge{T, F, G} <: MOI.Bridges.Constraint.AbstractBridge
1
+ struct DiagonallyDominantBridge{T,F, G} <: MOI.Bridges.Constraint.AbstractBridge
2
2
# |Qij| variables
3
3
abs_vars:: Vector{MOI.VariableIndex}
4
4
# |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
+ }
7
8
# |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
+ }
10
12
# inequalities Qjj ≥ sum_{i ≠ j} |Qij|
11
- dominance:: Vector{MOI.ConstraintIndex{F, MOI.GreaterThan{T}}}
13
+ dominance:: Vector{MOI.ConstraintIndex{F,MOI.GreaterThan{T}}}
12
14
end
13
15
14
16
function 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}
19
22
@assert MOI. output_dimension (f) == MOI. dimension (s)
20
23
n = s. side_dimension
21
24
g = F[zero (F) for i in 1 : n]
22
25
fs = MOI. Utilities. eachscalar (f)
23
26
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}}
25
28
abs_vars = Vector {MOI.VariableIndex} (undef, num_off_diag)
26
29
abs_plus = Vector {CI} (undef, num_off_diag)
27
30
abs_minus = Vector {CI} (undef, num_off_diag)
@@ -38,27 +41,43 @@ function MOI.Bridges.Constraint.bridge_constraint(
38
41
MOI. Utilities. operate! (- , T, g[j], fabs)
39
42
MOI. Utilities. operate! (- , T, g[i], fabs)
40
43
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
+ )
42
48
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
+ )
44
53
end
45
54
k += 1
46
55
MOI. Utilities. operate! (+ , T, g[j], fs[k])
47
56
end
48
57
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
+ )
51
64
end
52
65
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
+ )
56
71
return true
57
72
end
58
- function MOI. Bridges. added_constrained_variable_types (:: Type{<:DiagonallyDominantBridge} )
73
+ function MOI. Bridges. added_constrained_variable_types (
74
+ :: Type{<:DiagonallyDominantBridge} ,
75
+ )
59
76
return Tuple{DataType}[]
60
77
end
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}
62
81
added = [(F, MOI. GreaterThan{T})]
63
82
if F != MOI. ScalarAffineFunction{T}
64
83
push! (added, (MOI. ScalarAffineFunction{T}, MOI. GreaterThan{T}))
68
87
function MOI. Bridges. Constraint. concrete_bridge_type (
69
88
:: Type{<:DiagonallyDominantBridge{T}} ,
70
89
G:: Type{<:MOI.AbstractVectorFunction} ,
71
- :: Type{SOS.DiagonallyDominantConeTriangle} ) where T
72
-
90
+ :: Type{SOS.DiagonallyDominantConeTriangle} ,
91
+ ) where {T}
73
92
S = MOI. Utilities. scalar_type (G)
74
93
F = MOI. Utilities. promote_operation (- , T, S, MOI. VariableIndex)
75
- return DiagonallyDominantBridge{T, F, G}
94
+ return DiagonallyDominantBridge{T,F, G}
76
95
end
77
96
78
97
# Attributes, Bridge acting as an model
82
101
function MOI. get (bridge:: DiagonallyDominantBridge , :: MOI.ListOfVariableIndices )
83
102
return bridge. abs_vars
84
103
end
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}
93
116
return length (bridge. abs_plus) + length (bridge. abs_minus)
94
117
end
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}
97
122
return length (bridge. dominance)
98
123
end
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}
102
131
return vcat (bridge. abs_plus, bridge. abs_minus, bridge. dominance)
103
132
end
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}
107
140
return vcat (bridge. abs_plus, bridge. abs_minus)
108
141
end
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}
111
146
return bridge. dominance
112
147
end
113
148
@@ -128,37 +163,50 @@ function MOI.delete(model::MOI.ModelLike, bridge::DiagonallyDominantBridge)
128
163
end
129
164
130
165
# 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
+ )
133
171
return SOS. DiagonallyDominantConeTriangle (length (bridge. dominance))
134
172
end
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}
137
178
set = MOI. get (model, MOI. ConstraintSet (), bridge)
138
179
H = MOI. Utilities. scalar_type (G)
139
180
g = Vector {H} (undef, MOI. dimension (set))
140
181
k = 0
141
182
koff = 0
142
183
for j in 1 : MOI. side_dimension (set)
143
- for i in 1 : (j - 1 )
184
+ for i in 1 : (j- 1 )
144
185
k += 1
145
186
koff += 1
146
187
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
+ )
149
192
end
150
193
k += 1
151
194
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
+ )
154
199
end
155
200
return MOI. Utilities. vectorize (g)
156
201
end
157
202
158
203
# TODO ConstraintPrimal
159
204
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}
162
210
dominance_dual = MOI. get (model, attr, bridge. dominance)
163
211
side_dim = length (dominance_dual)
164
212
dim = MOI. dimension (SOS. DiagonallyDominantConeTriangle (side_dim))
@@ -169,7 +217,7 @@ function MOI.get(model::MOI.ModelLike, attr::MOI.ConstraintDual,
169
217
k += 1
170
218
# Need to divide by 2 because of the custom scalar product for this
171
219
# cone
172
- dual[k] = (- dominance_dual[i] - dominance_dual[j]) / 2
220
+ dual[k] = (- dominance_dual[i] - dominance_dual[j]) / 2
173
221
end
174
222
k += 1
175
223
dual[k] = dominance_dual[j]
0 commit comments