1
- mutable struct QPData
2
- c0:: Float64 # constant term in objective
3
- c:: AbstractVector{Float64} # linear term
4
- H:: AbstractMatrix{Float64} # quadratic term
5
- opH:: AbstractLinearOperator # assumed with preallocation!
6
- A:: AbstractMatrix{Float64} # constraint matrix
7
- end
1
+ # override some NLPModels functions
2
+ export jac_structure!, hess_structure!, jac_coord!, hess_coord!
8
3
9
- mutable struct QPCounters
10
- neval_hprod:: Int # number of products with H
11
- neval_jprod:: Int # number of products with A
12
- neval_jtprod:: Int # number of products with A'
13
- QPCounters () = new (0 , 0 , 0 )
4
+ mutable struct QPData
5
+ c0 :: Float64 # constant term in objective
6
+ c :: AbstractVector{Float64} # linear term
7
+ H :: AbstractMatrix{Float64} # quadratic term
8
+ opH :: AbstractLinearOperator # assumed with preallocation!
9
+ A :: AbstractMatrix{Float64} # constraint matrix
14
10
end
15
11
16
12
abstract type AbstractQuadraticModel <: AbstractNLPModel end
17
13
18
14
mutable struct QuadraticModel <: AbstractQuadraticModel
19
- meta:: NLPModelMeta
20
- counters:: QPCounters
21
- data:: QPData
22
-
23
- function QuadraticModel (c:: AbstractVector{Float64} , H:: AbstractMatrix{Float64} ,
24
- opH:: AbstractLinearOperator ,
25
- A:: AbstractMatrix{Float64} ,
26
- lcon:: AbstractVector{Float64} , ucon:: AbstractVector{Float64} ,
27
- lvar:: AbstractVector{Float64} , uvar:: AbstractVector{Float64} ;
28
- c0:: Float64 = 0.0 , kwargs... )
15
+ meta :: NLPModelMeta
16
+ counters :: Counters
17
+ data :: QPData
18
+
19
+ function QuadraticModel (c :: AbstractVector{Float64} , H :: AbstractMatrix{Float64} ,
20
+ opH :: AbstractLinearOperator ,
21
+ A :: AbstractMatrix{Float64} ,
22
+ lcon :: AbstractVector{Float64} , ucon :: AbstractVector{Float64} ,
23
+ lvar :: AbstractVector{Float64} , uvar :: AbstractVector{Float64} ;
24
+ c0 :: Float64 = 0.0 , kwargs... )
29
25
ncon, nvar = size (A)
30
26
nnzh = issparse (H) ? nnz (H) : (nvar * (nvar + 1 ) / 2 )
31
27
nnzj = issparse (A) ? nnz (A) : (nvar * ncon)
@@ -35,12 +31,12 @@ mutable struct QuadraticModel <: AbstractQuadraticModel
35
31
nnzj= nnzj,
36
32
nnzh= nnzh,
37
33
lin= 1 : ncon, nln= Int[], islp= (ncon == 0 ); kwargs... ),
38
- QPCounters (),
34
+ Counters (),
39
35
QPData (c0, c, H, opH, A))
40
36
end
41
37
end
42
38
43
- function QuadraticModel (model:: AbstractNLPModel )
39
+ function QuadraticModel (model :: AbstractNLPModel )
44
40
nvar = model. meta. nvar
45
41
ncon = model. meta. ncon
46
42
z = zeros (nvar)
54
50
55
51
linobj (qp:: AbstractQuadraticModel , args... ) = qp. data. c
56
52
57
- function objgrad (qp:: AbstractQuadraticModel , x:: AbstractVector )
53
+ function objgrad (qp :: AbstractQuadraticModel , x :: AbstractVector )
58
54
g = Vector {eltype(x)} (length (x))
59
55
objgrad! (qp, x, g)
60
56
end
61
57
62
- function objgrad! (qp:: AbstractQuadraticModel , x:: AbstractVector , g:: AbstractVector )
58
+ function objgrad! (qp :: AbstractQuadraticModel , x :: AbstractVector , g :: AbstractVector )
63
59
v = qp. data. opH * x
64
60
@. g = qp. data. c + v
65
61
f = qp. data. c0 + dot (qp. data. c, x) + 0.5 * dot (v, x)
66
62
qp. counters. neval_hprod += 1
67
63
(f, g)
68
64
end
69
65
70
- function obj (qp:: AbstractQuadraticModel , x:: AbstractVector )
66
+ function obj (qp :: AbstractQuadraticModel , x :: AbstractVector )
71
67
v = qp. data. opH * x
72
68
f = qp. data. c0 + dot (qp. data. c, x) + 0.5 * dot (v, x)
73
69
qp. counters. neval_hprod += 1
74
70
f
75
71
end
76
72
77
- function grad (qp:: AbstractQuadraticModel , x:: AbstractVector )
73
+ function grad (qp :: AbstractQuadraticModel , x :: AbstractVector )
78
74
g = Vector {eltype(x)} (undef, qp. meta. nvar)
79
75
grad! (qp, x, g)
80
76
end
81
77
82
- function grad! (qp:: AbstractQuadraticModel , x:: AbstractVector , g:: AbstractVector )
78
+ function grad! (qp :: AbstractQuadraticModel , x :: AbstractVector , g :: AbstractVector )
83
79
v = qp. data. opH * x
84
80
@. g = qp. data. c + v
85
81
qp. counters. neval_hprod += 1
86
82
g
87
83
end
88
84
89
- hess_coord (qp:: AbstractQuadraticModel , :: AbstractVector ; kwargs... ) = findnz (qp. data. H)
85
+ hess (qp :: AbstractQuadraticModel , :: AbstractVector ; kwargs... ) = qp. data. H
86
+
87
+ hess_op (qp :: AbstractQuadraticModel , :: AbstractVector ; kwargs... ) = qp. data. opH
88
+
89
+ hess_coord (qp :: AbstractQuadraticModel , :: AbstractVector ; kwargs... ) = findnz (qp. data. H)
90
+
91
+ """
92
+ Return the structure of the Lagrangian Hessian in sparse coordinate format in place.
93
+ """
94
+ function NLPModels. hess_structure! (qp :: QuadraticModel , rows :: Vector{<: Integer} , cols :: Vector{<: Integer} ; kwargs... )
95
+ rows .= qp. data. H. rowval
96
+ cols .= findnz (qp. data. H)[2 ]
97
+ end
98
+
99
+ """
100
+ Evaluate the Lagrangian Hessian at `x` in sparse coordinate format. Only the lower triangle is returned.
101
+ """
102
+ function NLPModels. hess_coord! (qp :: QuadraticModel , :: AbstractVector , rows :: AbstractVector{<: Integer} ,
103
+ cols :: AbstractVector{<: Integer} , vals :: Vector{<: AbstractFloat} ; kwargs... )
104
+ vals .= findnz (qp. data. H)[3 ]
105
+ end
90
106
91
- hess (qp:: AbstractQuadraticModel , :: AbstractVector ; kwargs... ) = qp. data. H
107
+ jac (qp :: AbstractQuadraticModel , :: AbstractVector ; kwargs... ) = qp. data. A
92
108
93
- hess_op (qp:: AbstractQuadraticModel , :: AbstractVector ; kwargs... ) = qp. data. opH
109
+ jac_op (qp :: AbstractQuadraticModel , :: AbstractVector ; kwargs... ) = LinearOperator ( qp. data. A)
94
110
95
- function cons (qp:: AbstractQuadraticModel , x:: AbstractVector )
111
+ jac_coord (qp :: AbstractQuadraticModel , :: AbstractVector ; kwargs... ) = findnz (qp. data. A)
112
+
113
+ """
114
+ Return the structure of the constraints Jacobian in sparse coordinate format in place.
115
+ """
116
+ function NLPModels. jac_structure! (qp :: QuadraticModel , rows :: Vector{<: Integer} , cols :: Vector{<: Integer} ; kwargs... )
117
+ rows .= qp. data. A. rowval
118
+ cols .= findnz (qp. data. A)[2 ]
119
+ end
120
+
121
+ """
122
+ Return the structure of the constraints Jacobian in sparse coordinate format in place.
123
+ """
124
+ function NLPModels. jac_coord! (qp :: QuadraticModel , x :: AbstractVector , rows :: Vector{<: Integer} ,
125
+ cols :: Vector{<: Integer} , vals :: Vector{<: AbstractFloat} ; kwargs... )
126
+ vals .= findnz (qp. data. A)[3 ]
127
+ end
128
+
129
+ function cons (qp:: AbstractQuadraticModel , x :: AbstractVector )
96
130
c = Vector {eltype(x)} (undef, qp. meta. ncon)
97
131
cons! (qp, x, c)
98
132
end
99
133
100
- function cons! (qp:: AbstractQuadraticModel , x:: AbstractVector , c:: AbstractVector )
134
+ function cons! (qp :: AbstractQuadraticModel , x :: AbstractVector , c :: AbstractVector )
101
135
mul! (c, qp. data. A, x)
102
136
qp. counters. neval_jprod += 1
103
137
c
104
138
end
105
139
106
- jac_coord (qp:: AbstractQuadraticModel , :: AbstractVector ; kwargs... ) = findnz (qp. data. A)
107
-
108
- jac (qp:: AbstractQuadraticModel , :: AbstractVector ; kwargs... ) = qp. data. A
109
-
110
- jac_op (qp:: AbstractQuadraticModel , :: AbstractVector ; kwargs... ) = LinearOperator (qp. data. A)
111
-
112
- function hprod (qp:: AbstractQuadraticModel , :: AbstractVector ; kwargs... )
140
+ function hprod (qp :: AbstractQuadraticModel , :: AbstractVector ; kwargs... )
113
141
@closure v -> begin
114
142
qp. counters. neval_hprod += 1
115
143
qp. data. opH * v
116
144
end
117
145
end
118
146
119
- function jprod (qp:: AbstractQuadraticModel , :: AbstractVector ; kwargs... )
147
+ function jprod (qp :: AbstractQuadraticModel , :: AbstractVector ; kwargs... )
120
148
@closure v -> begin
121
149
qp. counters. neval_jprod += 1
122
150
qp. data. A * v
123
151
end
124
152
end
125
153
126
- function jtprod (qp:: AbstractQuadraticModel , :: AbstractVector ; kwargs... )
154
+ function jtprod (qp :: AbstractQuadraticModel , :: AbstractVector ; kwargs... )
127
155
@closure v -> begin
128
156
qp. counters. neval_jtprod += 1
129
157
qp. data. A' * v
0 commit comments