Skip to content

Commit 3091fb0

Browse files
arnavk23tmigot
andauthored
Update jac_lin_coord methods (#501)
* Update guidelines.md * Update api.jl * Update api.jl * Update simple-model.jl * Update api.jl * Update api.jl * Update dummy-model.jl * Update api.jl * Update api.jl * Update src/nlp/api.jl Co-authored-by: Tangi Migot <[email protected]> * Update src/nlp/api.jl Co-authored-by: Tangi Migot <[email protected]> * Update src/nlp/api.jl Co-authored-by: Tangi Migot <[email protected]> * Update src/nlp/api.jl Co-authored-by: Tangi Migot <[email protected]> * Update src/nlp/api.jl Co-authored-by: Tangi Migot <[email protected]> * Update src/nlp/api.jl Co-authored-by: Tangi Migot <[email protected]> * Update docs/src/guidelines.md Co-authored-by: Tangi Migot <[email protected]> * Update src/nlp/api.jl Co-authored-by: Tangi Migot <[email protected]> * fixing * passing failing checks * Update src/nlp/api.jl Co-authored-by: Tangi Migot <[email protected]> * Update test/nlp/simple-model.jl Co-authored-by: Tangi Migot <[email protected]> * Update test/nlp/simple-model.jl Co-authored-by: Tangi Migot <[email protected]> * Update test/nls/simple-model.jl Co-authored-by: Tangi Migot <[email protected]> * Update test/nlp/dummy-model.jl Co-authored-by: Tangi Migot <[email protected]> --------- Co-authored-by: Tangi Migot <[email protected]>
1 parent 796adbd commit 3091fb0

File tree

5 files changed

+74
-70
lines changed

5 files changed

+74
-70
lines changed

docs/src/guidelines.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,11 @@ The following functions should be defined:
6868
- `cons_nln!(nlp, x, c)`
6969
- `jac_lin_structure!(nlp, jrows, jcols)`
7070
- `jac_nln_structure!(nlp, jrows, jcols)`
71-
- `jac_lin_coord!(nlp, x, jvals)`
71+
- `jac_lin_coord!(nlp, jvals)`
7272
- `jac_nln_coord!(nlp, x, jvals)`
73-
- `jprod_lin!(nlp, x, v, Jv)`
73+
- `jprod_lin!(nlp, v, Jv)`
7474
- `jprod_nln!(nlp, x, v, Jv)`
75-
- `jtprod_lin!(nlp, x, v, Jtv)`
75+
- `jtprod_lin!(nlp, v, Jtv)`
7676
- `jtprod_nln!(nlp, x, v, Jtv)`
7777
- `hess_coord!(nlp, x, y, hvals; obj_weight=1)`
7878
- `hprod!(nlp, x, y, v, Hv; obj_weight=1)`

src/nlp/api.jl

Lines changed: 53 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using Base: @deprecate
2+
13
export obj, grad, grad!, objgrad, objgrad!, objcons, objcons!
24
export cons, cons!, cons_lin, cons_lin!, cons_nln, cons_nln!
35
export jth_con, jth_congrad, jth_congrad!, jth_sparse_congrad
@@ -266,10 +268,10 @@ function jac_coord!(nlp::AbstractNLPModel, x::AbstractVector, vals::AbstractVect
266268
increment!(nlp, :neval_jac)
267269
if nlp.meta.nlin > 0
268270
if nlp.meta.nnln == 0
269-
jac_lin_coord!(nlp, x, vals)
271+
jac_lin_coord!(nlp, vals)
270272
else
271273
lin_ind = 1:(nlp.meta.lin_nnzj)
272-
jac_lin_coord!(nlp, x, view(vals, lin_ind))
274+
jac_lin_coord!(nlp, view(vals, lin_ind))
273275
end
274276
end
275277
if nlp.meta.nnln > 0
@@ -307,36 +309,40 @@ function jac(nlp::AbstractNLPModel, x::AbstractVector)
307309
end
308310

309311
"""
310-
vals = jac_lin_coord!(nlp, x, vals)
312+
vals = jac_lin_coord!(nlp, vals)
311313
312-
Evaluate ``J(x)``, the linear constraints Jacobian at `x` in sparse coordinate format,
314+
Evaluate the linear constraints Jacobian in sparse coordinate format,
313315
overwriting `vals`.
314316
"""
315317
function jac_lin_coord! end
316318

319+
@deprecate jac_lin_coord!(nlp::AbstractNLPModel, x::AbstractVector, vals::AbstractVector) jac_lin_coord!(nlp, vals)
320+
317321
"""
318-
vals = jac_lin_coord(nlp, x)
322+
vals = jac_lin_coord(nlp)
319323
320-
Evaluate ``J(x)``, the linear constraints Jacobian at `x` in sparse coordinate format.
324+
Evaluate the linear constraints Jacobian in sparse coordinate format.
321325
"""
322-
function jac_lin_coord(nlp::AbstractNLPModel{T, S}, x::AbstractVector) where {T, S}
323-
@lencheck nlp.meta.nvar x
326+
function jac_lin_coord(nlp::AbstractNLPModel{T, S}) where {T, S}
324327
vals = S(undef, nlp.meta.lin_nnzj)
325-
return jac_lin_coord!(nlp, x, vals)
328+
return jac_lin_coord!(nlp, vals)
326329
end
327330

331+
@deprecate jac_lin_coord(nlp::AbstractNLPModel, x::AbstractVector) jac_lin_coord(nlp)
332+
328333
"""
329-
Jx = jac_lin(nlp, x)
334+
Jx = jac_lin(nlp)
330335
331-
Evaluate ``J(x)``, the linear constraints Jacobian at `x` as a sparse matrix.
336+
Evaluate the linear constraints Jacobian as a sparse matrix.
332337
"""
333-
function jac_lin(nlp::AbstractNLPModel, x::AbstractVector)
334-
@lencheck nlp.meta.nvar x
338+
function jac_lin(nlp::AbstractNLPModel)
335339
rows, cols = jac_lin_structure(nlp)
336-
vals = jac_lin_coord(nlp, x)
340+
vals = jac_lin_coord(nlp)
337341
sparse(rows, cols, vals, nlp.meta.nlin, nlp.meta.nvar)
338342
end
339343

344+
@deprecate jac_lin(nlp::AbstractNLPModel, x::AbstractVector) jac_lin(nlp)
345+
340346
"""
341347
vals = jac_nln_coord!(nlp, x, vals)
342348
@@ -390,9 +396,9 @@ function jprod!(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector, Jv:
390396
increment!(nlp, :neval_jprod)
391397
if nlp.meta.nlin > 0
392398
if nlp.meta.nnln == 0
393-
jprod_lin!(nlp, x, v, Jv)
399+
jprod_lin!(nlp, v, Jv)
394400
else
395-
jprod_lin!(nlp, x, v, view(Jv, nlp.meta.lin))
401+
jprod_lin!(nlp, v, view(Jv, nlp.meta.lin))
396402
end
397403
end
398404
if nlp.meta.nnln > 0
@@ -427,23 +433,26 @@ function jprod!(
427433
end
428434

429435
"""
430-
Jv = jprod_lin(nlp, x, v)
436+
Jv = jprod_lin(nlp, v)
431437
432438
Evaluate ``J(x)v``, the linear Jacobian-vector product at `x`.
433439
"""
434-
function jprod_lin(nlp::AbstractNLPModel{T, S}, x::AbstractVector, v::AbstractVector) where {T, S}
435-
@lencheck nlp.meta.nvar x v
440+
function jprod_lin(nlp::AbstractNLPModel{T, S}, v::AbstractVector) where {T, S}
441+
@lencheck nlp.meta.nvar v
436442
Jv = S(undef, nlp.meta.nlin)
437-
return jprod_lin!(nlp, x, v, Jv)
443+
return jprod_lin!(nlp, v, Jv)
438444
end
439445

440446
"""
441-
Jv = jprod_lin!(nlp, x, v, Jv)
447+
Jv = jprod_lin!(nlp, v, Jv)
442448
443449
Evaluate ``J(x)v``, the linear Jacobian-vector product at `x` in place.
444450
"""
445451
function jprod_lin! end
446452

453+
@deprecate jprod_lin(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector) jprod_lin(nlp, v)
454+
@deprecate jprod_lin!(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector, Jv::AbstractVector) jprod_lin!(nlp, v, Jv)
455+
447456
"""
448457
Jv = jprod_lin!(nlp, rows, cols, vals, v, Jv)
449458
@@ -527,18 +536,18 @@ function jtprod!(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector, Jt
527536
@lencheck nlp.meta.ncon v
528537
increment!(nlp, :neval_jtprod)
529538
if nlp.meta.nnln == 0
530-
(nlp.meta.nlin > 0) && jtprod_lin!(nlp, x, v, Jtv)
539+
(nlp.meta.nlin > 0) && jtprod_lin!(nlp, v, Jtv)
531540
elseif nlp.meta.nlin == 0
532541
(nlp.meta.nnln > 0) && jtprod_nln!(nlp, x, v, Jtv)
533542
elseif nlp.meta.nlin >= nlp.meta.nnln
534-
jtprod_lin!(nlp, x, view(v, nlp.meta.lin), Jtv)
543+
jtprod_lin!(nlp, view(v, nlp.meta.lin), Jtv)
535544
if nlp.meta.nnln > 0
536545
Jtv .+= jtprod_nln(nlp, x, view(v, nlp.meta.nln))
537546
end
538547
else
539548
jtprod_nln!(nlp, x, view(v, nlp.meta.nln), Jtv)
540549
if nlp.meta.nlin > 0
541-
Jtv .+= jtprod_lin(nlp, x, view(v, nlp.meta.lin))
550+
Jtv .+= jtprod_lin(nlp, view(v, nlp.meta.lin))
542551
end
543552
end
544553
return Jtv
@@ -566,24 +575,26 @@ function jtprod!(
566575
end
567576

568577
"""
569-
Jtv = jtprod_lin(nlp, x, v)
578+
Jtv = jtprod_lin(nlp, v)
570579
571580
Evaluate ``J(x)^Tv``, the linear transposed-Jacobian-vector product at `x`.
572581
"""
573-
function jtprod_lin(nlp::AbstractNLPModel{T, S}, x::AbstractVector, v::AbstractVector) where {T, S}
574-
@lencheck nlp.meta.nvar x
582+
function jtprod_lin(nlp::AbstractNLPModel{T, S}, v::AbstractVector) where {T, S}
575583
@lencheck nlp.meta.nlin v
576584
Jtv = S(undef, nlp.meta.nvar)
577-
return jtprod_lin!(nlp, x, v, Jtv)
585+
return jtprod_lin!(nlp, v, Jtv)
578586
end
579587

580588
"""
581-
Jtv = jtprod_lin!(nlp, x, v, Jtv)
589+
Jtv = jtprod_lin!(nlp, v, Jtv)
582590
583591
Evaluate ``J(x)^Tv``, the linear transposed-Jacobian-vector product at `x` in place.
584592
"""
585593
function jtprod_lin! end
586594

595+
@deprecate jtprod_lin(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector) jtprod_lin(nlp, v)
596+
@deprecate jtprod_lin!(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector, Jtv::AbstractVector) jtprod_lin!(nlp, v, Jtv)
597+
587598
"""
588599
Jtv = jtprod_lin!(nlp, rows, cols, vals, v, Jtv)
589600
@@ -736,37 +747,37 @@ function jac_op!(
736747
end
737748

738749
"""
739-
J = jac_lin_op(nlp, x)
750+
J = jac_lin_op(nlp)
740751
741-
Return the linear Jacobian at `x` as a linear operator.
752+
Return the linear Jacobian as a linear operator.
742753
The resulting object may be used as if it were a matrix, e.g., `J * v` or
743754
`J' * v`.
744755
"""
745-
function jac_lin_op(nlp::AbstractNLPModel{T, S}, x::AbstractVector) where {T, S}
746-
@lencheck nlp.meta.nvar x
756+
function jac_lin_op(nlp::AbstractNLPModel{T, S}) where {T, S}
747757
Jv = S(undef, nlp.meta.nlin)
748758
Jtv = S(undef, nlp.meta.nvar)
749-
return jac_lin_op!(nlp, x, Jv, Jtv)
759+
return jac_lin_op!(nlp, Jv, Jtv)
750760
end
751761

762+
@deprecate jac_lin_op(nlp::AbstractNLPModel, x::AbstractVector) jac_lin_op(nlp)
763+
752764
"""
753-
J = jac_lin_op!(nlp, x, Jv, Jtv)
765+
J = jac_lin_op!(nlp, Jv, Jtv)
754766
755-
Return the linear Jacobian at `x` as a linear operator.
767+
Return the linear Jacobian as a linear operator.
756768
The resulting object may be used as if it were a matrix, e.g., `J * v` or
757769
`J' * v`. The values `Jv` and `Jtv` are used as preallocated storage for the
758770
operations.
759771
"""
760772
function jac_lin_op!(
761773
nlp::AbstractNLPModel{T, S},
762-
x::AbstractVector{T},
763774
Jv::AbstractVector,
764775
Jtv::AbstractVector,
765776
) where {T, S}
766-
@lencheck nlp.meta.nvar x Jtv
767777
@lencheck nlp.meta.nlin Jv
778+
@lencheck nlp.meta.nvar Jtv
768779
prod! = @closure (res, v, α, β) -> begin # res = α * J * v + β * res
769-
jprod_lin!(nlp, x, v, Jv)
780+
jprod_lin!(nlp, v, Jv)
770781
if β == 0
771782
res .= α .* Jv
772783
else
@@ -775,7 +786,7 @@ function jac_lin_op!(
775786
return res
776787
end
777788
ctprod! = @closure (res, v, α, β) -> begin
778-
jtprod_lin!(nlp, x, v, Jtv)
789+
jtprod_lin!(nlp, v, Jtv)
779790
if β == 0
780791
res .= α .* Jtv
781792
else
@@ -786,6 +797,8 @@ function jac_lin_op!(
786797
return LinearOperator{T}(nlp.meta.nlin, nlp.meta.nvar, false, false, prod!, ctprod!, ctprod!)
787798
end
788799

800+
@deprecate jac_lin_op!(nlp::AbstractNLPModel, x::AbstractVector, Jv::AbstractVector, Jtv::AbstractVector) jac_lin_op!(nlp, Jv, Jtv)
801+
789802
"""
790803
J = jac_lin_op!(nlp, rows, cols, vals, Jv, Jtv)
791804

test/nlp/api.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@
3030
@test cons_lin(nlp, x) == c(x)[1:1]
3131
@test jac(nlp, x) J(x)
3232
@test jac_nln(nlp, x) J(x)[2:2, :]
33-
@test jac_lin(nlp, x) J(x)[1:1, :]
33+
@test jac_lin(nlp) J(x)[1:1, :]
3434
@test jprod(nlp, x, v) J(x) * v
3535
@test jprod_nln(nlp, x, v) J(x)[2:2, :] * v
36-
@test jprod_lin(nlp, x, v) J(x)[1:1, :] * v
36+
@test jprod_lin(nlp, v) J(x)[1:1, :] * v
3737
@test jtprod(nlp, x, w) J(x)' * w
3838
@test jtprod_nln(nlp, x, w[2:2]) J(x)[2:2, :]' * w[2:2]
39-
@test jtprod_lin(nlp, x, w[1:1]) J(x)[1:1, :]' * w[1:1]
39+
@test jtprod_lin(nlp, w[1:1]) J(x)[1:1, :]' * w[1:1]
4040
@test hess(nlp, x, y) tril(H(x, y))
4141
@test hprod(nlp, x, y, v) H(x, y) * v
4242

@@ -56,12 +56,12 @@
5656
@test jprod!(nlp, jac_structure(nlp)..., jac_coord(nlp, x), v, Jv) J(x) * v
5757
@test jprod_nln!(nlp, jac_nln_structure(nlp)..., jac_nln_coord(nlp, x), v, Jv[2:2])
5858
J(x)[2:2, :] * v
59-
@test jprod_lin!(nlp, jac_lin_structure(nlp)..., jac_lin_coord(nlp, x), v, Jv[1:1])
59+
@test jprod_lin!(nlp, jac_lin_structure(nlp)..., jac_lin_coord(nlp), v, Jv[1:1])
6060
J(x)[1:1, :] * v
6161
@test jtprod!(nlp, jac_structure(nlp)..., jac_coord(nlp, x), w, Jtw) J(x)' * w
6262
@test jtprod_nln!(nlp, jac_nln_structure(nlp)..., jac_nln_coord(nlp, x), w[2:2], Jtw)
6363
J(x)[2:2, :]' * w[2:2]
64-
@test jtprod_lin!(nlp, jac_lin_structure(nlp)..., jac_lin_coord(nlp, x), w[1:1], Jtw)
64+
@test jtprod_lin!(nlp, jac_lin_structure(nlp)..., jac_lin_coord(nlp), w[1:1], Jtw)
6565
J(x)[1:1, :]' * w[1:1]
6666
Jop = jac_op!(nlp, x, Jv, Jtw)
6767
@test Jop * v J(x) * v
@@ -91,14 +91,14 @@
9191
@test mul!(w[2:2], Jop, v, 1.0, -1.0) res
9292
res = J(x)[2:2, :]' * w[2:2] - v
9393
@test mul!(v, Jop', w[2:2], 1.0, -1.0) res
94-
Jop = jac_lin_op!(nlp, x, Jv[1:1], Jtw)
94+
Jop = jac_lin_op!(nlp, Jv[1:1], Jtw)
9595
@test Jop * v J(x)[1:1, :] * v
9696
@test Jop' * w[1:1] Jtw
9797
res = J(x)[1:1, :] * v - w[1:1]
9898
@test mul!(w[1:1], Jop, v, 1.0, -1.0) res
9999
res = J(x)[1:1, :]' * w[1:1] - v
100100
@test mul!(v, Jop', w[1:1], 1.0, -1.0) res
101-
Jop = jac_lin_op!(nlp, jac_lin_structure(nlp)..., jac_lin_coord(nlp, x), Jv[1:1], Jtw)
101+
Jop = jac_lin_op!(nlp, jac_lin_structure(nlp)..., jac_lin_coord(nlp), Jv[1:1], Jtw)
102102
@test Jop * v J(x)[1:1, :] * v
103103
@test Jop' * w[1:1] Jtw
104104
res = J(x)[1:1, :] * v - w[1:1]

test/nlp/dummy-model.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ end
1919
@test_throws(MethodError, jth_congrad(model, [0.0], 1))
2020
@test_throws(MethodError, jth_sparse_congrad(model, [0.0], 1))
2121
@test_throws(MethodError, jth_congrad!(model, [0.0], 1, [2.0]))
22-
@test_throws(MethodError, jprod_lin!(model, [0.0], [1.0], [2.0]))
23-
@test_throws(MethodError, jtprod_lin!(model, [0.0], [1.0], [2.0]))
22+
@test_throws(MethodError, jprod_lin!(model, [0.0], [2.0]))
23+
@test_throws(MethodError, jtprod_lin!(model, [0.0], [2.0]))
2424
@test_throws(MethodError, jprod_nln!(model, [0.0], [1.0], [2.0]))
2525
@test_throws(MethodError, jtprod_nln!(model, [0.0], [1.0], [2.0]))
2626
@test_throws(MethodError, jth_hess_coord!(model, [0.0], 1))
2727
@test_throws(MethodError, jth_hprod!(model, [0.0], [1.0], 2, [3.0]))
2828
@test_throws(MethodError, ghjvprod!(model, [0.0], [1.0], [2.0], [3.0]))
2929
@assert isa(hess_op(model, [0.0]), LinearOperator)
3030
@assert isa(jac_op(model, [0.0]), LinearOperator)
31-
@assert isa(jac_lin_op(model, [0.0]), LinearOperator)
31+
@assert isa(jac_lin_op(model), LinearOperator)
3232
@assert isa(jac_nln_op(model, [0.0]), LinearOperator)
3333
end

test/nlp/simple-model.jl

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,8 @@ function NLPModels.jac_nln_coord!(nlp::SimpleNLPModel, x::AbstractVector, vals::
139139
return vals
140140
end
141141

142-
function NLPModels.jac_lin_coord!(nlp::SimpleNLPModel, x::AbstractVector, vals::AbstractVector)
143-
@lencheck 2 x vals
142+
function NLPModels.jac_lin_coord!(nlp::SimpleNLPModel, vals::AbstractVector)
143+
@lencheck 2 vals
144144
increment!(nlp, :neval_jac_lin)
145145
vals .= [1, -2]
146146
return vals
@@ -159,16 +159,12 @@ function NLPModels.jprod_nln!(
159159
return Jv
160160
end
161161

162-
function NLPModels.jprod_lin!(
163-
nlp::SimpleNLPModel,
164-
x::AbstractVector,
165-
v::AbstractVector,
166-
Jv::AbstractVector,
167-
)
168-
@lencheck 2 x v
162+
163+
function NLPModels.jprod_lin!(nlp::SimpleNLPModel, v::AbstractVector, Jv::AbstractVector)
164+
@lencheck 2 v
169165
@lencheck 1 Jv
170166
increment!(nlp, :neval_jprod_lin)
171-
Jv .= [v[1] - 2 * v[2]]
167+
Jv[1] = v[1] - 2 * v[2]
172168
return Jv
173169
end
174170

@@ -185,13 +181,8 @@ function NLPModels.jtprod_nln!(
185181
return Jtv
186182
end
187183

188-
function NLPModels.jtprod_lin!(
189-
nlp::SimpleNLPModel,
190-
x::AbstractVector,
191-
v::AbstractVector,
192-
Jtv::AbstractVector,
193-
)
194-
@lencheck 2 x Jtv
184+
function NLPModels.jtprod_lin!(nlp::SimpleNLPModel, v::AbstractVector, Jtv::AbstractVector)
185+
@lencheck 2 Jtv
195186
@lencheck 1 v
196187
increment!(nlp, :neval_jtprod_lin)
197188
Jtv .= [v[1]; -2 * v[1]]

0 commit comments

Comments
 (0)