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
17
+ function Base. convert (:: Type{QPData{T, S, MCOO, MCOO}} , data:: QPData{T, S, M1, M2} ) where {T, S, M1 <: AbstractMatrix , M2 <: AbstractMatrix , MCOO <: SparseMatrixCOO{T} }
19
18
HCOO = (M1 <: SparseMatrixCOO ) ? data. H : SparseMatrixCOO (data. H)
20
19
ACOO = (M2 <: SparseMatrixCOO ) ? data. A : SparseMatrixCOO (data. A)
21
20
return QPData (data. c0, data. c, HCOO, ACOO)
22
21
end
22
+ Base. convert (:: Type{QPData{T, S, MCOO, MCOO}} , data:: QPData{T, S, M1, M2} ) where {T, S, M1 <: SparseMatrixCOO , M2 <: SparseMatrixCOO , MCOO <: SparseMatrixCOO{T} } = data
23
23
24
24
abstract type AbstractQuadraticModel{T, S} <: AbstractNLPModel{T, S} end
25
25
@@ -262,25 +262,21 @@ end
262
262
# TODO : Better hess_op
263
263
264
264
function NLPModels. hess_structure! (
265
- qp:: QuadraticModel ,
265
+ qp:: QuadraticModel{T, S, M1} ,
266
266
rows:: AbstractVector{<:Integer} ,
267
267
cols:: AbstractVector{<:Integer} ,
268
- )
269
- typeof (qp. data. H) <: SparseMatrixCOO ||
270
- error (" hess_structure! should be used only if H is a SparseMatrixCOO" )
268
+ ) where {T, S, M1 <: SparseMatrixCOO }
271
269
rows .= qp. data. H. rows
272
270
cols .= qp. data. H. cols
273
271
return rows, cols
274
272
end
275
273
276
274
function NLPModels. hess_coord! (
277
- qp:: QuadraticModel{T} ,
275
+ qp:: QuadraticModel{T, S, M1 } ,
278
276
x:: AbstractVector{T} ,
279
277
vals:: AbstractVector{T} ;
280
278
obj_weight:: Real = one (eltype (x)),
281
- ) where {T}
282
- typeof (qp. data. H) <: SparseMatrixCOO ||
283
- error (" hess_coord! should be used only if H is a SparseMatrixCOO" )
279
+ ) where {T, S, M1 <: SparseMatrixCOO }
284
280
NLPModels. increment! (qp, :neval_hess )
285
281
vals .= obj_weight * qp. data. H. vals
286
282
return vals
@@ -295,20 +291,20 @@ NLPModels.hess_coord!(
295
291
) = hess_coord! (qp, x, vals, obj_weight = obj_weight)
296
292
297
293
function NLPModels. jac_structure! (
298
- qp:: QuadraticModel ,
294
+ qp:: QuadraticModel{T, S, M1, M2} ,
299
295
rows:: AbstractVector{<:Integer} ,
300
296
cols:: AbstractVector{<:Integer} ,
301
- )
302
- typeof (qp. data. A) <: SparseMatrixCOO ||
303
- error (" jac_structure! should be used only if A is a SparseMatrixCOO" )
297
+ ) where {T, S, M1, M2 <: SparseMatrixCOO }
304
298
rows .= qp. data. A. rows
305
299
cols .= qp. data. A. cols
306
300
return rows, cols
307
301
end
308
302
309
- function NLPModels. jac_coord! (qp:: QuadraticModel , x:: AbstractVector , vals:: AbstractVector )
310
- typeof (qp. data. A) <: SparseMatrixCOO ||
311
- error (" jac_coord! should be used only if A is a SparseMatrixCOO" )
303
+ function NLPModels. jac_coord! (
304
+ qp:: QuadraticModel{T, S, M1, M2} ,
305
+ x:: AbstractVector ,
306
+ vals:: AbstractVector
307
+ ) where {T, S, M1, M2 <: SparseMatrixCOO }
312
308
NLPModels. increment! (qp, :neval_jac )
313
309
vals .= qp. data. A. vals
314
310
return vals
@@ -434,14 +430,13 @@ function slackdata(data::QPData{T}, meta::NLPModelMeta{T}, ns::Int) where {T}
434
430
)
435
431
end
436
432
437
- function NLPModelsModifiers. SlackModel (qp:: AbstractQuadraticModel , name = qp. meta. name * " -slack" )
433
+ function NLPModelsModifiers. SlackModel (qp:: AbstractQuadraticModel{T, S} , name = qp. meta. name * " -slack" ) where {T, S}
438
434
qp. meta. ncon == length (qp. meta. jfix) && return qp
439
435
nfix = length (qp. meta. jfix)
440
436
ns = qp. meta. ncon - nfix
441
- T = eltype (qp. data. c)
442
437
443
438
if isdense (qp. data) # convert to QPDataCOO first
444
- dataCOO = convertQPData_toCOO ( qp. data)
439
+ dataCOO = convert (QPData{T, S, SparseMatrixCOO{T, Int}, SparseMatrixCOO{T, Int}}, qp. data)
445
440
data = slackdata (dataCOO, qp. meta, ns)
446
441
else
447
442
data = slackdata (qp. data, qp. meta, ns)
0 commit comments