|
14 | 14 |
|
15 | 15 | isdense(data::QPData{T, S, M1, M2}) where {T, S, M1, M2} = M1 <: DenseMatrix || M2 <: DenseMatrix
|
16 | 16 |
|
| 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 | + |
17 | 24 | function get_QPDataCOO(c0::T, c::S, H::SparseMatrixCSC{T}, A::AbstractMatrix{T}) where {T, S}
|
18 | 25 | ncon, nvar = size(A)
|
19 | 26 | tril!(H)
|
@@ -152,20 +159,36 @@ function QuadraticModel(
|
152 | 159 | lvar::S = fill!(S(undef, length(c)), T(-Inf)),
|
153 | 160 | uvar::S = fill!(S(undef, length(c)), T(Inf)),
|
154 | 161 | c0::T = zero(T),
|
| 162 | + coo_matrices = true, |
155 | 163 | kwargs...,
|
156 | 164 | ) where {T, S}
|
157 | 165 | ncon, nvar = size(A)
|
158 | 166 | if typeof(H) <: AbstractLinearOperator # convert A to a LinOp if A is a Matrix?
|
159 | 167 | nnzh = 0
|
160 | 168 | nnzj = 0
|
161 | 169 | data = QPData(c0, c, H, A)
|
162 |
| - elseif issparse(H) |
163 |
| - data, nnzh, nnzj = get_QPDataCOO(c0, c, H, A) |
164 | 170 | 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 |
168 | 190 | end
|
| 191 | + |
169 | 192 | QuadraticModel(
|
170 | 193 | NLPModelMeta(
|
171 | 194 | nvar,
|
@@ -466,7 +489,7 @@ function NLPModelsModifiers.SlackModel(qp::AbstractQuadraticModel, name = qp.met
|
466 | 489 | T = eltype(qp.data.c)
|
467 | 490 |
|
468 | 491 | 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) |
470 | 493 | data = slackdata(dataCOO, qp.meta, ns)
|
471 | 494 | else
|
472 | 495 | data = slackdata(qp.data, qp.meta, ns)
|
|
0 commit comments