From b8f5e7dd21f9854fc06845bc2e7223c5ea6efbfb Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Mon, 28 Jul 2025 06:43:48 +0530 Subject: [PATCH 01/10] Fix objcons! for SimpleNLSModel to match test expectations: constraints in output, objective from residual --- test/nls/simple-model.jl | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/test/nls/simple-model.jl b/test/nls/simple-model.jl index 8f1fe50c..b667f01d 100644 --- a/test/nls/simple-model.jl +++ b/test/nls/simple-model.jl @@ -43,6 +43,37 @@ end SimpleNLSModel() = SimpleNLSModel(Float64) +# In-place objcons! for NLS +function NLPModels.objcons!(nls::SimpleNLSModel, x::AbstractVector, Fx::AbstractVector) + @lencheck nls.meta.ncon Fx + NLPModels.cons_nln!(nls, x, Fx) + res = [1 - x[1]; 10 * (x[2] - x[1]^2)] + f = 0.5 * sum(abs2, res) + return f, Fx +end + +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 33766c788ed90ae5d8aeb301259ebbaa027018d3 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Tue, 29 Jul 2025 05:16:04 +0530 Subject: [PATCH 02/10] Add dual objcons! signatures for SimpleNLSModel to support new AbstractNLSModel API --- test/nls/simple-model.jl | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/nls/simple-model.jl b/test/nls/simple-model.jl index b667f01d..e8bd9909 100644 --- a/test/nls/simple-model.jl +++ b/test/nls/simple-model.jl @@ -52,6 +52,16 @@ function NLPModels.objcons!(nls::SimpleNLSModel, x::AbstractVector, Fx::Abstract return f, Fx end +function NLPModels.objcons!(nls::SimpleNLSModel, x::AbstractVector, Fx::AbstractVector, res::AbstractVector; recompute::Bool=true) + @lencheck nls.meta.ncon Fx + NLPModels.cons_nln!(nls, x, Fx) + if recompute + res .= [1 - x[1]; 10 * (x[2] - x[1]^2)] + end + f = 0.5 * sum(abs2, res) + return f, Fx +end + function NLPModels.jprod(nls::SimpleNLSModel, x::AbstractVector, v::AbstractVector) Jv = similar(v, nls.meta.ncon) NLPModels.jprod!(nls, x, v, Jv) From e46d1a93a384692e01f7e3195e44b0561a5e475c Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Tue, 29 Jul 2025 05:16:38 +0530 Subject: [PATCH 03/10] objcons --- src/nls/api.jl | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/nls/api.jl b/src/nls/api.jl index 772c61ff..12f9aa7d 100644 --- a/src/nls/api.jl +++ b/src/nls/api.jl @@ -451,6 +451,30 @@ function obj(nls::AbstractNLSModel{T, S}, x::AbstractVector) where {T, S} return obj(nls, x, Fx) end +""" + f, c = objcons!(nls, x, c) + f, c = objcons!(nls, x, c, Fx; recompute::Bool=true) + +In-place evaluation of constraints and objective for AbstractNLSModel. +If `Fx` is provided, it is used for the objective; otherwise, the residual is computed. +""" +function objcons!(nls::AbstractNLSModel, x::AbstractVector, c::AbstractVector) + cons_nln!(nls, x, c) + Fx = similar(x, nls.nls_meta.nequ) + residual!(nls, x, Fx) + f = 0.5 * sum(abs2, Fx) + return f, c +end + +function objcons!(nls::AbstractNLSModel, x::AbstractVector, c::AbstractVector, Fx::AbstractVector; recompute::Bool=true) + cons_nln!(nls, x, c) + if recompute + residual!(nls, x, Fx) + end + f = 0.5 * sum(abs2, Fx) + return f, c +end + """ g = grad!(nls, x, g) g = grad!(nls, x, g, Fx; recompute::Bool=true) From f2df725b95e774ddf97e81636d95df168ee2dcd3 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Tue, 29 Jul 2025 19:15:17 +0530 Subject: [PATCH 04/10] Update src/nls/api.jl Co-authored-by: Tangi Migot --- src/nls/api.jl | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/nls/api.jl b/src/nls/api.jl index 12f9aa7d..adaf01a3 100644 --- a/src/nls/api.jl +++ b/src/nls/api.jl @@ -458,12 +458,11 @@ end In-place evaluation of constraints and objective for AbstractNLSModel. If `Fx` is provided, it is used for the objective; otherwise, the residual is computed. """ -function objcons!(nls::AbstractNLSModel, x::AbstractVector, c::AbstractVector) - cons_nln!(nls, x, c) - Fx = similar(x, nls.nls_meta.nequ) - residual!(nls, x, Fx) - f = 0.5 * sum(abs2, Fx) - return f, c +function objcons!(nls::AbstractNLSModel{T, S}, x::AbstractVector, c::AbstractVector) where {T, S} + @lencheck nls.meta.nvar x + @lencheck nls.meta.ncon c + Fx = S(undef, nls.nls_meta.nequ) + return objcons!(nls, x, c, Fx) end function objcons!(nls::AbstractNLSModel, x::AbstractVector, c::AbstractVector, Fx::AbstractVector; recompute::Bool=true) From fa4527cb22639ee57ddeb44c08dd045803a5be2c Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Tue, 29 Jul 2025 19:15:25 +0530 Subject: [PATCH 05/10] Update src/nls/api.jl Co-authored-by: Tangi Migot --- src/nls/api.jl | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/nls/api.jl b/src/nls/api.jl index adaf01a3..8fd7e9fe 100644 --- a/src/nls/api.jl +++ b/src/nls/api.jl @@ -466,12 +466,8 @@ function objcons!(nls::AbstractNLSModel{T, S}, x::AbstractVector, c::AbstractVec end function objcons!(nls::AbstractNLSModel, x::AbstractVector, c::AbstractVector, Fx::AbstractVector; recompute::Bool=true) - cons_nln!(nls, x, c) - if recompute - residual!(nls, x, Fx) - end - f = 0.5 * sum(abs2, Fx) - return f, c + cons_nln!(nls, x, c) + return obj(nls, x, Fx; recompute = recompute), c end """ From f5128c4fec59f1e4f194cb44d9de787efc4b53bb Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Tue, 29 Jul 2025 19:16:33 +0530 Subject: [PATCH 06/10] Update simple-model.jl --- test/nls/simple-model.jl | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/test/nls/simple-model.jl b/test/nls/simple-model.jl index e8bd9909..b667f01d 100644 --- a/test/nls/simple-model.jl +++ b/test/nls/simple-model.jl @@ -52,16 +52,6 @@ function NLPModels.objcons!(nls::SimpleNLSModel, x::AbstractVector, Fx::Abstract return f, Fx end -function NLPModels.objcons!(nls::SimpleNLSModel, x::AbstractVector, Fx::AbstractVector, res::AbstractVector; recompute::Bool=true) - @lencheck nls.meta.ncon Fx - NLPModels.cons_nln!(nls, x, Fx) - if recompute - res .= [1 - x[1]; 10 * (x[2] - x[1]^2)] - end - f = 0.5 * sum(abs2, res) - return f, Fx -end - function NLPModels.jprod(nls::SimpleNLSModel, x::AbstractVector, v::AbstractVector) Jv = similar(v, nls.meta.ncon) NLPModels.jprod!(nls, x, v, Jv) From 58e7df43fc193eb3236f1431b95d8ced96723c70 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Thu, 31 Jul 2025 22:15:46 +0530 Subject: [PATCH 07/10] changes to the NLS API and a simple model test --- src/nls/api.jl | 1 + test/nls/simple-model.jl | 1 + 2 files changed, 2 insertions(+) diff --git a/src/nls/api.jl b/src/nls/api.jl index 8fd7e9fe..e7c6d7d1 100644 --- a/src/nls/api.jl +++ b/src/nls/api.jl @@ -457,6 +457,7 @@ end In-place evaluation of constraints and objective for AbstractNLSModel. If `Fx` is provided, it is used for the objective; otherwise, the residual is computed. +If `recompute` is `false`, the function assumes that `Fx` already contains the correct residual values and does not recompute them. """ function objcons!(nls::AbstractNLSModel{T, S}, x::AbstractVector, c::AbstractVector) where {T, S} @lencheck nls.meta.nvar x diff --git a/test/nls/simple-model.jl b/test/nls/simple-model.jl index b667f01d..389b062b 100644 --- a/test/nls/simple-model.jl +++ b/test/nls/simple-model.jl @@ -52,6 +52,7 @@ function NLPModels.objcons!(nls::SimpleNLSModel, x::AbstractVector, Fx::Abstract return f, Fx end + function NLPModels.jprod(nls::SimpleNLSModel, x::AbstractVector, v::AbstractVector) Jv = similar(v, nls.meta.ncon) NLPModels.jprod!(nls, x, v, Jv) From 57d7829c3dcab221f91f1c36e2e364bc8c428c3f Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Mon, 4 Aug 2025 18:03:58 +0530 Subject: [PATCH 08/10] Update src/nls/api.jl Co-authored-by: Tangi Migot --- src/nls/api.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nls/api.jl b/src/nls/api.jl index e7c6d7d1..b145eca8 100644 --- a/src/nls/api.jl +++ b/src/nls/api.jl @@ -457,7 +457,7 @@ end In-place evaluation of constraints and objective for AbstractNLSModel. If `Fx` is provided, it is used for the objective; otherwise, the residual is computed. -If `recompute` is `false`, the function assumes that `Fx` already contains the correct residual values and does not recompute them. +If `recompute` is `true`, then `Fx` is updated with the residual at `x`. """ function objcons!(nls::AbstractNLSModel{T, S}, x::AbstractVector, c::AbstractVector) where {T, S} @lencheck nls.meta.nvar x From 9763d2a3b6ea511fbb3f5b663a3cee7f516a4e04 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Mon, 4 Aug 2025 18:04:07 +0530 Subject: [PATCH 09/10] Update src/nls/api.jl Co-authored-by: Tangi Migot --- src/nls/api.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nls/api.jl b/src/nls/api.jl index b145eca8..7f3b33f8 100644 --- a/src/nls/api.jl +++ b/src/nls/api.jl @@ -456,7 +456,7 @@ end f, c = objcons!(nls, x, c, Fx; recompute::Bool=true) In-place evaluation of constraints and objective for AbstractNLSModel. -If `Fx` is provided, it is used for the objective; otherwise, the residual is computed. +`Fx` is overwritten with the value of the residual `F(x)`. If `recompute` is `true`, then `Fx` is updated with the residual at `x`. """ function objcons!(nls::AbstractNLSModel{T, S}, x::AbstractVector, c::AbstractVector) where {T, S} From 5ed26da62132470ce9ff8e778a93a9cc236cf9d3 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Mon, 4 Aug 2025 18:04:30 +0530 Subject: [PATCH 10/10] Update test/nls/simple-model.jl Co-authored-by: Tangi Migot --- test/nls/simple-model.jl | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/test/nls/simple-model.jl b/test/nls/simple-model.jl index 389b062b..8f1fe50c 100644 --- a/test/nls/simple-model.jl +++ b/test/nls/simple-model.jl @@ -43,38 +43,6 @@ end SimpleNLSModel() = SimpleNLSModel(Float64) -# In-place objcons! for NLS -function NLPModels.objcons!(nls::SimpleNLSModel, x::AbstractVector, Fx::AbstractVector) - @lencheck nls.meta.ncon Fx - NLPModels.cons_nln!(nls, x, Fx) - res = [1 - x[1]; 10 * (x[2] - x[1]^2)] - f = 0.5 * sum(abs2, res) - return f, Fx -end - - -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)