@@ -162,6 +162,7 @@ function NLPModels.jac_nln_structure!(
162162 if nlp. quadcon. nquad > 0
163163 index = 0
164164 for i = 1 : (nlp. quadcon. nquad)
165+ # qcon.g is the sparsity pattern of the gradient of the quadratic constraint qcon
165166 qcon = nlp. quadcon. constraints[i]
166167 ind_quad = (index + 1 ): (index + qcon. nnzg)
167168 view (rows, ind_quad) .= i
@@ -190,6 +191,7 @@ function NLPModels.jac_structure!(
190191 if nlp. quadcon. nquad > 0
191192 index = 0
192193 for i = 1 : (nlp. quadcon. nquad)
194+ # qcon.g is the sparsity pattern of the gradient of the quadratic constraint qcon
193195 qcon = nlp. quadcon. constraints[i]
194196 ind_quad = (nlp. lincon. nnzj + index + 1 ): (nlp. lincon. nnzj + index + qcon. nnzg)
195197 view (rows, ind_quad) .= nlp. meta. nlin .+ i
@@ -288,6 +290,7 @@ function NLPModels.jprod_lin!(
288290 v:: AbstractVector ,
289291 Jv:: AbstractVector ,
290292)
293+ increment! (nlp, :neval_jprod_lin )
291294 jprod_lin! (
292295 nlp,
293296 nlp. lincon. jacobian. rows,
@@ -332,10 +335,10 @@ function NLPModels.jprod!(
332335 end
333336 if nlp. meta. nnln > 0
334337 if nlp. quadcon. nquad > 0
335- for i = (nlp . meta . nlin + 1 ) : (nlp . meta . nlin + nlp. quadcon. nquad)
338+ for i = 1 : ( nlp. quadcon. nquad)
336339 # Jv[i] = (Aᵢ * x + bᵢ)ᵀ * v
337340 qcon = nlp. quadcon. constraints[i]
338- Jv[i] = coo_sym_dot (qcon. A. rows, qcon. A. cols, qcon. A. vals, x, v) + dot (qcon. b, v)
341+ Jv[nlp . meta . nlin + i] = coo_sym_dot (qcon. A. rows, qcon. A. cols, qcon. A. vals, x, v) + dot (qcon. b, v)
339342 end
340343 end
341344 if nlp. meta. nnln > nlp. quadcon. nquad
@@ -352,6 +355,7 @@ function NLPModels.jtprod_lin!(
352355 v:: AbstractVector ,
353356 Jtv:: AbstractVector ,
354357)
358+ increment! (nlp, :neval_jtprod_lin )
355359 jtprod_lin! (
356360 nlp,
357361 nlp. lincon. jacobian. rows,
@@ -386,6 +390,32 @@ function NLPModels.jtprod_nln!(
386390 return Jtv
387391end
388392
393+ function NLPModels. jtprod! (
394+ nlp:: MathOptNLPModel ,
395+ x:: AbstractVector ,
396+ v:: AbstractVector ,
397+ Jtv:: AbstractVector ,
398+ )
399+ increment! (nlp, :neval_jtprod )
400+ if nlp. meta. nnln > nlp. quadcon. nquad
401+ ind_nnln = (nlp. quadcon. nquad + 1 ): (nlp. meta. nnln)
402+ MOI. eval_constraint_jacobian_transpose_product (nlp. eval, Jtv, x, view (v, ind_nnln))
403+ end
404+ if nlp. meta. nlin > 0
405+ jtprod_lin! (nlp, nlp. lincon. jacobian. rows, nlp. lincon. jacobian. cols, nlp. lincon. jacobian. vals, v, Jtv)
406+ end
407+ (nlp. meta. nnln == nlp. quadcon. nquad) && (Jtv .= 0.0 )
408+ if nlp. quadcon. nquad > 0
409+ for i = 1 : (nlp. quadcon. nquad)
410+ # Jtv += v[i] * (Aᵢ * x + bᵢ)
411+ qcon = nlp. quadcon. constraints[i]
412+ coo_sym_add_mul! (qcon. A. rows, qcon. A. cols, qcon. A. vals, x, Jtv, v[i])
413+ Jtv .+ = v[i] .* qcon. b
414+ end
415+ end
416+ return Jtv
417+ end
418+
389419function NLPModels. hess_structure! (
390420 nlp:: MathOptNLPModel ,
391421 rows:: AbstractVector{<:Integer} ,
0 commit comments