Skip to content

Commit ce2fa77

Browse files
geoffroylecontedpo
authored andcommitted
default to coo
1 parent 7c96d13 commit ce2fa77

File tree

3 files changed

+31
-7
lines changed

3 files changed

+31
-7
lines changed

src/linalg_utils.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ function SparseArrays.nnz(M::Symmetric{T, <:DenseMatrix{T}}) where {T}
77
n = size(M, 1)
88
return n * (n + 1) / 2
99
end
10+
SparseArrays.nnz(M::Symmetric{T, <:AbstractSparseMatrix{T}}) where {T} = nnz(M.data)

src/qpmodel.jl

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ end
1414

1515
isdense(data::QPData{T, S, M1, M2}) where {T, S, M1, M2} = M1 <: DenseMatrix || M2 <: DenseMatrix
1616

17+
function convertQPData_toCOO(data::QPData{T, S, M1, M2}) where {T, S, M1 <: AbstractMatrix, M2 <: AbstractMatrix}
18+
(M1 <: SparseMatrixCOO) && (M2 <: SparseMatrixCOO) && return data
19+
HCOO = (M1 <: SparseMatrixCOO) ? data.H : SparseMatrixCOO(data.H)
20+
ACOO = (M2 <: SparseMatrixCOO) ? data.A : SparseMatrixCOO(data.A)
21+
return QPData(data.c0, data.c, HCOO, ACOO)
22+
end
23+
1724
function get_QPDataCOO(c0::T, c::S, H::SparseMatrixCSC{T}, A::AbstractMatrix{T}) where {T, S}
1825
ncon, nvar = size(A)
1926
tril!(H)
@@ -152,20 +159,36 @@ function QuadraticModel(
152159
lvar::S = fill!(S(undef, length(c)), T(-Inf)),
153160
uvar::S = fill!(S(undef, length(c)), T(Inf)),
154161
c0::T = zero(T),
162+
coo_matrices = true,
155163
kwargs...,
156164
) where {T, S}
157165
ncon, nvar = size(A)
158166
if typeof(H) <: AbstractLinearOperator # convert A to a LinOp if A is a Matrix?
159167
nnzh = 0
160168
nnzj = 0
161169
data = QPData(c0, c, H, A)
162-
elseif issparse(H)
163-
data, nnzh, nnzj = get_QPDataCOO(c0, c, H, A)
164170
else
165-
nnzh = typeof(H) <: DenseMatrix ? nvar * (nvar + 1) / 2 : nnz(H)
166-
nnzj = nnz(A)
167-
data = QPData(c0, c, H, A)
171+
if coo_matrices
172+
if typeof(H) <: Symmetric && !(typeof(H.data) <: SparseMatrixCOO)
173+
tril!(H.data)
174+
HCOO = SparseMatrixCOO(H.data)
175+
elseif !(typeof(H) <: SparseMatrixCOO)
176+
tril!(H)
177+
HCOO = SparseMatrixCOO(H)
178+
else
179+
HCOO = H
180+
end
181+
ACOO = !(typeof(A) <: SparseMatrixCOO) ? SparseMatrixCOO(A) : ACOO = A
182+
nnzh = nnz(HCOO)
183+
nnzj = nnz(ACOO)
184+
data = QPData(c0, c, HCOO, ACOO)
185+
else
186+
nnzh = typeof(H) <: DenseMatrix ? nvar * (nvar + 1) / 2 : nnz(H)
187+
nnzj = nnz(A)
188+
data = QPData(c0, c, H, A)
189+
end
168190
end
191+
169192
QuadraticModel(
170193
NLPModelMeta(
171194
nvar,
@@ -466,7 +489,7 @@ function NLPModelsModifiers.SlackModel(qp::AbstractQuadraticModel, name = qp.met
466489
T = eltype(qp.data.c)
467490

468491
if isdense(qp.data) # convert to QPDataCOO first
469-
dataCOO, nnzj, nnzh = get_QPDataCOO(qp.data.c0, qp.data.c, qp.data.H, qp.data.A)
492+
dataCOO = convertQPData_toCOO(qp.data)
470493
data = slackdata(dataCOO, qp.meta, ns)
471494
else
472495
data = slackdata(qp.data, qp.meta, ns)

test/runtests.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ end
128128
@testset "LinearOperators" begin
129129
nvar, ncon = 10, 7
130130
T = Float64
131-
H = Symmetric(tril!(sprand(T, nvar, nvar, 0.3)))
131+
H = Symmetric(tril!(sprand(T, nvar, nvar, 0.3)), :L)
132132
A = sprand(T, ncon, nvar, 0.4)
133133
c = rand(nvar)
134134
lvar = fill(-Inf, nvar)

0 commit comments

Comments
 (0)