Skip to content

Add error for evaluation of constraints of an unconstrained model #465

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions src/nlp/api.jl
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ Evaluate ``c(x)``, the constraints at `x`.
"""
function cons(nlp::AbstractNLPModel{T, S}, x::AbstractVector) where {T, S}
@lencheck nlp.meta.nvar x
check_constrained(nlp)
c = S(undef, nlp.meta.ncon)
return cons!(nlp, x, c)
end
Expand All @@ -57,6 +58,7 @@ Evaluate ``c(x)``, the constraints at `x` in place.
function cons!(nlp::AbstractNLPModel, x::AbstractVector, cx::AbstractVector)
@lencheck nlp.meta.nvar x
@lencheck nlp.meta.ncon cx
check_constrained(nlp)
increment!(nlp, :neval_cons)
nlp.meta.nlin > 0 && cons_lin!(nlp, x, view(cx, nlp.meta.lin))
nlp.meta.nnln > 0 && cons_nln!(nlp, x, view(cx, nlp.meta.nln))
Expand All @@ -70,6 +72,7 @@ Evaluate the linear constraints at `x`.
"""
function cons_lin(nlp::AbstractNLPModel{T, S}, x::AbstractVector) where {T, S}
@lencheck nlp.meta.nvar x
check_linearly_constrained(nlp)
c = S(undef, nlp.meta.nlin)
return cons_lin!(nlp, x, c)
end
Expand All @@ -88,6 +91,7 @@ Evaluate the nonlinear constraints at `x`.
"""
function cons_nln(nlp::AbstractNLPModel{T, S}, x::AbstractVector) where {T, S}
@lencheck nlp.meta.nvar x
check_nonlinearly_constrained(nlp)
c = S(undef, nlp.meta.nnln)
return cons_nln!(nlp, x, c)
end
Expand Down Expand Up @@ -118,6 +122,7 @@ Evaluate ``f(x)`` and ``c(x)`` at `x`.
"""
function objcons(nlp::AbstractNLPModel{T, S}, x::AbstractVector) where {T, S}
@lencheck nlp.meta.nvar x
check_constrained(nlp)
f = obj(nlp, x)
c = cons(nlp, x)
return f, c
Expand All @@ -131,6 +136,7 @@ Evaluate ``f(x)`` and ``c(x)`` at `x`. `c` is overwritten with the value of ``c(
function objcons!(nlp::AbstractNLPModel, x::AbstractVector, c::AbstractVector)
@lencheck nlp.meta.nvar x
@lencheck nlp.meta.ncon c
check_constrained(nlp)
f = obj(nlp, x)
cons!(nlp, x, c)
return f, c
Expand Down Expand Up @@ -166,6 +172,7 @@ end
Return the structure of the constraints Jacobian in sparse coordinate format.
"""
function jac_structure(nlp::AbstractNLPModel)
check_constrained(nlp)
rows = Vector{Int}(undef, nlp.meta.nnzj)
cols = Vector{Int}(undef, nlp.meta.nnzj)
jac_structure!(nlp, rows, cols)
Expand All @@ -181,6 +188,7 @@ function jac_structure!(
rows::AbstractVector{T},
cols::AbstractVector{T},
) where {T}
check_constrained(nlp)
@lencheck nlp.meta.nnzj rows cols
lin_ind = 1:(nlp.meta.lin_nnzj)
nlp.meta.nlin > 0 && jac_lin_structure!(nlp, view(rows, lin_ind), view(cols, lin_ind))
Expand All @@ -203,6 +211,7 @@ end
Return the structure of the linear constraints Jacobian in sparse coordinate format.
"""
function jac_lin_structure(nlp::AbstractNLPModel)
check_linearly_constrained(nlp)
rows = Vector{Int}(undef, nlp.meta.lin_nnzj)
cols = Vector{Int}(undef, nlp.meta.lin_nnzj)
jac_lin_structure!(nlp, rows, cols)
Expand All @@ -221,6 +230,7 @@ function jac_lin_structure! end
Return the structure of the nonlinear constraints Jacobian in sparse coordinate format.
"""
function jac_nln_structure(nlp::AbstractNLPModel)
check_nonlinearly_constrained(nlp)
rows = Vector{Int}(undef, nlp.meta.nln_nnzj)
cols = Vector{Int}(undef, nlp.meta.nln_nnzj)
jac_nln_structure!(nlp, rows, cols)
Expand All @@ -242,6 +252,7 @@ rewriting `vals`.
function jac_coord!(nlp::AbstractNLPModel, x::AbstractVector, vals::AbstractVector)
@lencheck nlp.meta.nvar x
@lencheck nlp.meta.nnzj vals
check_constrained(nlp)
increment!(nlp, :neval_jac)
lin_ind = 1:(nlp.meta.lin_nnzj)
nlp.meta.nlin > 0 && jac_lin_coord!(nlp, x, view(vals, lin_ind))
Expand All @@ -257,6 +268,7 @@ Evaluate ``J(x)``, the constraints Jacobian at `x` in sparse coordinate format.
"""
function jac_coord(nlp::AbstractNLPModel{T, S}, x::AbstractVector) where {T, S}
@lencheck nlp.meta.nvar x
check_constrained(nlp)
vals = S(undef, nlp.meta.nnzj)
return jac_coord!(nlp, x, vals)
end
Expand All @@ -268,6 +280,7 @@ Evaluate ``J(x)``, the constraints Jacobian at `x` as a sparse matrix.
"""
function jac(nlp::AbstractNLPModel, x::AbstractVector)
@lencheck nlp.meta.nvar x
check_constrained(nlp)
rows, cols = jac_structure(nlp)
vals = jac_coord(nlp, x)
sparse(rows, cols, vals, nlp.meta.ncon, nlp.meta.nvar)
Expand All @@ -288,6 +301,7 @@ Evaluate ``J(x)``, the linear constraints Jacobian at `x` in sparse coordinate f
"""
function jac_lin_coord(nlp::AbstractNLPModel{T, S}, x::AbstractVector) where {T, S}
@lencheck nlp.meta.nvar x
check_linearly_constrained(nlp)
vals = S(undef, nlp.meta.lin_nnzj)
return jac_lin_coord!(nlp, x, vals)
end
Expand All @@ -299,6 +313,7 @@ Evaluate ``J(x)``, the linear constraints Jacobian at `x` as a sparse matrix.
"""
function jac_lin(nlp::AbstractNLPModel, x::AbstractVector)
@lencheck nlp.meta.nvar x
check_linearly_constrained(nlp)
rows, cols = jac_lin_structure(nlp)
vals = jac_lin_coord(nlp, x)
sparse(rows, cols, vals, nlp.meta.nlin, nlp.meta.nvar)
Expand All @@ -319,6 +334,7 @@ Evaluate ``J(x)``, the nonlinear constraints Jacobian at `x` in sparse coordinat
"""
function jac_nln_coord(nlp::AbstractNLPModel{T, S}, x::AbstractVector) where {T, S}
@lencheck nlp.meta.nvar x
check_nonlinearly_constrained(nlp)
vals = S(undef, nlp.meta.nln_nnzj)
return jac_nln_coord!(nlp, x, vals)
end
Expand All @@ -330,6 +346,7 @@ Evaluate ``J(x)``, the nonlinear constraints Jacobian at `x` as a sparse matrix.
"""
function jac_nln(nlp::AbstractNLPModel, x::AbstractVector)
@lencheck nlp.meta.nvar x
check_nonlinearly_constrained(nlp)
rows, cols = jac_nln_structure(nlp)
vals = jac_nln_coord(nlp, x)
sparse(rows, cols, vals, nlp.meta.nnln, nlp.meta.nvar)
Expand All @@ -342,6 +359,7 @@ Evaluate ``J(x)v``, the Jacobian-vector product at `x`.
"""
function jprod(nlp::AbstractNLPModel{T, S}, x::AbstractVector, v::AbstractVector) where {T, S}
@lencheck nlp.meta.nvar x v
check_constrained(nlp)
Jv = S(undef, nlp.meta.ncon)
return jprod!(nlp, x, v, Jv)
end
Expand All @@ -354,6 +372,7 @@ Evaluate ``J(x)v``, the Jacobian-vector product at `x` in place.
function jprod!(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector, Jv::AbstractVector)
@lencheck nlp.meta.nvar x v
@lencheck nlp.meta.ncon Jv
check_constrained(nlp)
increment!(nlp, :neval_jprod)
nlp.meta.nlin > 0 && jprod_lin!(nlp, x, v, view(Jv, nlp.meta.lin))
nlp.meta.nnln > 0 && jprod_nln!(nlp, x, v, view(Jv, nlp.meta.nln))
Expand All @@ -377,6 +396,7 @@ function jprod!(
@lencheck nlp.meta.nnzj rows cols vals
@lencheck nlp.meta.nvar v
@lencheck nlp.meta.ncon Jv
check_constrained(nlp)
increment!(nlp, :neval_jprod)
coo_prod!(rows, cols, vals, v, Jv)
end
Expand All @@ -388,6 +408,7 @@ 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
check_linearly_constrained(nlp)
Jv = S(undef, nlp.meta.nlin)
return jprod_lin!(nlp, x, v, Jv)
end
Expand Down Expand Up @@ -416,6 +437,7 @@ function jprod_lin!(
@lencheck nlp.meta.lin_nnzj rows cols vals
@lencheck nlp.meta.nvar v
@lencheck nlp.meta.nlin Jv
check_linearly_constrained(nlp)
increment!(nlp, :neval_jprod_lin)
coo_prod!(rows, cols, vals, v, Jv)
end
Expand All @@ -427,6 +449,7 @@ Evaluate ``J(x)v``, the nonlinear Jacobian-vector product at `x`.
"""
function jprod_nln(nlp::AbstractNLPModel{T, S}, x::AbstractVector, v::AbstractVector) where {T, S}
@lencheck nlp.meta.nvar x v
check_nonlinearly_constrained(nlp)
Jv = S(undef, nlp.meta.nnln)
return jprod_nln!(nlp, x, v, Jv)
end
Expand Down Expand Up @@ -455,6 +478,7 @@ function jprod_nln!(
@lencheck nlp.meta.nln_nnzj rows cols vals
@lencheck nlp.meta.nvar v
@lencheck nlp.meta.nnln Jv
check_nonlinearly_constrained(nlp)
increment!(nlp, :neval_jprod_nln)
coo_prod!(rows, cols, vals, v, Jv)
end
Expand All @@ -467,6 +491,7 @@ Evaluate ``J(x)^Tv``, the transposed-Jacobian-vector product at `x`.
function jtprod(nlp::AbstractNLPModel{T, S}, x::AbstractVector, v::AbstractVector) where {T, S}
@lencheck nlp.meta.nvar x
@lencheck nlp.meta.ncon v
check_constrained(nlp)
Jtv = S(undef, nlp.meta.nvar)
return jtprod!(nlp, x, v, Jtv)
end
Expand All @@ -480,6 +505,7 @@ If the problem has linear and nonlinear constraints, this function allocates.
function jtprod!(nlp::AbstractNLPModel, x::AbstractVector, v::AbstractVector, Jtv::AbstractVector)
@lencheck nlp.meta.nvar x Jtv
@lencheck nlp.meta.ncon v
check_constrained(nlp)
increment!(nlp, :neval_jtprod)
if nlp.meta.nnln == 0
jtprod_lin!(nlp, x, v, Jtv)
Expand Down Expand Up @@ -516,6 +542,7 @@ function jtprod!(
@lencheck nlp.meta.nnzj rows cols vals
@lencheck nlp.meta.ncon v
@lencheck nlp.meta.nvar Jtv
check_constrained(nlp)
increment!(nlp, :neval_jtprod)
coo_prod!(cols, rows, vals, v, Jtv)
end
Expand All @@ -528,6 +555,7 @@ 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
@lencheck nlp.meta.nlin v
check_linearly_constrained(nlp)
Jtv = S(undef, nlp.meta.nvar)
return jtprod_lin!(nlp, x, v, Jtv)
end
Expand Down Expand Up @@ -556,6 +584,7 @@ function jtprod_lin!(
@lencheck nlp.meta.lin_nnzj rows cols vals
@lencheck nlp.meta.nlin v
@lencheck nlp.meta.nvar Jtv
check_linearly_constrained(nlp)
increment!(nlp, :neval_jtprod_lin)
coo_prod!(cols, rows, vals, v, Jtv)
end
Expand All @@ -568,6 +597,7 @@ Evaluate ``J(x)^Tv``, the nonlinear transposed-Jacobian-vector product at `x`.
function jtprod_nln(nlp::AbstractNLPModel{T, S}, x::AbstractVector, v::AbstractVector) where {T, S}
@lencheck nlp.meta.nvar x
@lencheck nlp.meta.nnln v
check_nonlinearly_constrained(nlp)
Jtv = S(undef, nlp.meta.nvar)
return jtprod_nln!(nlp, x, v, Jtv)
end
Expand Down Expand Up @@ -596,6 +626,7 @@ function jtprod_nln!(
@lencheck nlp.meta.nln_nnzj rows cols vals
@lencheck nlp.meta.nnln v
@lencheck nlp.meta.nvar Jtv
check_nonlinearly_constrained(nlp)
increment!(nlp, :neval_jtprod_nln)
coo_prod!(cols, rows, vals, v, Jtv)
end
Expand All @@ -609,6 +640,7 @@ The resulting object may be used as if it were a matrix, e.g., `J * v` or
"""
function jac_op(nlp::AbstractNLPModel{T, S}, x::AbstractVector) where {T, S}
@lencheck nlp.meta.nvar x
check_constrained(nlp)
Jv = S(undef, nlp.meta.ncon)
Jtv = S(undef, nlp.meta.nvar)
return jac_op!(nlp, x, Jv, Jtv)
Expand All @@ -630,6 +662,7 @@ function jac_op!(
) where {T, S}
@lencheck nlp.meta.nvar x Jtv
@lencheck nlp.meta.ncon Jv
check_constrained(nlp)
prod! = @closure (res, v, α, β) -> begin # res = α * J * v + β * res
jprod!(nlp, x, v, Jv)
if β == 0
Expand Down Expand Up @@ -669,6 +702,7 @@ function jac_op!(
@lencheck nlp.meta.nnzj rows cols vals
@lencheck nlp.meta.ncon Jv
@lencheck nlp.meta.nvar Jtv
check_constrained(nlp)
prod! = @closure (res, v, α, β) -> begin # res = α * J * v + β * res
jprod!(nlp, rows, cols, vals, v, Jv)
if β == 0
Expand Down Expand Up @@ -699,6 +733,7 @@ The resulting object may be used as if it were a matrix, e.g., `J * v` or
"""
function jac_lin_op(nlp::AbstractNLPModel{T, S}, x::AbstractVector) where {T, S}
@lencheck nlp.meta.nvar x
check_linearly_constrained(nlp)
Jv = S(undef, nlp.meta.nlin)
Jtv = S(undef, nlp.meta.nvar)
return jac_lin_op!(nlp, x, Jv, Jtv)
Expand All @@ -720,6 +755,7 @@ function jac_lin_op!(
) where {T, S}
@lencheck nlp.meta.nvar x Jtv
@lencheck nlp.meta.nlin Jv
check_linearly_constrained(nlp)
prod! = @closure (res, v, α, β) -> begin # res = α * J * v + β * res
jprod_lin!(nlp, x, v, Jv)
if β == 0
Expand Down Expand Up @@ -759,6 +795,7 @@ function jac_lin_op!(
@lencheck nlp.meta.lin_nnzj rows cols vals
@lencheck nlp.meta.nlin Jv
@lencheck nlp.meta.nvar Jtv
check_linearly_constrained(nlp)
prod! = @closure (res, v, α, β) -> begin # res = α * J * v + β * res
jprod_lin!(nlp, rows, cols, vals, v, Jv)
if β == 0
Expand Down Expand Up @@ -789,6 +826,7 @@ The resulting object may be used as if it were a matrix, e.g., `J * v` or
"""
function jac_nln_op(nlp::AbstractNLPModel{T, S}, x::AbstractVector) where {T, S}
@lencheck nlp.meta.nvar x
check_nonlinearly_constrained(nlp)
Jv = S(undef, nlp.meta.nnln)
Jtv = S(undef, nlp.meta.nvar)
return jac_nln_op!(nlp, x, Jv, Jtv)
Expand All @@ -810,6 +848,7 @@ function jac_nln_op!(
) where {T, S}
@lencheck nlp.meta.nvar x Jtv
@lencheck nlp.meta.nnln Jv
check_nonlinearly_constrained(nlp)
prod! = @closure (res, v, α, β) -> begin # res = α * J * v + β * res
jprod_nln!(nlp, x, v, Jv)
if β == 0
Expand Down Expand Up @@ -849,6 +888,7 @@ function jac_nln_op!(
@lencheck nlp.meta.nln_nnzj rows cols vals
@lencheck nlp.meta.nnln Jv
@lencheck nlp.meta.nvar Jtv
check_nonlinearly_constrained(nlp)
prod! = @closure (res, v, α, β) -> begin # res = α * J * v + β * res
jprod_nln!(nlp, rows, cols, vals, v, Jv)
if β == 0
Expand Down Expand Up @@ -879,6 +919,7 @@ Only the lower triangle is returned.
function jth_hess_coord(nlp::AbstractNLPModel{T, S}, x::AbstractVector, j::Integer) where {T, S}
@lencheck nlp.meta.nvar x
@rangecheck 1 nlp.meta.ncon j
check_constrained(nlp)
vals = S(undef, nlp.meta.nnzh)
return jth_hess_coord!(nlp, x, j, vals)
end
Expand All @@ -901,6 +942,7 @@ A `Symmetric` object wrapping the lower triangle is returned.
function jth_hess(nlp::AbstractNLPModel, x::AbstractVector, j::Integer)
@lencheck nlp.meta.nvar x
@rangecheck 1 nlp.meta.ncon j
check_constrained(nlp)
rows, cols = hess_structure(nlp)
vals = jth_hess_coord(nlp, x, j)
return Symmetric(sparse(rows, cols, vals, nlp.meta.nvar, nlp.meta.nvar), :L)
Expand All @@ -919,6 +961,7 @@ function jth_hprod(
) where {T, S}
@lencheck nlp.meta.nvar x v
@rangecheck 1 nlp.meta.ncon j
check_constrained(nlp)
Hv = S(undef, nlp.meta.nvar)
return jth_hprod!(nlp, x, v, j, Hv)
end
Expand All @@ -943,6 +986,7 @@ function ghjvprod(
v::AbstractVector,
) where {T, S}
@lencheck nlp.meta.nvar x g v
check_constrained(nlp)
gHv = S(undef, nlp.meta.ncon)
return ghjvprod!(nlp, x, g, v, gHv)
end
Expand Down Expand Up @@ -1038,6 +1082,7 @@ function hess_coord(
) where {T, S}
@lencheck nlp.meta.nvar x
@lencheck nlp.meta.ncon y
check_constrained(nlp)
vals = S(undef, nlp.meta.nnzh)
return hess_coord!(nlp, x, y, vals; obj_weight = obj_weight)
end
Expand Down Expand Up @@ -1079,6 +1124,7 @@ function hess(
) where {T, S}
@lencheck nlp.meta.nvar x
@lencheck nlp.meta.ncon y
check_constrained(nlp)
rows, cols = hess_structure(nlp)
vals = hess_coord(nlp, x, y, obj_weight = obj_weight)
Symmetric(sparse(rows, cols, vals, nlp.meta.nvar, nlp.meta.nvar), :L)
Expand Down Expand Up @@ -1118,6 +1164,7 @@ function hprod(
) where {T, S}
@lencheck nlp.meta.nvar x v
@lencheck nlp.meta.ncon y
check_constrained(nlp)
Hv = S(undef, nlp.meta.nvar)
return hprod!(nlp, x, y, v, Hv; obj_weight = obj_weight)
end
Expand Down Expand Up @@ -1204,6 +1251,7 @@ function hess_op(
) where {T, S}
@lencheck nlp.meta.nvar x
@lencheck nlp.meta.ncon y
check_constrained(nlp)
Hv = S(undef, nlp.meta.nvar)
return hess_op!(nlp, x, y, Hv, obj_weight = obj_weight)
end
Expand Down Expand Up @@ -1287,6 +1335,7 @@ function hess_op!(
) where {T, S}
@lencheck nlp.meta.nvar x Hv
@lencheck nlp.meta.ncon y
check_constrained(nlp)
prod! = @closure (res, v, α, β) -> begin
hprod!(nlp, x, y, v, Hv; obj_weight = obj_weight)
if β == 0
Expand Down
Loading
Loading