From 2305fc3be6fb5e5e593d99e74b79deb7b8398d6b Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 9 Jul 2025 06:48:20 +0530 Subject: [PATCH 01/24] Update guidelines.md --- docs/src/guidelines.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/guidelines.md b/docs/src/guidelines.md index 7ef1a7cb..40f0d2d1 100644 --- a/docs/src/guidelines.md +++ b/docs/src/guidelines.md @@ -68,7 +68,7 @@ The following functions should be defined: - `cons_nln!(nlp, x, c)` - `jac_lin_structure!(nlp, jrows, jcols)` - `jac_nln_structure!(nlp, jrows, jcols)` - - `jac_lin_coord!(nlp, x, jvals)` + - `jac_lin_coord!(nlp, jvals)` - `jac_nln_coord!(nlp, x, jvals)` - `jprod_lin!(nlp, x, v, Jv)` - `jprod_nln!(nlp, x, v, Jv)` From 46c075d00b851d8195978e067842163542d265e0 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 9 Jul 2025 06:57:36 +0530 Subject: [PATCH 02/24] Update api.jl --- src/nlp/api.jl | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/nlp/api.jl b/src/nlp/api.jl index 46812e8e..351684e3 100644 --- a/src/nlp/api.jl +++ b/src/nlp/api.jl @@ -266,10 +266,10 @@ function jac_coord!(nlp::AbstractNLPModel, x::AbstractVector, vals::AbstractVect increment!(nlp, :neval_jac) if nlp.meta.nlin > 0 if nlp.meta.nnln == 0 - jac_lin_coord!(nlp, x, vals) + jac_lin_coord!(nlp, vals) else lin_ind = 1:(nlp.meta.lin_nnzj) - jac_lin_coord!(nlp, x, view(vals, lin_ind)) + jac_lin_coord!(nlp, view(vals, lin_ind)) end end if nlp.meta.nnln > 0 @@ -307,33 +307,31 @@ function jac(nlp::AbstractNLPModel, x::AbstractVector) end """ - vals = jac_lin_coord!(nlp, x, vals) + vals = jac_lin_coord!(nlp, vals) -Evaluate ``J(x)``, the linear constraints Jacobian at `x` in sparse coordinate format, +Evaluate ``J(x)``, the linear constraints Jacobian in sparse coordinate format, overwriting `vals`. """ function jac_lin_coord! end """ - vals = jac_lin_coord(nlp, x) + vals = jac_lin_coord(nlp) -Evaluate ``J(x)``, the linear constraints Jacobian at `x` in sparse coordinate format. +Evaluate ``J(x)``, the linear constraints Jacobian in sparse coordinate format. """ -function jac_lin_coord(nlp::AbstractNLPModel{T, S}, x::AbstractVector) where {T, S} - @lencheck nlp.meta.nvar x +function jac_lin_coord(nlp::AbstractNLPModel{T, S}) where {T, S} vals = S(undef, nlp.meta.lin_nnzj) - return jac_lin_coord!(nlp, x, vals) + return jac_lin_coord!(nlp, vals) end """ - Jx = jac_lin(nlp, x) + Jx = jac_lin(nlp) -Evaluate ``J(x)``, the linear constraints Jacobian at `x` as a sparse matrix. +Evaluate ``J(x)``, the linear constraints Jacobian as a sparse matrix. """ -function jac_lin(nlp::AbstractNLPModel, x::AbstractVector) - @lencheck nlp.meta.nvar x +function jac_lin(nlp::AbstractNLPModel) rows, cols = jac_lin_structure(nlp) - vals = jac_lin_coord(nlp, x) + vals = jac_lin_coord(nlp) sparse(rows, cols, vals, nlp.meta.nlin, nlp.meta.nvar) end From 022958b3d95fda4a078806ffa35dbbbd2276d628 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 9 Jul 2025 06:59:17 +0530 Subject: [PATCH 03/24] Update api.jl --- test/nlp/api.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/nlp/api.jl b/test/nlp/api.jl index 730dc5ca..02095ad4 100644 --- a/test/nlp/api.jl +++ b/test/nlp/api.jl @@ -30,7 +30,7 @@ @test cons_lin(nlp, x) == c(x)[1:1] @test jac(nlp, x) ≈ J(x) @test jac_nln(nlp, x) ≈ J(x)[2:2, :] - @test jac_lin(nlp, x) ≈ J(x)[1:1, :] + @test jac_lin(nlp) ≈ J(x)[1:1, :] @test jprod(nlp, x, v) ≈ J(x) * v @test jprod_nln(nlp, x, v) ≈ J(x)[2:2, :] * v @test jprod_lin(nlp, x, v) ≈ J(x)[1:1, :] * v @@ -56,12 +56,12 @@ @test jprod!(nlp, jac_structure(nlp)..., jac_coord(nlp, x), v, Jv) ≈ J(x) * v @test jprod_nln!(nlp, jac_nln_structure(nlp)..., jac_nln_coord(nlp, x), v, Jv[2:2]) ≈ J(x)[2:2, :] * v - @test jprod_lin!(nlp, jac_lin_structure(nlp)..., jac_lin_coord(nlp, x), v, Jv[1:1]) ≈ + @test jprod_lin!(nlp, jac_lin_structure(nlp)..., jac_lin_coord(nlp), v, Jv[1:1]) ≈ J(x)[1:1, :] * v @test jtprod!(nlp, jac_structure(nlp)..., jac_coord(nlp, x), w, Jtw) ≈ J(x)' * w @test jtprod_nln!(nlp, jac_nln_structure(nlp)..., jac_nln_coord(nlp, x), w[2:2], Jtw) ≈ J(x)[2:2, :]' * w[2:2] - @test jtprod_lin!(nlp, jac_lin_structure(nlp)..., jac_lin_coord(nlp, x), w[1:1], Jtw) ≈ + @test jtprod_lin!(nlp, jac_lin_structure(nlp)..., jac_lin_coord(nlp), w[1:1], Jtw) ≈ J(x)[1:1, :]' * w[1:1] Jop = jac_op!(nlp, x, Jv, Jtw) @test Jop * v ≈ J(x) * v @@ -98,7 +98,7 @@ @test mul!(w[1:1], Jop, v, 1.0, -1.0) ≈ res res = J(x)[1:1, :]' * w[1:1] - v @test mul!(v, Jop', w[1:1], 1.0, -1.0) ≈ res - Jop = jac_lin_op!(nlp, jac_lin_structure(nlp)..., jac_lin_coord(nlp, x), Jv[1:1], Jtw) + Jop = jac_lin_op!(nlp, jac_lin_structure(nlp)..., jac_lin_coord(nlp), Jv[1:1], Jtw) @test Jop * v ≈ J(x)[1:1, :] * v @test Jop' * w[1:1] ≈ Jtw res = J(x)[1:1, :] * v - w[1:1] From 504a3c29574998b892d7f598283db466a86e391e Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 9 Jul 2025 07:00:37 +0530 Subject: [PATCH 04/24] Update simple-model.jl --- test/nlp/simple-model.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/nlp/simple-model.jl b/test/nlp/simple-model.jl index 7f61c626..f66040ec 100644 --- a/test/nlp/simple-model.jl +++ b/test/nlp/simple-model.jl @@ -139,8 +139,8 @@ function NLPModels.jac_nln_coord!(nlp::SimpleNLPModel, x::AbstractVector, vals:: return vals end -function NLPModels.jac_lin_coord!(nlp::SimpleNLPModel, x::AbstractVector, vals::AbstractVector) - @lencheck 2 x vals +function NLPModels.jac_lin_coord!(nlp::SimpleNLPModel, vals::AbstractVector) + @lencheck 2 vals increment!(nlp, :neval_jac_lin) vals .= [1, -2] return vals From cfec55078ceef279b9f11030aa4e17ba55420adb Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Fri, 11 Jul 2025 04:51:53 +0530 Subject: [PATCH 05/24] Update api.jl --- src/nlp/api.jl | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/nlp/api.jl b/src/nlp/api.jl index 351684e3..1855a6d6 100644 --- a/src/nlp/api.jl +++ b/src/nlp/api.jl @@ -309,7 +309,7 @@ end """ vals = jac_lin_coord!(nlp, vals) -Evaluate ``J(x)``, the linear constraints Jacobian in sparse coordinate format, +Evaluate the linear constraints Jacobian in sparse coordinate format, overwriting `vals`. """ function jac_lin_coord! end @@ -317,7 +317,7 @@ function jac_lin_coord! end """ vals = jac_lin_coord(nlp) -Evaluate ``J(x)``, the linear constraints Jacobian in sparse coordinate format. +Evaluate the linear constraints Jacobian in sparse coordinate format. """ function jac_lin_coord(nlp::AbstractNLPModel{T, S}) where {T, S} vals = S(undef, nlp.meta.lin_nnzj) @@ -734,37 +734,37 @@ function jac_op!( end """ - J = jac_lin_op(nlp, x) + J = jac_lin_op(nlp) -Return the linear Jacobian at `x` as a linear operator. +Return the linear Jacobian as a linear operator. The resulting object may be used as if it were a matrix, e.g., `J * v` or `J' * v`. """ -function jac_lin_op(nlp::AbstractNLPModel{T, S}, x::AbstractVector) where {T, S} - @lencheck nlp.meta.nvar x +function jac_lin_op(nlp::AbstractNLPModel{T, S}) where {T, S} Jv = S(undef, nlp.meta.nlin) Jtv = S(undef, nlp.meta.nvar) - return jac_lin_op!(nlp, x, Jv, Jtv) + return jac_lin_op!(nlp, Jv, Jtv) end """ - J = jac_lin_op!(nlp, x, Jv, Jtv) + J = jac_lin_op!(nlp, Jv, Jtv) -Return the linear Jacobian at `x` as a linear operator. +Return the linear Jacobian as a linear operator. The resulting object may be used as if it were a matrix, e.g., `J * v` or `J' * v`. The values `Jv` and `Jtv` are used as preallocated storage for the operations. """ function jac_lin_op!( nlp::AbstractNLPModel{T, S}, - x::AbstractVector{T}, Jv::AbstractVector, Jtv::AbstractVector, ) where {T, S} - @lencheck nlp.meta.nvar x Jtv + @lencheck nlp.meta.nvar Jtv @lencheck nlp.meta.nlin Jv prod! = @closure (res, v, α, β) -> begin # res = α * J * v + β * res - jprod_lin!(nlp, x, v, Jv) + rows, cols = jac_lin_structure(nlp) + vals = jac_lin_coord(nlp) + jprod_lin!(nlp, rows, cols, vals, v, Jv) if β == 0 res .= α .* Jv else @@ -773,7 +773,9 @@ function jac_lin_op!( return res end ctprod! = @closure (res, v, α, β) -> begin - jtprod_lin!(nlp, x, v, Jtv) + rows, cols = jac_lin_structure(nlp) + vals = jac_lin_coord(nlp) + jtprod_lin!(nlp, rows, cols, vals, v, Jtv) if β == 0 res .= α .* Jtv else @@ -1369,3 +1371,4 @@ These are typically used to normalize constraints to have similar magnitudes and convergence behavior in nonlinear solvers. """ function conscale end + From 69d6870aaaf1482f0291d252c000b7198a94f112 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Fri, 11 Jul 2025 04:53:13 +0530 Subject: [PATCH 06/24] Update api.jl --- test/nlp/api.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/nlp/api.jl b/test/nlp/api.jl index 02095ad4..2aec29e0 100644 --- a/test/nlp/api.jl +++ b/test/nlp/api.jl @@ -91,7 +91,7 @@ @test mul!(w[2:2], Jop, v, 1.0, -1.0) ≈ res res = J(x)[2:2, :]' * w[2:2] - v @test mul!(v, Jop', w[2:2], 1.0, -1.0) ≈ res - Jop = jac_lin_op!(nlp, x, Jv[1:1], Jtw) + Jop = jac_lin_op!(nlp, Jv[1:1], Jtw) @test Jop * v ≈ J(x)[1:1, :] * v @test Jop' * w[1:1] ≈ Jtw res = J(x)[1:1, :] * v - w[1:1] From a59c0723d0a93a8ce98f7fb7d4a14c6d0ee2e2ab Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Fri, 11 Jul 2025 04:55:03 +0530 Subject: [PATCH 07/24] Update dummy-model.jl --- test/nlp/dummy-model.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/nlp/dummy-model.jl b/test/nlp/dummy-model.jl index aa0983dd..b625d885 100644 --- a/test/nlp/dummy-model.jl +++ b/test/nlp/dummy-model.jl @@ -28,6 +28,6 @@ end @test_throws(MethodError, ghjvprod!(model, [0.0], [1.0], [2.0], [3.0])) @assert isa(hess_op(model, [0.0]), LinearOperator) @assert isa(jac_op(model, [0.0]), LinearOperator) - @assert isa(jac_lin_op(model, [0.0]), LinearOperator) + @assert isa(jac_lin_op(model), LinearOperator) @assert isa(jac_nln_op(model, [0.0]), LinearOperator) end From 07bfc71d7e24e8b60ffdd4357cf8ad2a7d528e32 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Fri, 11 Jul 2025 11:18:27 +0530 Subject: [PATCH 08/24] Update api.jl --- src/nlp/api.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/nlp/api.jl b/src/nlp/api.jl index 1855a6d6..ca735117 100644 --- a/src/nlp/api.jl +++ b/src/nlp/api.jl @@ -1371,4 +1371,3 @@ These are typically used to normalize constraints to have similar magnitudes and convergence behavior in nonlinear solvers. """ function conscale end - From 246b59121dd3315e4ce196f55e475c38a43c7595 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Tue, 15 Jul 2025 09:04:58 +0530 Subject: [PATCH 09/24] Update api.jl --- src/nlp/api.jl | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/nlp/api.jl b/src/nlp/api.jl index ca735117..a2bcd617 100644 --- a/src/nlp/api.jl +++ b/src/nlp/api.jl @@ -1,3 +1,5 @@ +using Base: @deprecate + export obj, grad, grad!, objgrad, objgrad!, objcons, objcons! export cons, cons!, cons_lin, cons_lin!, cons_nln, cons_nln! export jth_con, jth_congrad, jth_congrad!, jth_sparse_congrad @@ -266,10 +268,10 @@ function jac_coord!(nlp::AbstractNLPModel, x::AbstractVector, vals::AbstractVect increment!(nlp, :neval_jac) if nlp.meta.nlin > 0 if nlp.meta.nnln == 0 - jac_lin_coord!(nlp, vals) + jac_lin_coord!(nlp, x, vals) else lin_ind = 1:(nlp.meta.lin_nnzj) - jac_lin_coord!(nlp, view(vals, lin_ind)) + jac_lin_coord!(nlp, x, view(vals, lin_ind)) end end if nlp.meta.nnln > 0 @@ -314,6 +316,9 @@ overwriting `vals`. """ function jac_lin_coord! end +# Deprecated version with x parameter +@deprecate jac_lin_coord!(nlp::AbstractNLPModel, x::AbstractVector, vals::AbstractVector) jac_lin_coord!(nlp, vals) + """ vals = jac_lin_coord(nlp) @@ -324,10 +329,13 @@ function jac_lin_coord(nlp::AbstractNLPModel{T, S}) where {T, S} return jac_lin_coord!(nlp, vals) end +# Deprecated version with x parameter +@deprecate jac_lin_coord(nlp::AbstractNLPModel, x::AbstractVector) jac_lin_coord(nlp) + """ Jx = jac_lin(nlp) -Evaluate ``J(x)``, the linear constraints Jacobian as a sparse matrix. +Evaluate the linear constraints Jacobian as a sparse matrix. """ function jac_lin(nlp::AbstractNLPModel) rows, cols = jac_lin_structure(nlp) @@ -335,6 +343,9 @@ function jac_lin(nlp::AbstractNLPModel) sparse(rows, cols, vals, nlp.meta.nlin, nlp.meta.nvar) end +# Deprecated version with x parameter +@deprecate jac_lin(nlp::AbstractNLPModel, x::AbstractVector) jac_lin(nlp) + """ vals = jac_nln_coord!(nlp, x, vals) @@ -746,6 +757,9 @@ function jac_lin_op(nlp::AbstractNLPModel{T, S}) where {T, S} return jac_lin_op!(nlp, Jv, Jtv) end +# Deprecated version with x parameter +@deprecate jac_lin_op(nlp::AbstractNLPModel, x::AbstractVector) jac_lin_op(nlp) + """ J = jac_lin_op!(nlp, Jv, Jtv) @@ -759,8 +773,8 @@ function jac_lin_op!( Jv::AbstractVector, Jtv::AbstractVector, ) where {T, S} - @lencheck nlp.meta.nvar Jtv @lencheck nlp.meta.nlin Jv + @lencheck nlp.meta.nvar Jtv prod! = @closure (res, v, α, β) -> begin # res = α * J * v + β * res rows, cols = jac_lin_structure(nlp) vals = jac_lin_coord(nlp) @@ -786,6 +800,9 @@ function jac_lin_op!( return LinearOperator{T}(nlp.meta.nlin, nlp.meta.nvar, false, false, prod!, ctprod!, ctprod!) end +# Deprecated version with x parameter +@deprecate jac_lin_op!(nlp::AbstractNLPModel, x::AbstractVector, Jv::AbstractVector, Jtv::AbstractVector) jac_lin_op!(nlp, Jv, Jtv) + """ J = jac_lin_op!(nlp, rows, cols, vals, Jv, Jtv) From 57a009cbea1e980ca55e53c692d2d32b2f8979cd Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 23 Jul 2025 16:38:36 +0530 Subject: [PATCH 10/24] Update src/nlp/api.jl Co-authored-by: Tangi Migot --- src/nlp/api.jl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/nlp/api.jl b/src/nlp/api.jl index a2bcd617..949f0c0b 100644 --- a/src/nlp/api.jl +++ b/src/nlp/api.jl @@ -776,9 +776,7 @@ function jac_lin_op!( @lencheck nlp.meta.nlin Jv @lencheck nlp.meta.nvar Jtv prod! = @closure (res, v, α, β) -> begin # res = α * J * v + β * res - rows, cols = jac_lin_structure(nlp) - vals = jac_lin_coord(nlp) - jprod_lin!(nlp, rows, cols, vals, v, Jv) + jprod_lin!(nlp, v, Jv) if β == 0 res .= α .* Jv else From c7ad579eea36ce42d5c9fae017ef70da0569cd93 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 23 Jul 2025 16:38:50 +0530 Subject: [PATCH 11/24] Update src/nlp/api.jl Co-authored-by: Tangi Migot --- src/nlp/api.jl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/nlp/api.jl b/src/nlp/api.jl index 949f0c0b..e73acdf6 100644 --- a/src/nlp/api.jl +++ b/src/nlp/api.jl @@ -785,9 +785,7 @@ function jac_lin_op!( return res end ctprod! = @closure (res, v, α, β) -> begin - rows, cols = jac_lin_structure(nlp) - vals = jac_lin_coord(nlp) - jtprod_lin!(nlp, rows, cols, vals, v, Jtv) + jtprod_lin!(nlp, v, Jtv) if β == 0 res .= α .* Jtv else From e37cdc2903fe4e001027156b7c5a8967a02074be Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 23 Jul 2025 16:39:02 +0530 Subject: [PATCH 12/24] Update src/nlp/api.jl Co-authored-by: Tangi Migot --- src/nlp/api.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/nlp/api.jl b/src/nlp/api.jl index e73acdf6..ae219ad2 100644 --- a/src/nlp/api.jl +++ b/src/nlp/api.jl @@ -796,7 +796,6 @@ function jac_lin_op!( return LinearOperator{T}(nlp.meta.nlin, nlp.meta.nvar, false, false, prod!, ctprod!, ctprod!) end -# Deprecated version with x parameter @deprecate jac_lin_op!(nlp::AbstractNLPModel, x::AbstractVector, Jv::AbstractVector, Jtv::AbstractVector) jac_lin_op!(nlp, Jv, Jtv) """ From 4db178ff052b5c2abf00dc7d8c518a7786e67ac5 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 23 Jul 2025 16:39:10 +0530 Subject: [PATCH 13/24] Update src/nlp/api.jl Co-authored-by: Tangi Migot --- src/nlp/api.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/nlp/api.jl b/src/nlp/api.jl index ae219ad2..cc17ed35 100644 --- a/src/nlp/api.jl +++ b/src/nlp/api.jl @@ -757,7 +757,6 @@ function jac_lin_op(nlp::AbstractNLPModel{T, S}) where {T, S} return jac_lin_op!(nlp, Jv, Jtv) end -# Deprecated version with x parameter @deprecate jac_lin_op(nlp::AbstractNLPModel, x::AbstractVector) jac_lin_op(nlp) """ From b69d01a35d57ae8acf8f27981dd3897c93e08ce4 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 23 Jul 2025 16:39:18 +0530 Subject: [PATCH 14/24] Update src/nlp/api.jl Co-authored-by: Tangi Migot --- src/nlp/api.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/nlp/api.jl b/src/nlp/api.jl index cc17ed35..e3dbc6e0 100644 --- a/src/nlp/api.jl +++ b/src/nlp/api.jl @@ -329,7 +329,6 @@ function jac_lin_coord(nlp::AbstractNLPModel{T, S}) where {T, S} return jac_lin_coord!(nlp, vals) end -# Deprecated version with x parameter @deprecate jac_lin_coord(nlp::AbstractNLPModel, x::AbstractVector) jac_lin_coord(nlp) """ From ad55e72d47ee93e2784e2dc87ce15a7b98e3b361 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 23 Jul 2025 16:39:25 +0530 Subject: [PATCH 15/24] Update src/nlp/api.jl Co-authored-by: Tangi Migot --- src/nlp/api.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/nlp/api.jl b/src/nlp/api.jl index e3dbc6e0..27e45497 100644 --- a/src/nlp/api.jl +++ b/src/nlp/api.jl @@ -316,7 +316,6 @@ overwriting `vals`. """ function jac_lin_coord! end -# Deprecated version with x parameter @deprecate jac_lin_coord!(nlp::AbstractNLPModel, x::AbstractVector, vals::AbstractVector) jac_lin_coord!(nlp, vals) """ From 30da32f1353dc3fd2222a7fb7caad66145be3e21 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 23 Jul 2025 16:39:36 +0530 Subject: [PATCH 16/24] Update docs/src/guidelines.md Co-authored-by: Tangi Migot --- docs/src/guidelines.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/guidelines.md b/docs/src/guidelines.md index 40f0d2d1..022fd59b 100644 --- a/docs/src/guidelines.md +++ b/docs/src/guidelines.md @@ -70,7 +70,7 @@ The following functions should be defined: - `jac_nln_structure!(nlp, jrows, jcols)` - `jac_lin_coord!(nlp, jvals)` - `jac_nln_coord!(nlp, x, jvals)` - - `jprod_lin!(nlp, x, v, Jv)` + - `jprod_lin!(nlp, v, Jv)` - `jprod_nln!(nlp, x, v, Jv)` - `jtprod_lin!(nlp, x, v, Jtv)` - `jtprod_nln!(nlp, x, v, Jtv)` From 7b41218ae89fc1d814f88a675b0fd23a0e566970 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 23 Jul 2025 16:39:53 +0530 Subject: [PATCH 17/24] Update src/nlp/api.jl Co-authored-by: Tangi Migot --- src/nlp/api.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/nlp/api.jl b/src/nlp/api.jl index 27e45497..3a62c252 100644 --- a/src/nlp/api.jl +++ b/src/nlp/api.jl @@ -341,7 +341,6 @@ function jac_lin(nlp::AbstractNLPModel) sparse(rows, cols, vals, nlp.meta.nlin, nlp.meta.nvar) end -# Deprecated version with x parameter @deprecate jac_lin(nlp::AbstractNLPModel, x::AbstractVector) jac_lin(nlp) """ From 68b3482c271c341a87568ddee5f7ae407df68330 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Fri, 25 Jul 2025 17:46:42 +0530 Subject: [PATCH 18/24] fixing --- docs/src/guidelines.md | 2 +- src/nlp/api.jl | 42 ++++++++++++++++++++++++---------------- test/nlp/api.jl | 4 ++-- test/nlp/dummy-model.jl | 4 ++-- test/nlp/simple-model.jl | 18 ++++------------- 5 files changed, 34 insertions(+), 36 deletions(-) diff --git a/docs/src/guidelines.md b/docs/src/guidelines.md index 022fd59b..474d73b4 100644 --- a/docs/src/guidelines.md +++ b/docs/src/guidelines.md @@ -72,7 +72,7 @@ The following functions should be defined: - `jac_nln_coord!(nlp, x, jvals)` - `jprod_lin!(nlp, v, Jv)` - `jprod_nln!(nlp, x, v, Jv)` - - `jtprod_lin!(nlp, x, v, Jtv)` + - `jtprod_lin!(nlp, v, Jtv)` - `jtprod_nln!(nlp, x, v, Jtv)` - `hess_coord!(nlp, x, y, hvals; obj_weight=1)` - `hprod!(nlp, x, y, v, Hv; obj_weight=1)` diff --git a/src/nlp/api.jl b/src/nlp/api.jl index 3a62c252..02cd5fde 100644 --- a/src/nlp/api.jl +++ b/src/nlp/api.jl @@ -268,10 +268,10 @@ function jac_coord!(nlp::AbstractNLPModel, x::AbstractVector, vals::AbstractVect increment!(nlp, :neval_jac) if nlp.meta.nlin > 0 if nlp.meta.nnln == 0 - jac_lin_coord!(nlp, x, vals) + jac_lin_coord!(nlp, vals) else lin_ind = 1:(nlp.meta.lin_nnzj) - jac_lin_coord!(nlp, x, view(vals, lin_ind)) + jac_lin_coord!(nlp, view(vals, lin_ind)) end end if nlp.meta.nnln > 0 @@ -396,9 +396,9 @@ function jprod!(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector, Jv: increment!(nlp, :neval_jprod) if nlp.meta.nlin > 0 if nlp.meta.nnln == 0 - jprod_lin!(nlp, x, v, Jv) + jprod_lin!(nlp, v, Jv) else - jprod_lin!(nlp, x, v, view(Jv, nlp.meta.lin)) + jprod_lin!(nlp, v, view(Jv, nlp.meta.lin)) end end if nlp.meta.nnln > 0 @@ -411,6 +411,9 @@ function jprod!(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector, Jv: return Jv end +@deprecate jprod(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector) jprod(nlp, v) +@deprecate jprod!(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector, Jv::AbstractVector) jprod!(nlp, v, Jv) + """ Jv = jprod!(nlp, rows, cols, vals, v, Jv) @@ -433,23 +436,26 @@ function jprod!( end """ - Jv = jprod_lin(nlp, x, v) + Jv = jprod_lin(nlp, v) Evaluate ``J(x)v``, the linear Jacobian-vector product at `x`. """ -function jprod_lin(nlp::AbstractNLPModel{T, S}, x::AbstractVector, v::AbstractVector) where {T, S} - @lencheck nlp.meta.nvar x v +function jprod_lin(nlp::AbstractNLPModel{T, S}, v::AbstractVector) where {T, S} + @lencheck nlp.meta.nvar v Jv = S(undef, nlp.meta.nlin) - return jprod_lin!(nlp, x, v, Jv) + return jprod_lin!(nlp, v, Jv) end """ - Jv = jprod_lin!(nlp, x, v, Jv) + Jv = jprod_lin!(nlp, v, Jv) Evaluate ``J(x)v``, the linear Jacobian-vector product at `x` in place. """ function jprod_lin! end +@deprecate jprod_lin(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector) jprod_lin(nlp, v) +@deprecate jprod_lin!(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector, Jv::AbstractVector) jprod_lin!(nlp, v, Jv) + """ Jv = jprod_lin!(nlp, rows, cols, vals, v, Jv) @@ -533,18 +539,18 @@ function jtprod!(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector, Jt @lencheck nlp.meta.ncon v increment!(nlp, :neval_jtprod) if nlp.meta.nnln == 0 - (nlp.meta.nlin > 0) && jtprod_lin!(nlp, x, v, Jtv) + (nlp.meta.nlin > 0) && jtprod_lin!(nlp, v, Jtv) elseif nlp.meta.nlin == 0 (nlp.meta.nnln > 0) && jtprod_nln!(nlp, x, v, Jtv) elseif nlp.meta.nlin >= nlp.meta.nnln - jtprod_lin!(nlp, x, view(v, nlp.meta.lin), Jtv) + jtprod_lin!(nlp, view(v, nlp.meta.lin), Jtv) if nlp.meta.nnln > 0 Jtv .+= jtprod_nln(nlp, x, view(v, nlp.meta.nln)) end else jtprod_nln!(nlp, x, view(v, nlp.meta.nln), Jtv) if nlp.meta.nlin > 0 - Jtv .+= jtprod_lin(nlp, x, view(v, nlp.meta.lin)) + Jtv .+= jtprod_lin(nlp, view(v, nlp.meta.lin)) end end return Jtv @@ -572,24 +578,26 @@ function jtprod!( end """ - Jtv = jtprod_lin(nlp, x, v) + Jtv = jtprod_lin(nlp, v) Evaluate ``J(x)^Tv``, the linear transposed-Jacobian-vector product at `x`. """ -function jtprod_lin(nlp::AbstractNLPModel{T, S}, x::AbstractVector, v::AbstractVector) where {T, S} - @lencheck nlp.meta.nvar x +function jtprod_lin(nlp::AbstractNLPModel{T, S}, v::AbstractVector) where {T, S} @lencheck nlp.meta.nlin v Jtv = S(undef, nlp.meta.nvar) - return jtprod_lin!(nlp, x, v, Jtv) + return jtprod_lin!(nlp, v, Jtv) end """ - Jtv = jtprod_lin!(nlp, x, v, Jtv) + Jtv = jtprod_lin!(nlp, v, Jtv) Evaluate ``J(x)^Tv``, the linear transposed-Jacobian-vector product at `x` in place. """ function jtprod_lin! end +@deprecate jtprod_lin(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector) jtprod_lin(nlp, v) +@deprecate jtprod_lin!(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector, Jtv::AbstractVector) jtprod_lin!(nlp, v, Jtv) + """ Jtv = jtprod_lin!(nlp, rows, cols, vals, v, Jtv) diff --git a/test/nlp/api.jl b/test/nlp/api.jl index 2aec29e0..3d938e1d 100644 --- a/test/nlp/api.jl +++ b/test/nlp/api.jl @@ -33,10 +33,10 @@ @test jac_lin(nlp) ≈ J(x)[1:1, :] @test jprod(nlp, x, v) ≈ J(x) * v @test jprod_nln(nlp, x, v) ≈ J(x)[2:2, :] * v - @test jprod_lin(nlp, x, v) ≈ J(x)[1:1, :] * v + @test jprod_lin(nlp, v) ≈ J(x)[1:1, :] * v @test jtprod(nlp, x, w) ≈ J(x)' * w @test jtprod_nln(nlp, x, w[2:2]) ≈ J(x)[2:2, :]' * w[2:2] - @test jtprod_lin(nlp, x, w[1:1]) ≈ J(x)[1:1, :]' * w[1:1] + @test jtprod_lin(nlp, w[1:1]) ≈ J(x)[1:1, :]' * w[1:1] @test hess(nlp, x, y) ≈ tril(H(x, y)) @test hprod(nlp, x, y, v) ≈ H(x, y) * v diff --git a/test/nlp/dummy-model.jl b/test/nlp/dummy-model.jl index b625d885..e5f401f3 100644 --- a/test/nlp/dummy-model.jl +++ b/test/nlp/dummy-model.jl @@ -19,8 +19,8 @@ end @test_throws(MethodError, jth_congrad(model, [0.0], 1)) @test_throws(MethodError, jth_sparse_congrad(model, [0.0], 1)) @test_throws(MethodError, jth_congrad!(model, [0.0], 1, [2.0])) - @test_throws(MethodError, jprod_lin!(model, [0.0], [1.0], [2.0])) - @test_throws(MethodError, jtprod_lin!(model, [0.0], [1.0], [2.0])) + @test_throws(MethodError, jprod_lin!(model, [0.0], 1)) + @test_throws(MethodError, jtprod_lin!(model, [0.0], 1)) @test_throws(MethodError, jprod_nln!(model, [0.0], [1.0], [2.0])) @test_throws(MethodError, jtprod_nln!(model, [0.0], [1.0], [2.0])) @test_throws(MethodError, jth_hess_coord!(model, [0.0], 1)) diff --git a/test/nlp/simple-model.jl b/test/nlp/simple-model.jl index f66040ec..430c8f1f 100644 --- a/test/nlp/simple-model.jl +++ b/test/nlp/simple-model.jl @@ -159,13 +159,8 @@ function NLPModels.jprod_nln!( return Jv end -function NLPModels.jprod_lin!( - nlp::SimpleNLPModel, - x::AbstractVector, - v::AbstractVector, - Jv::AbstractVector, -) - @lencheck 2 x v +function NLPModels.jprod_lin!(nlp::SimpleNLPModel, v::AbstractVector, Jv::AbstractVector) + @lencheck 2 v @lencheck 1 Jv increment!(nlp, :neval_jprod_lin) Jv .= [v[1] - 2 * v[2]] @@ -185,13 +180,8 @@ function NLPModels.jtprod_nln!( return Jtv end -function NLPModels.jtprod_lin!( - nlp::SimpleNLPModel, - x::AbstractVector, - v::AbstractVector, - Jtv::AbstractVector, -) - @lencheck 2 x Jtv +function NLPModels.jtprod_lin!(nlp::SimpleNLPModel, v::AbstractVector, Jtv::AbstractVector) + @lencheck 2 Jtv @lencheck 1 v increment!(nlp, :neval_jtprod_lin) Jtv .= [v[1]; -2 * v[1]] From 9c756940f711fa28f8f818c33987f47145673492 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Sun, 27 Jul 2025 01:52:28 +0530 Subject: [PATCH 19/24] passing failing checks --- test/nlp/simple-model.jl | 29 ++++++++++++++++++++++++++++- test/nls/simple-model.jl | 22 ++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/test/nlp/simple-model.jl b/test/nlp/simple-model.jl index 430c8f1f..176a22bd 100644 --- a/test/nlp/simple-model.jl +++ b/test/nlp/simple-model.jl @@ -37,6 +37,27 @@ end SimpleNLPModel() = SimpleNLPModel(Float64) +function NLPModels.jprod(nlp::SimpleNLPModel, x::AbstractVector, v::AbstractVector) + Jv = similar(v, nlp.meta.ncon) + NLPModels.jprod!(nlp, x, v, Jv) + return Jv +end + +function NLPModels.jprod(nlp::SimpleNLPModel, v::AbstractVector) + Jv = similar(v, nlp.meta.ncon) + NLPModels.jprod!(nlp, v, Jv) + return Jv +end + +function NLPModels.jprod!(nlp::SimpleNLPModel, v::AbstractVector, Jv::AbstractVector) + NLPModels.jprod_lin!(nlp, v, view(Jv, nlp.meta.lin)) + NLPModels.jprod_nln!(nlp, x, v, view(Jv, nlp.meta.nln)) + if length(Jv) > length(nlp.meta.lin) + Jv[length(nlp.meta.lin)+1:end] .= 0 + end + return Jv +end + function NLPModels.obj(nlp::SimpleNLPModel, x::AbstractVector) @lencheck 2 x increment!(nlp, :neval_obj) @@ -159,11 +180,17 @@ function NLPModels.jprod_nln!( return Jv end +function NLPModels.jprod!(nlp::SimpleNLPModel, x::AbstractVector, v::AbstractVector, Jv::AbstractVector) + NLPModels.jprod_lin!(nlp, v, view(Jv, nlp.meta.lin)) + NLPModels.jprod_nln!(nlp, x, v, view(Jv, nlp.meta.nln)) + return Jv +end + function NLPModels.jprod_lin!(nlp::SimpleNLPModel, v::AbstractVector, Jv::AbstractVector) @lencheck 2 v @lencheck 1 Jv increment!(nlp, :neval_jprod_lin) - Jv .= [v[1] - 2 * v[2]] + Jv[1] = v[1] - 2 * v[2] return Jv end diff --git a/test/nls/simple-model.jl b/test/nls/simple-model.jl index 8f1fe50c..85a8314c 100644 --- a/test/nls/simple-model.jl +++ b/test/nls/simple-model.jl @@ -43,6 +43,28 @@ end SimpleNLSModel() = SimpleNLSModel(Float64) +function NLPModels.jprod(nls::SimpleNLSModel, x::AbstractVector, v::AbstractVector) + Jv = similar(v, nls.meta.ncon) + NLPModels.jprod!(nls, x, v, Jv) + return Jv +end + +function NLPModels.jprod(nls::SimpleNLSModel, v::AbstractVector) + Jv = similar(v, nls.meta.ncon) + NLPModels.jprod!(nls, v, Jv) + return Jv +end + +function NLPModels.jprod!(nls::SimpleNLSModel, v::AbstractVector, Jv::AbstractVector) + NLPModels.jprod_nln!(nls, nls.meta.x0, v, Jv) + return Jv +end + +function NLPModels.jprod!(nls::SimpleNLSModel, x::AbstractVector, v::AbstractVector, Jv::AbstractVector) + NLPModels.jprod_nln!(nls, x, v, Jv) + return Jv +end + function NLPModels.residual!(nls::SimpleNLSModel, x::AbstractVector, Fx::AbstractVector) @lencheck 2 x Fx increment!(nls, :neval_residual) From aee956dea9e87a8d0cccb26e03a39f7e494c4ba0 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Sun, 27 Jul 2025 19:19:30 +0530 Subject: [PATCH 20/24] Update src/nlp/api.jl Co-authored-by: Tangi Migot --- src/nlp/api.jl | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/nlp/api.jl b/src/nlp/api.jl index 02cd5fde..59dea7ab 100644 --- a/src/nlp/api.jl +++ b/src/nlp/api.jl @@ -411,9 +411,6 @@ function jprod!(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector, Jv: return Jv end -@deprecate jprod(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector) jprod(nlp, v) -@deprecate jprod!(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector, Jv::AbstractVector) jprod!(nlp, v, Jv) - """ Jv = jprod!(nlp, rows, cols, vals, v, Jv) From 7ba1ef54ceab8ccb98b02fe7bd38ae143403466e Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Sun, 27 Jul 2025 19:19:40 +0530 Subject: [PATCH 21/24] Update test/nlp/simple-model.jl Co-authored-by: Tangi Migot --- test/nlp/simple-model.jl | 5 ----- 1 file changed, 5 deletions(-) diff --git a/test/nlp/simple-model.jl b/test/nlp/simple-model.jl index 176a22bd..1a60583a 100644 --- a/test/nlp/simple-model.jl +++ b/test/nlp/simple-model.jl @@ -180,11 +180,6 @@ function NLPModels.jprod_nln!( return Jv end -function NLPModels.jprod!(nlp::SimpleNLPModel, x::AbstractVector, v::AbstractVector, Jv::AbstractVector) - NLPModels.jprod_lin!(nlp, v, view(Jv, nlp.meta.lin)) - NLPModels.jprod_nln!(nlp, x, v, view(Jv, nlp.meta.nln)) - return Jv -end function NLPModels.jprod_lin!(nlp::SimpleNLPModel, v::AbstractVector, Jv::AbstractVector) @lencheck 2 v From e8f1e7121fef712112798ec849a8cb39bb146f91 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Sun, 27 Jul 2025 19:19:49 +0530 Subject: [PATCH 22/24] Update test/nlp/simple-model.jl Co-authored-by: Tangi Migot --- test/nlp/simple-model.jl | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/test/nlp/simple-model.jl b/test/nlp/simple-model.jl index 1a60583a..3c780004 100644 --- a/test/nlp/simple-model.jl +++ b/test/nlp/simple-model.jl @@ -37,27 +37,6 @@ end SimpleNLPModel() = SimpleNLPModel(Float64) -function NLPModels.jprod(nlp::SimpleNLPModel, x::AbstractVector, v::AbstractVector) - Jv = similar(v, nlp.meta.ncon) - NLPModels.jprod!(nlp, x, v, Jv) - return Jv -end - -function NLPModels.jprod(nlp::SimpleNLPModel, v::AbstractVector) - Jv = similar(v, nlp.meta.ncon) - NLPModels.jprod!(nlp, v, Jv) - return Jv -end - -function NLPModels.jprod!(nlp::SimpleNLPModel, v::AbstractVector, Jv::AbstractVector) - NLPModels.jprod_lin!(nlp, v, view(Jv, nlp.meta.lin)) - NLPModels.jprod_nln!(nlp, x, v, view(Jv, nlp.meta.nln)) - if length(Jv) > length(nlp.meta.lin) - Jv[length(nlp.meta.lin)+1:end] .= 0 - end - return Jv -end - function NLPModels.obj(nlp::SimpleNLPModel, x::AbstractVector) @lencheck 2 x increment!(nlp, :neval_obj) From 0b13dafffc612e176842d616a0372c37fac29083 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Sun, 27 Jul 2025 19:19:56 +0530 Subject: [PATCH 23/24] Update test/nls/simple-model.jl Co-authored-by: Tangi Migot --- test/nls/simple-model.jl | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/test/nls/simple-model.jl b/test/nls/simple-model.jl index 85a8314c..8f1fe50c 100644 --- a/test/nls/simple-model.jl +++ b/test/nls/simple-model.jl @@ -43,28 +43,6 @@ end SimpleNLSModel() = SimpleNLSModel(Float64) -function NLPModels.jprod(nls::SimpleNLSModel, x::AbstractVector, v::AbstractVector) - Jv = similar(v, nls.meta.ncon) - NLPModels.jprod!(nls, x, v, Jv) - return Jv -end - -function NLPModels.jprod(nls::SimpleNLSModel, v::AbstractVector) - Jv = similar(v, nls.meta.ncon) - NLPModels.jprod!(nls, v, Jv) - return Jv -end - -function NLPModels.jprod!(nls::SimpleNLSModel, v::AbstractVector, Jv::AbstractVector) - NLPModels.jprod_nln!(nls, nls.meta.x0, v, Jv) - return Jv -end - -function NLPModels.jprod!(nls::SimpleNLSModel, x::AbstractVector, v::AbstractVector, Jv::AbstractVector) - NLPModels.jprod_nln!(nls, x, v, Jv) - return Jv -end - function NLPModels.residual!(nls::SimpleNLSModel, x::AbstractVector, Fx::AbstractVector) @lencheck 2 x Fx increment!(nls, :neval_residual) From 348f8e7c81a25971df9a1071b2febf50ba914392 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Sun, 27 Jul 2025 19:20:09 +0530 Subject: [PATCH 24/24] Update test/nlp/dummy-model.jl Co-authored-by: Tangi Migot --- test/nlp/dummy-model.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/nlp/dummy-model.jl b/test/nlp/dummy-model.jl index e5f401f3..4dd2f9b5 100644 --- a/test/nlp/dummy-model.jl +++ b/test/nlp/dummy-model.jl @@ -19,8 +19,8 @@ end @test_throws(MethodError, jth_congrad(model, [0.0], 1)) @test_throws(MethodError, jth_sparse_congrad(model, [0.0], 1)) @test_throws(MethodError, jth_congrad!(model, [0.0], 1, [2.0])) - @test_throws(MethodError, jprod_lin!(model, [0.0], 1)) - @test_throws(MethodError, jtprod_lin!(model, [0.0], 1)) + @test_throws(MethodError, jprod_lin!(model, [0.0], [2.0])) + @test_throws(MethodError, jtprod_lin!(model, [0.0], [2.0])) @test_throws(MethodError, jprod_nln!(model, [0.0], [1.0], [2.0])) @test_throws(MethodError, jtprod_nln!(model, [0.0], [1.0], [2.0])) @test_throws(MethodError, jth_hess_coord!(model, [0.0], 1))