1
1
export jac_structure!, hess_structure!, jac_coord!, hess_coord!, SlackModel!
2
2
3
- mutable struct QPData{T}
3
+ mutable struct QPData{T, S }
4
4
c0:: T # constant term in objective
5
- c:: Vector{T} # linear term
5
+ c:: S # linear term
6
6
Hrows:: Vector{Int} # quadratic term
7
7
Hcols:: Vector{Int}
8
- Hvals:: Vector{T}
8
+ Hvals:: S
9
9
Arows:: Vector{Int} # constraints matrix
10
10
Acols:: Vector{Int}
11
- Avals:: Vector{T}
11
+ Avals:: S
12
12
end
13
13
14
- abstract type AbstractQuadraticModel <: AbstractNLPModel end
14
+ abstract type AbstractQuadraticModel{T, S} <: AbstractNLPModel{T, S} end
15
15
16
16
"""
17
17
qp = QuadraticModel(c, Hrows, Hcols, Hvals; Arows = Arows, Acols = Acols, Avals = Avals,
@@ -29,10 +29,10 @@ create a Quadratic model from a QPS file:
29
29
qps = readqps("QAFIRO.SIF")
30
30
qp = QuadraticModel(qps)
31
31
"""
32
- mutable struct QuadraticModel <: AbstractQuadraticModel
33
- meta:: NLPModelMeta
32
+ mutable struct QuadraticModel{T, S} <: AbstractQuadraticModel{T, S}
33
+ meta:: NLPModelMeta{T, S}
34
34
counters:: Counters
35
- data:: QPData
35
+ data:: QPData{T, S}
36
36
end
37
37
38
38
function QuadraticModel (
@@ -42,11 +42,11 @@ function QuadraticModel(
42
42
Hvals:: AbstractVector ;
43
43
Arows:: AbstractVector{<:Integer} = Int[],
44
44
Acols:: AbstractVector{<:Integer} = Int[],
45
- Avals:: AbstractVector = T[] ,
46
- lcon:: AbstractVector = T[] ,
47
- ucon:: AbstractVector = T[] ,
48
- lvar:: AbstractVector = fill ( T ( - Inf ) , length (c)),
49
- uvar:: AbstractVector = fill ( T ( Inf ) , length (c)),
45
+ Avals:: AbstractVector = similar (c, 0 ) ,
46
+ lcon:: AbstractVector = similar (c, 0 ) ,
47
+ ucon:: AbstractVector = similar (c, 0 ) ,
48
+ lvar:: AbstractVector = fill! ( similar (c , length (c)), T ( - Inf )),
49
+ uvar:: AbstractVector = fill! ( similar (c , length (c)), T ( Inf )),
50
50
c0:: T = zero (T),
51
51
kwargs... ,
52
52
) where {T}
89
89
function QuadraticModel (
90
90
c:: AbstractVector{T} ,
91
91
H:: SparseMatrixCSC{T, Int} ;
92
- A:: AbstractMatrix = zeros (T , 0 , length (c)),
93
- lcon:: AbstractVector = zeros (T , 0 ),
94
- ucon:: AbstractVector = zeros (T , 0 ),
95
- lvar:: AbstractVector = fill ( T ( - Inf ) , length (c)),
96
- uvar:: AbstractVector = fill ( T ( Inf ) , length (c)),
92
+ A:: AbstractMatrix = similar (c , 0 , length (c)),
93
+ lcon:: AbstractVector = similar (c , 0 ),
94
+ ucon:: AbstractVector = similar (c , 0 ),
95
+ lvar:: AbstractVector = fill! ( similar (c , length (c)), T ( - Inf )),
96
+ uvar:: AbstractVector = fill! ( similar (c , length (c)), T ( Inf )),
97
97
c0:: T = zero (T),
98
98
kwargs... ,
99
99
) where {T}
100
100
ncon, nvar = size (A)
101
101
tril! (H)
102
102
nnzh, Hrows, Hcols, Hvals = nnz (H), findnz (H)...
103
103
nnzj, Arows, Acols, Avals = if ncon == 0
104
- 0 , Int[], Int[], T[]
104
+ 0 , Int[], Int[], similar (c, 0 )
105
105
elseif issparse (A)
106
106
nnz (A), findnz (A)...
107
107
else
@@ -136,7 +136,7 @@ QuadraticModel(c::AbstractVector{T}, H::AbstractMatrix; args...) where {T} =
136
136
137
137
Creates a quadratic Taylor model of `nlp` around `x`.
138
138
"""
139
- function QuadraticModel (model:: AbstractNLPModel , x:: AbstractVector ; kwargs... )
139
+ function QuadraticModel (model:: AbstractNLPModel{T, S} , x:: AbstractVector ; kwargs... ) where {T, S}
140
140
nvar = model. meta. nvar
141
141
ncon = model. meta. ncon
142
142
c0 = obj (model, x)
@@ -160,7 +160,7 @@ function QuadraticModel(model::AbstractNLPModel, x::AbstractVector; kwargs...)
160
160
ucon = model. meta. ucon .- c,
161
161
lvar = model. meta. lvar .- x,
162
162
uvar = model. meta. uvar .- x,
163
- x0 = zeros ( model. meta. nvar),
163
+ x0 = fill! ( S (undef, model. meta. nvar), zero (T) ),
164
164
)
165
165
else
166
166
QuadraticModel (
@@ -171,7 +171,7 @@ function QuadraticModel(model::AbstractNLPModel, x::AbstractVector; kwargs...)
171
171
c0 = c0,
172
172
lvar = model. meta. lvar .- x,
173
173
uvar = model. meta. uvar .- x,
174
- x0 = zeros ( model. meta. nvar),
174
+ x0 = fill! ( S (undef, model. meta. nvar), zero (T) ),
175
175
)
176
176
end
177
177
end
@@ -187,9 +187,9 @@ function NLPModels.objgrad!(qp::AbstractQuadraticModel, x::AbstractVector, g::Ab
187
187
return f, g
188
188
end
189
189
190
- function NLPModels. obj (qp:: AbstractQuadraticModel , x:: AbstractVector )
190
+ function NLPModels. obj (qp:: AbstractQuadraticModel{T, S} , x:: AbstractVector ) where {T, S}
191
191
NLPModels. increment! (qp, :neval_obj )
192
- Hx = zeros ( qp. meta. nvar)
192
+ Hx = fill! ( S (undef, qp. meta. nvar), zero (T) )
193
193
coo_sym_prod! (qp. data. Hrows, qp. data. Hcols, qp. data. Hvals, x, Hx)
194
194
return qp. data. c0 + dot (qp. data. c, x) + dot (Hx, x) / 2
195
195
end
@@ -325,13 +325,13 @@ function NLPModelsModifiers.SlackModel(qp::AbstractQuadraticModel, name = qp.met
325
325
326
326
data = QPData (
327
327
copy (qp. data. c0),
328
- [qp. data. c; zeros (T , ns)],
328
+ [qp. data. c; fill! ( similar (qp . data . c , ns), zero (T) )],
329
329
copy (qp. data. Hrows),
330
330
copy (qp. data. Hcols),
331
331
copy (qp. data. Hvals),
332
332
[qp. data. Arows; qp. meta. jlow; qp. meta. jupp; qp. meta. jrng],
333
333
[qp. data. Acols; (qp. meta. nvar + 1 ): (qp. meta. nvar + ns)],
334
- [qp. data. Avals; .- ones (T , ns)],
334
+ [qp. data. Avals; fill! ( similar (qp . data . c , ns), - one (T) )],
335
335
)
336
336
meta = NLPModelsModifiers. slack_meta (qp. meta, name = qp. meta. name)
337
337
0 commit comments