Skip to content

Commit 2500d5d

Browse files
committed
Add struct.
1 parent 896bd2c commit 2500d5d

File tree

1 file changed

+31
-31
lines changed

1 file changed

+31
-31
lines changed

src/MathOptChordalDecomposition.jl

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,18 @@ using SparseArrays
88

99
import MathOptInterface as MOI
1010

11+
struct DecomposedConstraintIndex
12+
neqns::Int
13+
indices::Vector{Int}
14+
cliques::Vector{Vector{Int}}
15+
end
16+
1117
const 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

3025
mutable 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
259255
end
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

Comments
 (0)