Skip to content

Commit c26f6bc

Browse files
authored
Improve jprod_residual! and jtprod_residual! (#123)
Improve jprod_residual! and jtprod_residual! ( Apply suggestions from @tmigot )
1 parent 490754b commit c26f6bc

File tree

2 files changed

+26
-50
lines changed

2 files changed

+26
-50
lines changed

src/moi_nls_model.jl

Lines changed: 22 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -143,67 +143,43 @@ end
143143
function NLPModels.jprod_residual!(
144144
nls::MathOptNLSModel,
145145
x::AbstractVector,
146-
rows::AbstractVector{<:Integer},
147-
cols::AbstractVector{<:Integer},
148146
v::AbstractVector,
149147
Jv::AbstractVector,
150148
)
151-
vals = jac_coord_residual(nls, x)
152-
decrement!(nls, :neval_jac_residual)
153-
jprod_residual!(nls, rows, cols, vals, v, Jv)
154-
return Jv
155-
end
156-
157-
function NLPModels.jprod_residual!(
158-
nls::MathOptNLSModel,
159-
x::AbstractVector,
160-
v::AbstractVector,
161-
Jv::AbstractVector,
162-
)
163-
rows, cols = jac_structure_residual(nls)
164-
jprod_residual!(nls, x, rows, cols, v, Jv)
149+
increment!(nls, :neval_jprod_residual)
150+
nls.nls_meta.nlin > 0 && (Jv .= 0.0)
151+
if nls.nls_meta.nnln > 0
152+
MOI.eval_constraint_jacobian_product(nls.Feval, view(Jv, nls.nls_meta.nln), x, v)
153+
end
154+
if nls.nls_meta.nlin > 0
155+
for k = 1:nls.linequ.nnzj
156+
row, col, val = nls.linequ.jacobian.rows[k], nls.linequ.jacobian.cols[k], nls.linequ.jacobian.vals[k]
157+
Jv[row] += v[col] * val
158+
end
159+
end
165160
return Jv
166161
end
167162

168-
function NLPModels.jtprod_residual!(
169-
nls::MathOptNLSModel,
170-
x::AbstractVector,
171-
rows::AbstractVector{<:Integer},
172-
cols::AbstractVector{<:Integer},
173-
v::AbstractVector,
174-
Jtv::AbstractVector,
175-
)
176-
vals = jac_coord_residual(nls, x)
177-
decrement!(nls, :neval_jac_residual)
178-
jtprod_residual!(nls, rows, cols, vals, v, Jtv)
179-
return Jtv
180-
end
181-
182163
function NLPModels.jtprod_residual!(
183164
nls::MathOptNLSModel,
184165
x::AbstractVector,
185166
v::AbstractVector,
186167
Jtv::AbstractVector,
187168
)
188-
rows, cols = jac_structure_residual(nls)
189-
jtprod_residual!(nls, x, rows, cols, v, Jtv)
169+
increment!(nls, :neval_jtprod_residual)
170+
nls.nls_meta.nlin > 0 && (Jtv .= 0.0)
171+
if nls.nls_meta.nnln > 0
172+
MOI.eval_constraint_jacobian_transpose_product(nls.Feval, Jtv, x, view(v, nls.nls_meta.nln))
173+
end
174+
if nls.nls_meta.nlin > 0
175+
for k = 1:nls.linequ.nnzj
176+
row, col, val = nls.linequ.jacobian.rows[k], nls.linequ.jacobian.cols[k], nls.linequ.jacobian.vals[k]
177+
Jtv[col] += v[row] * val
178+
end
179+
end
190180
return Jtv
191181
end
192182

193-
# Uncomment when :JacVec becomes available in MOI.
194-
#
195-
# function NLPModels.jprod_residual!(nls :: MathOptNLSModel, x :: AbstractVector, v :: AbstractVector, Jv :: AbstractVector)
196-
# increment!(nls, :neval_jprod_residual)
197-
# MOI.eval_constraint_jacobian_product(nls.Feval, Jv, x, v)
198-
# return Jv
199-
# end
200-
#
201-
# function NLPModels.jtprod_residual!(nls :: MathOptNLSModel, x :: AbstractVector, v :: AbstractVector, Jtv :: AbstractVector)
202-
# increment!(nls, :neval_jtprod_residual)
203-
# MOI.eval_constraint_jacobian_transpose_product(nls.Feval, Jtv, x, v)
204-
# return Jtv
205-
# end
206-
207183
function NLPModels.hess_structure_residual!(
208184
nls::MathOptNLSModel,
209185
rows::AbstractVector{<:Integer},

src/utils.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -369,13 +369,13 @@ function parser_nonlinear_expression(cmodel, nvar, F; hessian::Bool = true)
369369
ceval = cmodel.nlp_data == nothing ? nothing : NLPEvaluator(cmodel)
370370
(ceval nothing) &&
371371
(nnlnequ == 0) &&
372-
MOI.initialize(ceval, hessian ? [:Grad, :Jac, :Hess, :HessVec] : [:Grad, :Jac]) # Add :JacVec when available
372+
MOI.initialize(ceval, hessian ? [:Grad, :Jac, :JacVec, :Hess, :HessVec] : [:Grad, :Jac, :JacVec])
373373
(ceval nothing) &&
374374
(nnlnequ > 0) &&
375375
MOI.initialize(
376376
ceval,
377-
hessian ? [:Grad, :Jac, :Hess, :HessVec, :ExprGraph] : [:Grad, :Jac, :ExprGraph],
378-
) # Add :JacVec when available
377+
hessian ? [:Grad, :Jac, :JacVec, :Hess, :HessVec, :ExprGraph] : [:Grad, :Jac, :JacVec, :ExprGraph]
378+
)
379379

380380
if nnlnequ == 0
381381
Feval = nothing
@@ -405,7 +405,7 @@ function parser_nonlinear_expression(cmodel, nvar, F; hessian::Bool = true)
405405
end
406406
end
407407
Feval = NLPEvaluator(Fmodel)
408-
MOI.initialize(Feval, hessian ? [:Grad, :Jac, :Hess, :HessVec] : [:Grad, :Jac]) # Add :JacVec when available
408+
MOI.initialize(Feval, hessian ? [:Grad, :Jac, :JacVec, :Hess, :HessVec] : [:Grad, :Jac, :JacVec])
409409
Feval.user_output_buffer = ceval.user_output_buffer
410410
end
411411
return ceval, Feval, nnlnequ

0 commit comments

Comments
 (0)