Skip to content

Commit 72b8aa0

Browse files
committed
Update moi_nls_model.jl
1 parent cc8d8a1 commit 72b8aa0

File tree

1 file changed

+173
-9
lines changed

1 file changed

+173
-9
lines changed

src/moi_nls_model.jl

Lines changed: 173 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -271,13 +271,35 @@ function NLPModels.cons_nln!(nls::MathOptNLSModel, x::AbstractVector, c::Abstrac
271271
return c
272272
end
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+
274295
function 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
282304
end
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
304328
end
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+
306361
function 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
310366
end
311367

312368
function 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
342399
end
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+
344440
function 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
382512
end
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
423553
end
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+
425589
function NLPModels.hess_structure!(
426590
nls::MathOptNLSModel,
427591
rows::AbstractVector{<:Integer},

0 commit comments

Comments
 (0)