@@ -8,23 +8,18 @@ using SparseArrays
88
99import MathOptInterface as MOI
1010
11+ struct DecomposedConstraintIndex
12+ neqns:: Int
13+ indices:: Vector{Int}
14+ cliques:: Vector{Vector{Int}}
15+ end
16+
1117const DICT = Dict{
1218 MOI. ConstraintIndex{
1319 MOI. VectorAffineFunction{Float64},
14- MOI. PositiveSemidefiniteConeTriangle},
15- Tuple{
16- MOI. ConstraintIndex{
17- MOI. VectorAffineFunction{Float64},
18- MOI. Zeros},
19- Vector{
20- MOI. ConstraintIndex{
21- MOI. VectorOfVariables,
22- MOI. PositiveSemidefiniteConeTriangle,
23- },
24- },
25- Vector{Vector{Int}},
26- Int,
20+ MOI. PositiveSemidefiniteConeTriangle,
2721 },
22+ DecomposedConstraintIndex,
2823}
2924
3025mutable struct Optimizer <: MOI.AbstractOptimizer
@@ -215,7 +210,7 @@ function MOI.add_constraint(
215210 end
216211
217212 # terms
218- indices = MOI . ConstraintIndex{MOI . VectorOfVariables, MOI . PositiveSemidefiniteConeTriangle} []
213+ indices = Int []
219214 terms = MOI. VectorAffineTerm{T}[]
220215
221216 for clique in cliques
@@ -226,8 +221,9 @@ function MOI.add_constraint(
226221 v = U[idx (i, j)]
227222 push! (terms, MOI. VectorAffineTerm (idx (clique[i], clique[j]), MOI. ScalarAffineTerm (- 1.0 , v)))
228223 end
229-
230- push! (indices, MOI. add_constraint (model. inner, MOI. VectorOfVariables (U), MOI. PositiveSemidefiniteConeTriangle (m)))
224+
225+ index = MOI. add_constraint (model. inner, MOI. VectorOfVariables (U), MOI. PositiveSemidefiniteConeTriangle (m))
226+ push! (indices, index. value)
231227 end
232228
233229 for (v, a) in zip (V, A), j in axes (a, 2 )
@@ -254,7 +250,7 @@ function MOI.add_constraint(
254250
255251 index = MOI. add_constraint (model. inner, MOI. VectorAffineFunction (terms, constants), MOI. Zeros (n * (n + 1 ) ÷ 2 ))
256252 outer = MOI. ConstraintIndex {MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle} (index. value)
257- model. outer_to_inner[outer] = (index , indices, cliques, n )
253+ model. outer_to_inner[outer] = DecomposedConstraintIndex (n , indices, cliques)
258254 return outer
259255end
260256
@@ -286,15 +282,17 @@ function MOI.get(
286282 F<: MOI.VectorAffineFunction{Float64} ,
287283 S<: MOI.PositiveSemidefiniteConeTriangle ,
288284}
289- index, indices, cliques, n = model. outer_to_inner[index]
290- result = zeros (Float64, n * (n + 1 ) ÷ 2 )
285+ inner = model. outer_to_inner[index]
286+ result = zeros (Float64, inner . neqns * (inner . neqns + 1 ) ÷ 2 )
291287
292- for (index, clique) in zip (indices, cliques)
293- m = length (clique)
294- vector = MOI. get (model. inner, attribute, index)
288+ for (value, clique) in zip (inner. indices, inner. cliques)
289+ vector = MOI. get (model. inner, attribute, MOI. ConstraintIndex {MOI.VectorOfVariables, MOI.PositiveSemidefiniteConeTriangle} (value))
295290
296- for j in oneto (m), i in oneto (j)
297- result[idx (clique[i], clique[j])] += vector[idx (i, j)]
291+ for (j, w) in enumerate (clique)
292+ for (i, v) in enumerate (clique)
293+ i > j && break
294+ result[idx (v, w)] += vector[idx (i, j)]
295+ end
298296 end
299297 end
300298
@@ -309,15 +307,17 @@ function MOI.get(
309307 F<: MOI.VectorAffineFunction{Float64} ,
310308 S<: MOI.PositiveSemidefiniteConeTriangle ,
311309}
312- index, indices, cliques, n = model. outer_to_inner[index]
313- result = zeros (Float64, n * (n + 1 ) ÷ 2 )
310+ inner = model. outer_to_inner[index]
311+ result = zeros (Float64, inner . neqns * (inner . neqns + 1 ) ÷ 2 )
314312
315- for (index, clique) in zip (indices, cliques)
316- m = length (clique)
317- vector = MOI. get (model. inner, attribute, index)
313+ for (value, clique) in zip (inner. indices, inner. cliques)
314+ vector = MOI. get (model. inner, attribute, MOI. ConstraintIndex {MOI.VectorOfVariables, MOI.PositiveSemidefiniteConeTriangle} (value))
318315
319- for j in oneto (m), i in oneto (j)
320- result[idx (clique[i], clique[j])] = vector[idx (i, j)]
316+ for (j, w) in enumerate (clique)
317+ for (i, v) in enumerate (clique)
318+ i > j && break
319+ result[idx (v, w)] = vector[idx (i, j)]
320+ end
321321 end
322322 end
323323
0 commit comments