@@ -8,10 +8,12 @@ mutable struct QPData{
8
8
}
9
9
c0:: T # constant term in objective
10
10
c:: S # linear term
11
+ v:: S # vector that stores products with the hessian v = H*
11
12
H:: M1
12
13
A:: M2
13
14
end
14
15
16
+ @inline QPData (c0, c, H, A) = QPData (c0, c, similar (c), H, A)
15
17
isdense (data:: QPData{T, S, M1, M2} ) where {T, S, M1, M2} = M1 <: DenseMatrix || M2 <: DenseMatrix
16
18
17
19
function Base. convert (
@@ -20,7 +22,7 @@ function Base.convert(
20
22
) where {T, S, M1 <: AbstractMatrix , M2 <: AbstractMatrix , MCOO <: SparseMatrixCOO{T} }
21
23
HCOO = (M1 <: SparseMatrixCOO ) ? data. H : SparseMatrixCOO (data. H)
22
24
ACOO = (M2 <: SparseMatrixCOO ) ? data. A : SparseMatrixCOO (data. A)
23
- return QPData (data. c0, data. c, HCOO, ACOO)
25
+ return QPData (data. c0, data. c, data . v, HCOO, ACOO)
24
26
end
25
27
Base. convert (
26
28
:: Type{QPData{T, S, MCOO, MCOO}} ,
256
258
257
259
function NLPModels. obj (qp:: AbstractQuadraticModel{T, S} , x:: AbstractVector ) where {T, S}
258
260
NLPModels. increment! (qp, :neval_obj )
259
- Hx = fill! (S (undef, qp. meta. nvar), zero (T))
260
- mul! (Hx, Symmetric (qp. data. H, :L ), x)
261
- return qp. data. c0 + dot (qp. data. c, x) + dot (Hx, x) / 2
261
+ mul! (qp. data. v, Symmetric (qp. data. H, :L ), x)
262
+ return qp. data. c0 + dot (qp. data. c, x) + dot (qp. data. v, x) / 2
262
263
end
263
264
264
265
function NLPModels. grad! (qp:: AbstractQuadraticModel , x:: AbstractVector , g:: AbstractVector )
0 commit comments