@@ -271,13 +271,35 @@ function NLPModels.cons_nln!(nls::MathOptNLSModel, x::AbstractVector, c::Abstrac
271271 return c
272272end
273273
274+ function NLPModels. cons! (nls:: MathOptNLSModel , x:: AbstractVector , c:: AbstractVector )
275+ increment! (nls, :neval_cons )
276+ if nls. meta. nlin > 0
277+ coo_prod! (nls. lincon. jacobian. rows, nls. lincon. jacobian. cols, nls. lincon. jacobian. vals, x, c)
278+ end
279+ if nls. meta. nnln > 0
280+ if nls. quadcon. nquad > 0
281+ for i = 1 : (nls. quadcon. nquad)
282+ qcon = nls. quadcon. constraints[i]
283+ c[nls. meta. nlin + i] =
284+ 0.5 * coo_sym_dot (qcon. A. rows, qcon. A. cols, qcon. A. vals, x, x) + dot (qcon. b, x)
285+ end
286+ end
287+ if nls. meta. nnln > nls. quadcon. nquad
288+ index_nnln = (nls. meta. nlin + nls. quadcon. nquad + 1 ): (nls. meta. ncon)
289+ MOI. eval_constraint (nls. ceval, view (c, index_nnln), x)
290+ end
291+ end
292+ return c
293+ end
294+
274295function NLPModels. jac_lin_structure! (
275296 nls:: MathOptNLSModel ,
276297 rows:: AbstractVector{<:Integer} ,
277298 cols:: AbstractVector{<:Integer} ,
278299)
279- view (rows, 1 : (nls. lincon. nnzj)) .= nls. lincon. jacobian. rows
280- view (cols, 1 : (nls. lincon. nnzj)) .= nls. lincon. jacobian. cols
300+ index_lin = 1 : (nls. lincon. nnzj)
301+ view (rows, index_lin) .= nls. lincon. jacobian. rows
302+ view (cols, index_lin) .= nls. lincon. jacobian. cols
281303 return rows, cols
282304end
283305
@@ -289,9 +311,11 @@ function NLPModels.jac_nln_structure!(
289311 if nls. quadcon. nquad > 0
290312 index = 0
291313 for i = 1 : (nls. quadcon. nquad)
314+ # qcon.g is the sparsity pattern of the gradient of the quadratic constraint qcon
292315 qcon = nls. quadcon. constraints[i]
293- view (rows, (index + 1 ): (index + qcon. nnzg)) .= i
294- view (cols, (index + 1 ): (index + qcon. nnzg)) .= qcon. g
316+ ind_quad = (index + 1 ): (index + qcon. nnzg)
317+ view (rows, ind_quad) .= i
318+ view (cols, ind_quad) .= qcon. g
295319 index += qcon. nnzg
296320 end
297321 end
@@ -303,17 +327,50 @@ function NLPModels.jac_nln_structure!(
303327 return rows, cols
304328end
305329
330+ function NLPModels. jac_structure! (
331+ nls:: MathOptNLSModel ,
332+ rows:: AbstractVector{<:Integer} ,
333+ cols:: AbstractVector{<:Integer} ,
334+ )
335+ if nls. meta. nlin > 0
336+ index_lin = 1 : (nls. lincon. nnzj)
337+ view (rows, index_lin) .= nls. lincon. jacobian. rows
338+ view (cols, index_lin) .= nls. lincon. jacobian. cols
339+ end
340+ if nls. meta. nnln > 0
341+ if nls. quadcon. nquad > 0
342+ index = 0
343+ for i = 1 : (nls. quadcon. nquad)
344+ # qcon.g is the sparsity pattern of the gradient of the quadratic constraint qcon
345+ qcon = nls. quadcon. constraints[i]
346+ ind_quad = (nls. lincon. nnzj + index + 1 ): (nls. lincon. nnzj + index + qcon. nnzg)
347+ view (rows, ind_quad) .= nls. meta. nlin .+ i
348+ view (cols, ind_quad) .= qcon. g
349+ index += qcon. nnzg
350+ end
351+ end
352+ if nls. meta. nnln > nls. quadcon. nquad
353+ ind_nnln = (nls. lincon. nnzj + nls. quadcon. nnzj + 1 ): (nls. meta. nnzj)
354+ view (rows, ind_nnln) .= nls. meta. nlin .+ nls. quadcon. nquad .+ nls. nlcon. jac_rows
355+ view (cols, ind_nnln) .= nls. nlcon. jac_cols
356+ end
357+ end
358+ return rows, cols
359+ end
360+
306361function NLPModels. jac_lin_coord! (nls:: MathOptNLSModel , x:: AbstractVector , vals:: AbstractVector )
307362 increment! (nls, :neval_jac_lin )
308- view (vals, 1 : (nls. lincon. nnzj)) .= nls. lincon. jacobian. vals
363+ index_lin = 1 : (nls. lincon. nnzj)
364+ view (vals, index_lin) .= nls. lincon. jacobian. vals
309365 return vals
310366end
311367
312368function NLPModels. jac_nln_coord! (nls:: MathOptNLSModel , x:: AbstractVector , vals:: AbstractVector )
313369 increment! (nls, :neval_jac_nln )
314370 if nls. quadcon. nquad > 0
315371 index = 0
316- view (vals, 1 : (nls. quadcon. nnzj)) .= 0.0
372+ ind_quad = 1 : (nls. quadcon. nnzj)
373+ view (vals, ind_quad) .= 0.0
317374 for i = 1 : (nls. quadcon. nquad)
318375 qcon = nls. quadcon. constraints[i]
319376 for (j, ind) in enumerate (qcon. b. nzind)
@@ -341,6 +398,45 @@ function NLPModels.jac_nln_coord!(nls::MathOptNLSModel, x::AbstractVector, vals:
341398 return vals
342399end
343400
401+ function NLPModels. jac_coord! (nls:: MathOptNLSModel , x:: AbstractVector , vals:: AbstractVector )
402+ increment! (nls, :neval_jac )
403+ if nls. meta. nlin > 0
404+ index_lin = 1 : (nls. lincon. nnzj)
405+ view (vals, index_lin) .= nls. lincon. jacobian. vals
406+ end
407+ if nls. meta. nnln > 0
408+ if nls. quadcon. nquad > 0
409+ ind_quad = (nls. lincon. nnzj + 1 ): (nls. lincon. nnzj + nls. quadcon. nnzj)
410+ view (vals, ind_quad) .= 0.0
411+ index = nls. lincon. nnzj
412+ for i = 1 : (nls. quadcon. nquad)
413+ qcon = nls. quadcon. constraints[i]
414+ for (j, ind) in enumerate (qcon. b. nzind)
415+ k = qcon. dg[ind]
416+ vals[index + k] += qcon. b. nzval[j]
417+ end
418+ for j = 1 : (qcon. nnzh)
419+ row = qcon. A. rows[j]
420+ col = qcon. A. cols[j]
421+ val = qcon. A. vals[j]
422+ k1 = qcon. dg[row]
423+ vals[index + k1] += val * x[col]
424+ if row != col
425+ k2 = qcon. dg[col]
426+ vals[index + k2] += val * x[row]
427+ end
428+ end
429+ index += qcon. nnzg
430+ end
431+ end
432+ if nls. meta. nnln > nls. quadcon. nquad
433+ ind_nnln = (nls. lincon. nnzj + nls. quadcon. nnzj + 1 ): (nls. meta. nnzj)
434+ MOI. eval_constraint_jacobian (nls. ceval, view (vals, ind_nnln), x)
435+ end
436+ end
437+ return vals
438+ end
439+
344440function NLPModels. jprod_lin! (
345441 nls:: MathOptNLSModel ,
346442 x:: AbstractVector ,
@@ -366,18 +462,52 @@ function NLPModels.jprod_nln!(
366462 Jv:: AbstractVector ,
367463)
368464 increment! (nls, :neval_jprod_nln )
465+ if nls. quadcon. nquad > 0
466+ for i = 1 : (nls. quadcon. nquad)
467+ # Jv[i] += (Aᵢ * x + bᵢ)ᵀ * v
468+ qcon = nls. quadcon. constraints[i]
469+ Jv[i] = coo_sym_dot (qcon. A. rows, qcon. A. cols, qcon. A. vals, x, v) + dot (qcon. b, v)
470+ end
471+ end
369472 if nls. meta. nnln > nls. quadcon. nquad
370473 ind_nnln = (nls. quadcon. nquad + 1 ): (nls. meta. nnln)
371474 MOI. eval_constraint_jacobian_product (nls. ceval, view (Jv, ind_nnln), x, v)
372475 end
373- (nls. meta. nnln == nls. quadcon. nquad) && (Jv .= 0.0 )
476+ return Jv
477+ end
478+
479+ function NLPModels. jprod! (
480+ nls:: MathOptNLSModel ,
481+ x:: AbstractVector ,
482+ v:: AbstractVector ,
483+ Jv:: AbstractVector ,
484+ )
485+ increment! (nls, :neval_jprod )
486+ if nls. meta. nlin > 0
487+ view (Jv, nls. meta. lin) .= 0.0
488+ transpose = false
489+ coo_unsym_add_mul! (
490+ transpose,
491+ nls. lincon. jacobian. rows,
492+ nls. lincon. jacobian. cols,
493+ nls. lincon. jacobian. vals,
494+ v,
495+ Jv,
496+ 1.0 ,
497+ )
498+ end
374499 if nls. quadcon. nquad > 0
375500 for i = 1 : (nls. quadcon. nquad)
376501 # Jv[i] = (Aᵢ * x + bᵢ)ᵀ * v
377502 qcon = nls. quadcon. constraints[i]
378- Jv[i] += coo_sym_dot (qcon. A. rows, qcon. A. cols, qcon. A. vals, x, v) + dot (qcon. b, v)
503+ Jv[nls. meta. nlin + i] =
504+ coo_sym_dot (qcon. A. rows, qcon. A. cols, qcon. A. vals, x, v) + dot (qcon. b, v)
379505 end
380506 end
507+ if nls. meta. nnln > nls. quadcon. nquad
508+ ind_nnln = (nls. meta. nlin + nls. quadcon. nquad + 1 ): (nls. meta. ncon)
509+ MOI. eval_constraint_jacobian_product (nls. ceval, view (Jv, ind_nnln), x, v)
510+ end
381511 return Jv
382512end
383513
@@ -410,7 +540,7 @@ function NLPModels.jtprod_nln!(
410540 ind_nnln = (nls. quadcon. nquad + 1 ): (nls. meta. nnln)
411541 MOI. eval_constraint_jacobian_transpose_product (nls. ceval, Jtv, x, view (v, ind_nnln))
412542 end
413- (nls. meta . nnln == nls. quadcon . nquad ) && (Jtv .= 0.0 )
543+ (nls. quadcon . nquad == nls. meta . nnln ) && (Jtv .= 0.0 )
414544 if nls. quadcon. nquad > 0
415545 for i = 1 : (nls. quadcon. nquad)
416546 # Jtv += v[i] * (Aᵢ * x + bᵢ)
@@ -422,6 +552,40 @@ function NLPModels.jtprod_nln!(
422552 return Jtv
423553end
424554
555+ function NLPModels. jtprod! (
556+ nls:: MathOptNLSModel ,
557+ x:: AbstractVector ,
558+ v:: AbstractVector ,
559+ Jtv:: AbstractVector ,
560+ )
561+ increment! (nls, :neval_jtprod )
562+ if nls. meta. nnln > nls. quadcon. nquad
563+ ind_nnln = (nls. meta. nlin + nls. quadcon. nquad + 1 ): (nls. meta. ncon)
564+ MOI. eval_constraint_jacobian_transpose_product (nls. ceval, Jtv, x, view (v, ind_nnln))
565+ end
566+ (nls. quadcon. nquad == nls. meta. nnln) && (Jtv .= 0.0 )
567+ if nls. meta. nlin > 0
568+ transpose = true
569+ coo_unsym_add_mul! (
570+ transpose,
571+ nls. lincon. jacobian. rows,
572+ nls. lincon. jacobian. cols,
573+ nls. lincon. jacobian. vals,
574+ v,
575+ Jtv,
576+ 1.0 ,
577+ )
578+ end
579+ if nls. quadcon. nquad > 0
580+ for i = 1 : (nls. quadcon. nquad)
581+ qcon = nls. quadcon. constraints[i]
582+ coo_sym_add_mul! (qcon. A. rows, qcon. A. cols, qcon. A. vals, x, Jtv, v[nls. meta. nlin + i])
583+ Jtv .+ = v[nls. meta. nlin + i] .* qcon. b
584+ end
585+ end
586+ return Jtv
587+ end
588+
425589function NLPModels. hess_structure! (
426590 nls:: MathOptNLSModel ,
427591 rows:: AbstractVector{<:Integer} ,
0 commit comments