From 86f4694ed76aa23472f86be9c9e724ca18f9f55a Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Tue, 4 Nov 2025 04:26:04 +0000 Subject: [PATCH 1/9] Add @lencheck macro and tests (#188) --- src/utils.jl | 18 ++++++++++++++++++ test/lencheck.jl | 9 +++++++++ 2 files changed, 27 insertions(+) create mode 100644 test/lencheck.jl diff --git a/src/utils.jl b/src/utils.jl index a98b54b..48989b4 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -6,6 +6,24 @@ import NLPModels.increment!, NLPModels.decrement! using JuMP, MathOptInterface const MOI = MathOptInterface +""" + @lencheck expected expr + +Macro to check that `length(expr) == expected` at runtime. +Throws an ArgumentError with a helpful message when the lengths mismatch. +Example: + @lencheck nlp.meta.nvar x +""" +macro lencheck(expected, var) + return esc(:(begin + _len_expected = $(expected) + _len_var = length($(var)) + if _len_var != _len_expected + throw(ArgumentError("length($(QuoteNode(var))) = $( _len_var ) but expected $( _len_expected )")) + end + end)) +end + # VariableIndex const VI = MOI.VariableIndex # VariableIndex(value) diff --git a/test/lencheck.jl b/test/lencheck.jl new file mode 100644 index 0000000..557eb39 --- /dev/null +++ b/test/lencheck.jl @@ -0,0 +1,9 @@ +using Test +using NLPModelsJuMP + +@testset "lencheck macro" begin + x = [1,2,3] + @lencheck 3 x + y = [1,2] + @test_throws ArgumentError @lencheck 3 y +end From f880092d010b83c5cb7f9ea778c7f52c81a7ffc5 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Tue, 4 Nov 2025 09:58:00 +0530 Subject: [PATCH 2/9] Delete test/lencheck.jl --- test/lencheck.jl | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 test/lencheck.jl diff --git a/test/lencheck.jl b/test/lencheck.jl deleted file mode 100644 index 557eb39..0000000 --- a/test/lencheck.jl +++ /dev/null @@ -1,9 +0,0 @@ -using Test -using NLPModelsJuMP - -@testset "lencheck macro" begin - x = [1,2,3] - @lencheck 3 x - y = [1,2] - @test_throws ArgumentError @lencheck 3 y -end From 9358c02f30611e444d2f7deb3bc5964ca5ad1504 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 5 Nov 2025 14:16:35 +0000 Subject: [PATCH 3/9] Use NLPModels.@lencheck in cons and residual functions to validate input lengths (#188) --- src/moi_nlp_model.jl | 6 ++++++ src/moi_nls_model.jl | 8 ++++++++ test/lencheck.jl | 9 +++++++++ 3 files changed, 23 insertions(+) create mode 100644 test/lencheck.jl diff --git a/src/moi_nlp_model.jl b/src/moi_nlp_model.jl index c85a7c0..6e74e5b 100644 --- a/src/moi_nlp_model.jl +++ b/src/moi_nlp_model.jl @@ -107,12 +107,16 @@ end function NLPModels.cons_lin!(nlp::MathOptNLPModel, x::AbstractVector, c::AbstractVector) increment!(nlp, :neval_cons_lin) + NLPModels.@lencheck nlp.meta.nvar x + NLPModels.@lencheck nlp.meta.nlin c coo_prod!(nlp.lincon.jacobian.rows, nlp.lincon.jacobian.cols, nlp.lincon.jacobian.vals, x, c) return c end function NLPModels.cons_nln!(nlp::MathOptNLPModel, x::AbstractVector, c::AbstractVector) increment!(nlp, :neval_cons_nln) + NLPModels.@lencheck nlp.meta.nvar x + NLPModels.@lencheck nlp.meta.nnln c if nlp.quadcon.nquad > 0 for i = 1:(nlp.quadcon.nquad) qcon = nlp.quadcon.constraints[i] @@ -127,6 +131,8 @@ end function NLPModels.cons!(nlp::MathOptNLPModel, x::AbstractVector, c::AbstractVector) increment!(nlp, :neval_cons) + NLPModels.@lencheck nlp.meta.nvar x + NLPModels.@lencheck nlp.meta.ncon c if nlp.meta.nlin > 0 coo_prod!(nlp.lincon.jacobian.rows, nlp.lincon.jacobian.cols, nlp.lincon.jacobian.vals, x, c) end diff --git a/src/moi_nls_model.jl b/src/moi_nls_model.jl index 8eeccf9..859109e 100644 --- a/src/moi_nls_model.jl +++ b/src/moi_nls_model.jl @@ -86,6 +86,8 @@ end function NLPModels.residual!(nls::MathOptNLSModel, x::AbstractVector, Fx::AbstractVector) increment!(nls, :neval_residual) + NLPModels.@lencheck nls.meta.nvar x + NLPModels.@lencheck nls.nls_meta.nequ Fx if nls.nls_meta.nlin > 0 coo_prod!( nls.linequ.jacobian.rows, @@ -253,12 +255,16 @@ end function NLPModels.cons_lin!(nls::MathOptNLSModel, x::AbstractVector, c::AbstractVector) increment!(nls, :neval_cons_lin) + NLPModels.@lencheck nls.meta.nvar x + NLPModels.@lencheck nls.nls_meta.nlin c coo_prod!(nls.lincon.jacobian.rows, nls.lincon.jacobian.cols, nls.lincon.jacobian.vals, x, c) return c end function NLPModels.cons_nln!(nls::MathOptNLSModel, x::AbstractVector, c::AbstractVector) increment!(nls, :neval_cons_nln) + NLPModels.@lencheck nls.meta.nvar x + NLPModels.@lencheck nls.meta.nnln c if nls.quadcon.nquad > 0 for i = 1:(nls.quadcon.nquad) qcon = nls.quadcon.constraints[i] @@ -273,6 +279,8 @@ end function NLPModels.cons!(nls::MathOptNLSModel, x::AbstractVector, c::AbstractVector) increment!(nls, :neval_cons) + NLPModels.@lencheck nls.meta.nvar x + NLPModels.@lencheck nls.meta.ncon c if nls.meta.nlin > 0 coo_prod!(nls.lincon.jacobian.rows, nls.lincon.jacobian.cols, nls.lincon.jacobian.vals, x, c) end diff --git a/test/lencheck.jl b/test/lencheck.jl new file mode 100644 index 0000000..2e8e09a --- /dev/null +++ b/test/lencheck.jl @@ -0,0 +1,9 @@ +using Test +using NLPModelsJuMP + +@testset "lencheck macro" begin + x = [1,2,3] + NLPModels.@lencheck 3 x + y = [1,2] + @test_throws ArgumentError NLPModels.@lencheck 3 y +end From 072123bf352c54f49f2e2a5999beaec3a09d0322 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 5 Nov 2025 14:16:47 +0000 Subject: [PATCH 4/9] changes --- src/utils.jl | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/utils.jl b/src/utils.jl index 48989b4..a98b54b 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -6,24 +6,6 @@ import NLPModels.increment!, NLPModels.decrement! using JuMP, MathOptInterface const MOI = MathOptInterface -""" - @lencheck expected expr - -Macro to check that `length(expr) == expected` at runtime. -Throws an ArgumentError with a helpful message when the lengths mismatch. -Example: - @lencheck nlp.meta.nvar x -""" -macro lencheck(expected, var) - return esc(:(begin - _len_expected = $(expected) - _len_var = length($(var)) - if _len_var != _len_expected - throw(ArgumentError("length($(QuoteNode(var))) = $( _len_var ) but expected $( _len_expected )")) - end - end)) -end - # VariableIndex const VI = MOI.VariableIndex # VariableIndex(value) From a43abddf5c293dae8111af24e3e83c7dd51b7db4 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 5 Nov 2025 14:40:16 +0000 Subject: [PATCH 5/9] Use at-least length checks for output vectors (accept views/larger arrays) --- src/moi_nlp_model.jl | 12 +++++++++--- src/moi_nls_model.jl | 12 +++++++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/moi_nlp_model.jl b/src/moi_nlp_model.jl index 6e74e5b..95a20b0 100644 --- a/src/moi_nlp_model.jl +++ b/src/moi_nlp_model.jl @@ -108,7 +108,9 @@ end function NLPModels.cons_lin!(nlp::MathOptNLPModel, x::AbstractVector, c::AbstractVector) increment!(nlp, :neval_cons_lin) NLPModels.@lencheck nlp.meta.nvar x - NLPModels.@lencheck nlp.meta.nlin c + if length(c) < nlp.meta.nlin + throw(ArgumentError("length(c) = $(length(c)) but expected at least $(nlp.meta.nlin)")) + end coo_prod!(nlp.lincon.jacobian.rows, nlp.lincon.jacobian.cols, nlp.lincon.jacobian.vals, x, c) return c end @@ -116,7 +118,9 @@ end function NLPModels.cons_nln!(nlp::MathOptNLPModel, x::AbstractVector, c::AbstractVector) increment!(nlp, :neval_cons_nln) NLPModels.@lencheck nlp.meta.nvar x - NLPModels.@lencheck nlp.meta.nnln c + if length(c) < nlp.meta.nnln + throw(ArgumentError("length(c) = $(length(c)) but expected at least $(nlp.meta.nnln)")) + end if nlp.quadcon.nquad > 0 for i = 1:(nlp.quadcon.nquad) qcon = nlp.quadcon.constraints[i] @@ -132,7 +136,9 @@ end function NLPModels.cons!(nlp::MathOptNLPModel, x::AbstractVector, c::AbstractVector) increment!(nlp, :neval_cons) NLPModels.@lencheck nlp.meta.nvar x - NLPModels.@lencheck nlp.meta.ncon c + if length(c) < nlp.meta.ncon + throw(ArgumentError("length(c) = $(length(c)) but expected at least $(nlp.meta.ncon)")) + end if nlp.meta.nlin > 0 coo_prod!(nlp.lincon.jacobian.rows, nlp.lincon.jacobian.cols, nlp.lincon.jacobian.vals, x, c) end diff --git a/src/moi_nls_model.jl b/src/moi_nls_model.jl index 859109e..e948186 100644 --- a/src/moi_nls_model.jl +++ b/src/moi_nls_model.jl @@ -256,7 +256,9 @@ end function NLPModels.cons_lin!(nls::MathOptNLSModel, x::AbstractVector, c::AbstractVector) increment!(nls, :neval_cons_lin) NLPModels.@lencheck nls.meta.nvar x - NLPModels.@lencheck nls.nls_meta.nlin c + if length(c) < nls.nls_meta.nlin + throw(ArgumentError("length(c) = $(length(c)) but expected at least $(nls.nls_meta.nlin)")) + end coo_prod!(nls.lincon.jacobian.rows, nls.lincon.jacobian.cols, nls.lincon.jacobian.vals, x, c) return c end @@ -264,7 +266,9 @@ end function NLPModels.cons_nln!(nls::MathOptNLSModel, x::AbstractVector, c::AbstractVector) increment!(nls, :neval_cons_nln) NLPModels.@lencheck nls.meta.nvar x - NLPModels.@lencheck nls.meta.nnln c + if length(c) < nls.meta.nnln + throw(ArgumentError("length(c) = $(length(c)) but expected at least $(nls.meta.nnln)")) + end if nls.quadcon.nquad > 0 for i = 1:(nls.quadcon.nquad) qcon = nls.quadcon.constraints[i] @@ -280,7 +284,9 @@ end function NLPModels.cons!(nls::MathOptNLSModel, x::AbstractVector, c::AbstractVector) increment!(nls, :neval_cons) NLPModels.@lencheck nls.meta.nvar x - NLPModels.@lencheck nls.meta.ncon c + if length(c) < nls.meta.ncon + throw(ArgumentError("length(c) = $(length(c)) but expected at least $(nls.meta.ncon)")) + end if nls.meta.nlin > 0 coo_prod!(nls.lincon.jacobian.rows, nls.lincon.jacobian.cols, nls.lincon.jacobian.vals, x, c) end From 6dd690551d093b87015c6109e59c1fd5346909e1 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Wed, 5 Nov 2025 22:51:21 +0530 Subject: [PATCH 6/9] fixing the linear constraints computation in MOI NLS model --- src/moi_nls_model.jl | 14 +++++++++++--- test/lencheck.jl | 8 ++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/moi_nls_model.jl b/src/moi_nls_model.jl index e948186..5aeeb7d 100644 --- a/src/moi_nls_model.jl +++ b/src/moi_nls_model.jl @@ -256,10 +256,18 @@ end function NLPModels.cons_lin!(nls::MathOptNLSModel, x::AbstractVector, c::AbstractVector) increment!(nls, :neval_cons_lin) NLPModels.@lencheck nls.meta.nvar x - if length(c) < nls.nls_meta.nlin - throw(ArgumentError("length(c) = $(length(c)) but expected at least $(nls.nls_meta.nlin)")) + if (nls.nls_meta.nlin > 0) && (length(c) >= nls.nls_meta.nlin) + coo_prod!(nls.linequ.jacobian.rows, nls.linequ.jacobian.cols, nls.linequ.jacobian.vals, x, c) + if !isempty(nls.linequ.constants) + view(c, 1:length(nls.linequ.constants)) .+= nls.linequ.constants + end + return c + elseif length(c) >= nls.meta.nlin + coo_prod!(nls.lincon.jacobian.rows, nls.lincon.jacobian.cols, nls.lincon.jacobian.vals, x, c) + return c + else + throw(ArgumentError("length(c) = $(length(c)) but expected at least $(min(nls.nls_meta.nlin, nls.meta.nlin))")) end - coo_prod!(nls.lincon.jacobian.rows, nls.lincon.jacobian.cols, nls.lincon.jacobian.vals, x, c) return c end diff --git a/test/lencheck.jl b/test/lencheck.jl index 2e8e09a..e621343 100644 --- a/test/lencheck.jl +++ b/test/lencheck.jl @@ -2,8 +2,8 @@ using Test using NLPModelsJuMP @testset "lencheck macro" begin - x = [1,2,3] - NLPModels.@lencheck 3 x - y = [1,2] - @test_throws ArgumentError NLPModels.@lencheck 3 y + x = [1, 2, 3] + NLPModels.@lencheck 3 x + y = [1, 2] + @test_throws ArgumentError NLPModels.@lencheck 3 y end From ee5a4f4b4ddd6f558e293b87e68d934dc63c6aa0 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Thu, 6 Nov 2025 10:25:44 +0530 Subject: [PATCH 7/9] Delete test/lencheck.jl --- test/lencheck.jl | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 test/lencheck.jl diff --git a/test/lencheck.jl b/test/lencheck.jl deleted file mode 100644 index e621343..0000000 --- a/test/lencheck.jl +++ /dev/null @@ -1,9 +0,0 @@ -using Test -using NLPModelsJuMP - -@testset "lencheck macro" begin - x = [1, 2, 3] - NLPModels.@lencheck 3 x - y = [1, 2] - @test_throws ArgumentError NLPModels.@lencheck 3 y -end From 1f41db08d749eae6072c3884fb7e22848654bea2 Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Thu, 6 Nov 2025 15:22:05 +0530 Subject: [PATCH 8/9] lencheck --- src/NLPModelsJuMP.jl | 2 ++ src/moi_nlp_model.jl | 12 ------------ src/moi_nls_model.jl | 24 +----------------------- 3 files changed, 3 insertions(+), 35 deletions(-) diff --git a/src/NLPModelsJuMP.jl b/src/NLPModelsJuMP.jl index 5e72653..8795a6f 100644 --- a/src/NLPModelsJuMP.jl +++ b/src/NLPModelsJuMP.jl @@ -1,5 +1,7 @@ module NLPModelsJuMP +import NLPModels: @lencheck + include("utils.jl") include("moi_nlp_model.jl") include("moi_nls_model.jl") diff --git a/src/moi_nlp_model.jl b/src/moi_nlp_model.jl index 95a20b0..c85a7c0 100644 --- a/src/moi_nlp_model.jl +++ b/src/moi_nlp_model.jl @@ -107,20 +107,12 @@ end function NLPModels.cons_lin!(nlp::MathOptNLPModel, x::AbstractVector, c::AbstractVector) increment!(nlp, :neval_cons_lin) - NLPModels.@lencheck nlp.meta.nvar x - if length(c) < nlp.meta.nlin - throw(ArgumentError("length(c) = $(length(c)) but expected at least $(nlp.meta.nlin)")) - end coo_prod!(nlp.lincon.jacobian.rows, nlp.lincon.jacobian.cols, nlp.lincon.jacobian.vals, x, c) return c end function NLPModels.cons_nln!(nlp::MathOptNLPModel, x::AbstractVector, c::AbstractVector) increment!(nlp, :neval_cons_nln) - NLPModels.@lencheck nlp.meta.nvar x - if length(c) < nlp.meta.nnln - throw(ArgumentError("length(c) = $(length(c)) but expected at least $(nlp.meta.nnln)")) - end if nlp.quadcon.nquad > 0 for i = 1:(nlp.quadcon.nquad) qcon = nlp.quadcon.constraints[i] @@ -135,10 +127,6 @@ end function NLPModels.cons!(nlp::MathOptNLPModel, x::AbstractVector, c::AbstractVector) increment!(nlp, :neval_cons) - NLPModels.@lencheck nlp.meta.nvar x - if length(c) < nlp.meta.ncon - throw(ArgumentError("length(c) = $(length(c)) but expected at least $(nlp.meta.ncon)")) - end if nlp.meta.nlin > 0 coo_prod!(nlp.lincon.jacobian.rows, nlp.lincon.jacobian.cols, nlp.lincon.jacobian.vals, x, c) end diff --git a/src/moi_nls_model.jl b/src/moi_nls_model.jl index 5aeeb7d..8eeccf9 100644 --- a/src/moi_nls_model.jl +++ b/src/moi_nls_model.jl @@ -86,8 +86,6 @@ end function NLPModels.residual!(nls::MathOptNLSModel, x::AbstractVector, Fx::AbstractVector) increment!(nls, :neval_residual) - NLPModels.@lencheck nls.meta.nvar x - NLPModels.@lencheck nls.nls_meta.nequ Fx if nls.nls_meta.nlin > 0 coo_prod!( nls.linequ.jacobian.rows, @@ -255,28 +253,12 @@ end function NLPModels.cons_lin!(nls::MathOptNLSModel, x::AbstractVector, c::AbstractVector) increment!(nls, :neval_cons_lin) - NLPModels.@lencheck nls.meta.nvar x - if (nls.nls_meta.nlin > 0) && (length(c) >= nls.nls_meta.nlin) - coo_prod!(nls.linequ.jacobian.rows, nls.linequ.jacobian.cols, nls.linequ.jacobian.vals, x, c) - if !isempty(nls.linequ.constants) - view(c, 1:length(nls.linequ.constants)) .+= nls.linequ.constants - end - return c - elseif length(c) >= nls.meta.nlin - coo_prod!(nls.lincon.jacobian.rows, nls.lincon.jacobian.cols, nls.lincon.jacobian.vals, x, c) - return c - else - throw(ArgumentError("length(c) = $(length(c)) but expected at least $(min(nls.nls_meta.nlin, nls.meta.nlin))")) - end + coo_prod!(nls.lincon.jacobian.rows, nls.lincon.jacobian.cols, nls.lincon.jacobian.vals, x, c) return c end function NLPModels.cons_nln!(nls::MathOptNLSModel, x::AbstractVector, c::AbstractVector) increment!(nls, :neval_cons_nln) - NLPModels.@lencheck nls.meta.nvar x - if length(c) < nls.meta.nnln - throw(ArgumentError("length(c) = $(length(c)) but expected at least $(nls.meta.nnln)")) - end if nls.quadcon.nquad > 0 for i = 1:(nls.quadcon.nquad) qcon = nls.quadcon.constraints[i] @@ -291,10 +273,6 @@ end function NLPModels.cons!(nls::MathOptNLSModel, x::AbstractVector, c::AbstractVector) increment!(nls, :neval_cons) - NLPModels.@lencheck nls.meta.nvar x - if length(c) < nls.meta.ncon - throw(ArgumentError("length(c) = $(length(c)) but expected at least $(nls.meta.ncon)")) - end if nls.meta.nlin > 0 coo_prod!(nls.lincon.jacobian.rows, nls.lincon.jacobian.cols, nls.lincon.jacobian.vals, x, c) end From e19bd3408157af49e217c9ec8b687817aa72147d Mon Sep 17 00:00:00 2001 From: Arnav Kapoor Date: Fri, 7 Nov 2025 13:15:19 +0530 Subject: [PATCH 9/9] adding macro --- src/NLPModelsJuMP.jl | 1 + src/moi_nlp_model.jl | 8 ++++++++ src/moi_nls_model.jl | 17 +++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/src/NLPModelsJuMP.jl b/src/NLPModelsJuMP.jl index 8795a6f..63d660c 100644 --- a/src/NLPModelsJuMP.jl +++ b/src/NLPModelsJuMP.jl @@ -1,6 +1,7 @@ module NLPModelsJuMP import NLPModels: @lencheck +export @lencheck include("utils.jl") include("moi_nlp_model.jl") diff --git a/src/moi_nlp_model.jl b/src/moi_nlp_model.jl index c85a7c0..d91e585 100644 --- a/src/moi_nlp_model.jl +++ b/src/moi_nlp_model.jl @@ -74,6 +74,7 @@ function nlp_model(moimodel::MOI.ModelLike; hessian::Bool = true, name::String = end function NLPModels.obj(nlp::MathOptNLPModel, x::AbstractVector) + @lencheck nlp.meta.nvar x increment!(nlp, :neval_obj) if nlp.obj.type == "LINEAR" res = dot(nlp.obj.gradient, x) + nlp.obj.constant @@ -91,6 +92,7 @@ function NLPModels.obj(nlp::MathOptNLPModel, x::AbstractVector) end function NLPModels.grad!(nlp::MathOptNLPModel, x::AbstractVector, g::AbstractVector) + @lencheck nlp.meta.nvar x increment!(nlp, :neval_grad) if nlp.obj.type == "LINEAR" g .= nlp.obj.gradient @@ -112,6 +114,8 @@ function NLPModels.cons_lin!(nlp::MathOptNLPModel, x::AbstractVector, c::Abstrac end function NLPModels.cons_nln!(nlp::MathOptNLPModel, x::AbstractVector, c::AbstractVector) + @lencheck nlp.meta.nvar x + @lencheck nlp.meta.nnln c increment!(nlp, :neval_cons_nln) if nlp.quadcon.nquad > 0 for i = 1:(nlp.quadcon.nquad) @@ -126,6 +130,8 @@ function NLPModels.cons_nln!(nlp::MathOptNLPModel, x::AbstractVector, c::Abstrac end function NLPModels.cons!(nlp::MathOptNLPModel, x::AbstractVector, c::AbstractVector) + @lencheck nlp.meta.nvar x + @lencheck nlp.meta.ncon c increment!(nlp, :neval_cons) if nlp.meta.nlin > 0 coo_prod!(nlp.lincon.jacobian.rows, nlp.lincon.jacobian.cols, nlp.lincon.jacobian.vals, x, c) @@ -213,6 +219,7 @@ function NLPModels.jac_structure!( end function NLPModels.jac_lin_coord!(nlp::MathOptNLPModel, x::AbstractVector, vals::AbstractVector) + @lencheck nlp.meta.nvar x increment!(nlp, :neval_jac_lin) index_lin = 1:(nlp.lincon.nnzj) view(vals, index_lin) .= nlp.lincon.jacobian.vals @@ -220,6 +227,7 @@ function NLPModels.jac_lin_coord!(nlp::MathOptNLPModel, x::AbstractVector, vals: end function NLPModels.jac_nln_coord!(nlp::MathOptNLPModel, x::AbstractVector, vals::AbstractVector) + @lencheck nlp.meta.nvar x increment!(nlp, :neval_jac_nln) if nlp.quadcon.nquad > 0 index = 0 diff --git a/src/moi_nls_model.jl b/src/moi_nls_model.jl index 8eeccf9..a05fd31 100644 --- a/src/moi_nls_model.jl +++ b/src/moi_nls_model.jl @@ -85,6 +85,8 @@ function MathOptNLSModel(cmodel::JuMP.Model, F; hessian::Bool = true, name::Stri end function NLPModels.residual!(nls::MathOptNLSModel, x::AbstractVector, Fx::AbstractVector) + @lencheck nls.nls_meta.nvar x + @lencheck nls.nls_meta.nequ Fx increment!(nls, :neval_residual) if nls.nls_meta.nlin > 0 coo_prod!( @@ -124,6 +126,7 @@ function NLPModels.jac_coord_residual!( x::AbstractVector, vals::AbstractVector, ) + @lencheck nls.nls_meta.nvar x increment!(nls, :neval_jac_residual) if nls.nls_meta.nlin > 0 view(vals, 1:(nls.linequ.nnzj)) .= nls.linequ.jacobian.vals @@ -144,6 +147,7 @@ function NLPModels.jprod_residual!( v::AbstractVector, Jv::AbstractVector, ) + @lencheck nls.nls_meta.nvar x increment!(nls, :neval_jprod_residual) nls.nls_meta.nlin > 0 && (Jv .= 0.0) if nls.nls_meta.nnln > 0 @@ -165,6 +169,7 @@ function NLPModels.jtprod_residual!( v::AbstractVector, Jtv::AbstractVector, ) + @lencheck nls.nls_meta.nvar x increment!(nls, :neval_jtprod_residual) nls.nls_meta.nlin > 0 && (Jtv .= 0.0) if nls.nls_meta.nnln > 0 @@ -198,6 +203,7 @@ function NLPModels.hess_coord_residual!( v::AbstractVector, vals::AbstractVector, ) + @lencheck nls.nls_meta.nvar x increment!(nls, :neval_hess_residual) if nls.nls_meta.nnln > 0 MOI.eval_hessian_lagrangian(nls.Feval, vals, x, 0.0, view(v, nls.nls_meta.nln)) @@ -212,6 +218,7 @@ function NLPModels.hprod_residual!( v::AbstractVector, Hiv::AbstractVector, ) + @lencheck nls.nls_meta.nvar x increment!(nls, :neval_hprod_residual) if i ∈ nls.nls_meta.lin Hiv .= 0.0 @@ -224,6 +231,7 @@ function NLPModels.hprod_residual!( end function NLPModels.obj(nls::MathOptNLSModel, x::AbstractVector) + @lencheck nls.nls_meta.nvar x increment!(nls, :neval_obj) obj = 0.0 if nls.nls_meta.nnln > 0 @@ -239,6 +247,7 @@ function NLPModels.obj(nls::MathOptNLSModel, x::AbstractVector) end function NLPModels.grad!(nls::MathOptNLSModel, x::AbstractVector, g::AbstractVector) + @lencheck nls.nls_meta.nvar x increment!(nls, :neval_grad) if nls.nls_meta.nnln > 0 MOI.eval_objective_gradient(nls.ceval, g, x) @@ -252,12 +261,16 @@ function NLPModels.grad!(nls::MathOptNLSModel, x::AbstractVector, g::AbstractVec end function NLPModels.cons_lin!(nls::MathOptNLSModel, x::AbstractVector, c::AbstractVector) + @lencheck nls.nls_meta.nvar x + @lencheck nls.meta.ncon c increment!(nls, :neval_cons_lin) coo_prod!(nls.lincon.jacobian.rows, nls.lincon.jacobian.cols, nls.lincon.jacobian.vals, x, c) return c end function NLPModels.cons_nln!(nls::MathOptNLSModel, x::AbstractVector, c::AbstractVector) + @lencheck nls.nls_meta.nvar x + @lencheck nls.meta.nnln c increment!(nls, :neval_cons_nln) if nls.quadcon.nquad > 0 for i = 1:(nls.quadcon.nquad) @@ -272,6 +285,8 @@ function NLPModels.cons_nln!(nls::MathOptNLSModel, x::AbstractVector, c::Abstrac end function NLPModels.cons!(nls::MathOptNLSModel, x::AbstractVector, c::AbstractVector) + @lencheck nls.nls_meta.nvar x + @lencheck nls.meta.ncon c increment!(nls, :neval_cons) if nls.meta.nlin > 0 coo_prod!(nls.lincon.jacobian.rows, nls.lincon.jacobian.cols, nls.lincon.jacobian.vals, x, c) @@ -359,6 +374,7 @@ function NLPModels.jac_structure!( end function NLPModels.jac_lin_coord!(nls::MathOptNLSModel, x::AbstractVector, vals::AbstractVector) + @lencheck nls.nls_meta.nvar x increment!(nls, :neval_jac_lin) index_lin = 1:(nls.lincon.nnzj) view(vals, index_lin) .= nls.lincon.jacobian.vals @@ -366,6 +382,7 @@ function NLPModels.jac_lin_coord!(nls::MathOptNLSModel, x::AbstractVector, vals: end function NLPModels.jac_nln_coord!(nls::MathOptNLSModel, x::AbstractVector, vals::AbstractVector) + @lencheck nls.nls_meta.nvar x increment!(nls, :neval_jac_nln) if nls.quadcon.nquad > 0 index = 0