@@ -13,20 +13,17 @@ mutable struct QPDataCOO{T, S} <: AbstractQPData{T, S}
13
13
Avals:: S
14
14
end
15
15
16
- mutable struct QPDataDense{T, S, M1 <: AbstractMatrix{T} , M2 <: AbstractMatrix{T} } < :
17
- AbstractQPData{T, S}
16
+ isdense (data:: QPDataCOO ) = false
17
+
18
+ mutable struct QPData{T, S, M1 <: Union{AbstractMatrix{T}, AbstractLinearOperator{T}} ,
19
+ M2 <: Union{AbstractMatrix{T}, AbstractLinearOperator{T}} } <: AbstractQPData{T, S}
18
20
c0:: T # constant term in objective
19
21
c:: S # linear term
20
22
H:: M1
21
23
A:: M2
22
24
end
23
25
24
- mutable struct QPDataLinOp{T, S, L1 <: AbstractLinearOperator{T} , L2 <: AbstractLinearOperator{T} } <: AbstractQPData{T, S}
25
- c0:: T
26
- c:: S
27
- H:: L1
28
- A:: L2
29
- end
26
+ isdense (data:: QPData{T, S, M1, M2} ) where {T, S, M1, M2} = (M1 <: DenseMatrix || M2 <: DenseMatrix ) ? true : false
30
27
31
28
function get_QPDataCOO (c0:: T , c :: S , H:: SparseMatrixCSC{T} , A:: AbstractMatrix{T} ) where {T, S}
32
29
ncon, nvar = size (A)
@@ -163,13 +160,13 @@ function QuadraticModel(
163
160
if typeof (H) <: AbstractLinearOperator # convert A to a LinOp if A is a Matrix?
164
161
nnzh = 0
165
162
nnzj = 0
166
- data = QPDataLinOp (c0, c, H, A)
163
+ data = QPData (c0, c, H, A)
167
164
elseif issparse (H)
168
165
data, nnzh, nnzj = get_QPDataCOO (c0, c, H, A)
169
166
else
170
167
nnzh = typeof (H) <: DenseMatrix ? nvar * (nvar + 1 ) / 2 : nnz (H)
171
168
nnzj = nnz (A)
172
- data = QPDataDense (c0, c, H, A)
169
+ data = QPData (c0, c, H, A)
173
170
end
174
171
QuadraticModel (
175
172
NLPModelMeta (
@@ -243,7 +240,7 @@ function NLPModels.objgrad!(qp::AbstractQuadraticModel, x::AbstractVector, g::Ab
243
240
NLPModels. increment! (qp, :neval_grad )
244
241
if typeof (qp. data) <: QPDataCOO
245
242
coo_sym_prod! (qp. data. Hrows, qp. data. Hcols, qp. data. Hvals, x, g)
246
- elseif typeof (qp. data) <: QPDataLinOp
243
+ elseif typeof (qp. data. H ) <: AbstractLinearOperator
247
244
mul! (g, qp. data. H, x)
248
245
else
249
246
mul! (g, Symmetric (qp. data. H, :L ), x)
@@ -258,7 +255,7 @@ function NLPModels.obj(qp::AbstractQuadraticModel{T, S}, x::AbstractVector) wher
258
255
Hx = fill! (S (undef, qp. meta. nvar), zero (T))
259
256
if typeof (qp. data) <: QPDataCOO
260
257
coo_sym_prod! (qp. data. Hrows, qp. data. Hcols, qp. data. Hvals, x, Hx)
261
- elseif typeof (qp. data) <: QPDataLinOp
258
+ elseif typeof (qp. data. H ) <: AbstractLinearOperator
262
259
mul! (Hx, qp. data. H, x)
263
260
else
264
261
mul! (Hx, Symmetric (qp. data. H, :L ), x)
@@ -270,7 +267,7 @@ function NLPModels.grad!(qp::AbstractQuadraticModel, x::AbstractVector, g::Abstr
270
267
NLPModels. increment! (qp, :neval_grad )
271
268
if typeof (qp. data) <: QPDataCOO
272
269
coo_sym_prod! (qp. data. Hrows, qp. data. Hcols, qp. data. Hvals, x, g)
273
- elseif typeof (qp. data) <: QPDataLinOp
270
+ elseif typeof (qp. data. H ) <: AbstractLinearOperator
274
271
mul! (g, qp. data. H, x)
275
272
else
276
273
mul! (g, Symmetric (qp. data. H, :L ), x)
@@ -383,7 +380,7 @@ function NLPModels.hprod!(
383
380
NLPModels. increment! (qp, :neval_hprod )
384
381
if typeof (qp. data) <: QPDataCOO
385
382
coo_sym_prod! (qp. data. Hrows, qp. data. Hcols, qp. data. Hvals, v, Hv)
386
- elseif typeof (qp. data) <: QPDataLinOp
383
+ elseif typeof (qp. data. H ) <: AbstractLinearOperator
387
384
mul! (Hv, qp. data. H, v)
388
385
else
389
386
mul! (Hv, Symmetric (qp. data. H, :L ), v)
@@ -479,8 +476,8 @@ function opPermutedMinusOnes(T::DataType, ncon::Int, ns::Int, p::Vector{Int})
479
476
return LinearOperator (T, ncon, ns, false , false , prod!, tprod!)
480
477
end
481
478
482
- function slackdata (data:: QPDataLinOp {T} , meta:: NLPModelMeta{T} , ns:: Int ) where {T}
483
- return QPDataLinOp (
479
+ function slackdata (data:: QPData {T} , meta:: NLPModelMeta{T} , ns:: Int ) where {T}
480
+ return QPData (
484
481
copy (data. c0),
485
482
[data. c; fill! (similar (data. c, ns), zero (T))],
486
483
BlockDiagonalOperator (data. H, opZeros (T, ns, ns)),
@@ -494,7 +491,7 @@ function NLPModelsModifiers.SlackModel(qp::AbstractQuadraticModel, name = qp.met
494
491
ns = qp. meta. ncon - nfix
495
492
T = eltype (qp. data. c)
496
493
497
- if typeof (qp. data) <: QPDataDense # convert to QPDataCOO first
494
+ if isdense (qp. data) # convert to QPDataCOO first
498
495
dataCOO, nnzj, nnzh = get_QPDataCOO (qp. data. c0, qp. data. c, qp. data. H, qp. data. A)
499
496
data = slackdata (dataCOO, qp. meta, ns)
500
497
else
0 commit comments