diff --git a/src/NLPModelsJuMP.jl b/src/NLPModelsJuMP.jl index 5e72653..63d660c 100644 --- a/src/NLPModelsJuMP.jl +++ b/src/NLPModelsJuMP.jl @@ -1,5 +1,8 @@ module NLPModelsJuMP +import NLPModels: @lencheck +export @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 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