Skip to content
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

Added increment! and decrement! functions. #314

Merged
Merged
Changes from 2 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
73 changes: 48 additions & 25 deletions src/julia_interface.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,29 @@ export cons_coord, cons_coord!, consjac

using NLPModels, SparseArrays

"""
increment!(nlp, s)

Increment counter `s` of problem `nlp`.
"""
@inline function increment!(nlp::AbstractNLPModel, s::Symbol)
increment!(nlp, Val(s))
end

for fun in fieldnames(Counters)
@eval increment!(nlp::AbstractNLPModel, ::Val{$(Meta.quot(fun))}) = nlp.counters.$fun += 1
end

"""
decrement!(nlp, s)

Decrement counter `s` of problem `nlp`.
"""

function decrement!(nlp::AbstractNLPModel, s::Symbol)
setproperty!(nlp.counters, s, getproperty(nlp.counters, s) - 1)
end

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These shouldn't be necessary since they are already defined in NLPModels.jl. Just remove them.

function NLPModels.objcons(nlp::CUTEstModel, x::AbstractVector)
@lencheck nlp.meta.nvar x
c = Vector{Float64}(undef, nlp.meta.ncon)
Expand Down Expand Up @@ -43,7 +66,7 @@ function NLPModels.objcons!(
f,
)
end
nlp.counters.neval_obj += 1
increment!(nlp, :neval_obj)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this is the correct usage.

@cutest_error

return f[1], c
Expand Down Expand Up @@ -110,8 +133,8 @@ function NLPModels.objgrad!(
get_grad,
)
end
nlp.counters.neval_obj += 1
nlp.counters.neval_grad += 1
nlp.counters.neval_obj +=1
nlp.counters.neval_grad +=1
@cutest_error

return f[1], g
Expand All @@ -134,15 +157,15 @@ function NLPModels.obj(nlp::CUTEstModel, x::AbstractVector)
@lencheck nlp.meta.nvar x
f = objcons!(nlp, x, nlp.work)[1]
if nlp.meta.ncon > 0
nlp.counters.neval_cons -= 1 # does not really count as a constraint eval
nlp.counters.neval_cons -=1 # does not really count as a constraint eval
end
return f
end

function NLPModels.grad!(nlp::CUTEstModel, x::AbstractVector, g::AbstractVector)
@lencheck nlp.meta.nvar x g
objgrad!(nlp, x, g)
nlp.counters.neval_obj -= 1 # does not really count as a objective eval
nlp.counters.neval_obj -=1 # does not really count as a objective eval
return g
end

Expand Down Expand Up @@ -209,8 +232,8 @@ function cons_coord!(
get_j,
)
@cutest_error
nlp.counters.neval_cons += 1
nlp.counters.neval_jac += 1
nlp.counters.neval_cons +=1
nlp.counters.neval_jac +=1
return c, rows, cols, vals
end

Expand Down Expand Up @@ -291,7 +314,7 @@ function NLPModels.cons!(nlp::CUTEstModel, x::AbstractVector, c::AbstractVector)
@lencheck nlp.meta.nvar x
@lencheck nlp.meta.ncon c
objcons!(nlp, x, c)
nlp.counters.neval_obj -= 1 # does not really count as a objective eval
nlp.counters.neval_obj -=1 # does not really count as a objective eval
return c
end

Expand All @@ -301,7 +324,7 @@ function NLPModels.cons_lin!(nlp::CUTEstModel, x::AbstractVector, c::AbstractVec
eval_lin_structure!(nlp)
coo_prod!(nlp.clinrows, nlp.clincols, nlp.clinvals, x, c)
c .+= nlp.blin
nlp.counters.neval_cons_lin += 1
nlp.counters.neval_cons_lin +=1
return c
end

Expand All @@ -322,7 +345,7 @@ function NLPModels.cons_nln!(nlp::CUTEstModel, x::AbstractVector, c::StrideOneVe
cifn(Cint[0], Cint[nlp.meta.nvar], Cint[j], x, view(c, k:k))
k += 1
end
nlp.counters.neval_cons_nln += 1
nlp.counters.neval_cons_nln +=1
return c
end

Expand Down Expand Up @@ -460,14 +483,14 @@ function NLPModels.jac_coord!(nlp::CUTEstModel, x::AbstractVector, vals::Abstrac
@lencheck nlp.meta.nvar x
@lencheck nlp.meta.nnzj vals
cons_coord!(nlp, x, nlp.work, nlp.jrows, nlp.jcols, vals)
nlp.counters.neval_cons -= 1 # does not really count as a constraint eval
nlp.counters.neval_cons -=1 # does not really count as a constraint eval
return vals
end

function NLPModels.jac_lin_coord!(nlp::CUTEstModel, x::AbstractVector, vals::AbstractVector)
@lencheck nlp.meta.nvar x
@lencheck nlp.meta.lin_nnzj vals
nlp.counters.neval_jac_lin += 1
nlp.counters.neval_jac_lin +=1
eval_lin_structure!(nlp)
vals .= nlp.clinvals
return vals
Expand All @@ -488,7 +511,7 @@ function NLPModels.jac_nln_coord!(nlp::CUTEstModel, x::AbstractVector, vals::Abs
end
end
vals[i:end] .= 0.0
nlp.counters.neval_jac_nln += 1
nlp.counters.neval_jac_nln +=1
return vals
end

Expand Down Expand Up @@ -532,7 +555,7 @@ function NLPModels.jprod!(
ncon,
)
@cutest_error
nlp.counters.neval_jprod += 1
nlp.counters.neval_jprod +=1
return jv
end

Expand Down Expand Up @@ -570,8 +593,8 @@ function NLPModels.jprod_nln!(
@lencheck nlp.meta.nnln jv
jvc = nlp.work
jprod!(nlp, x, v, jvc)
nlp.counters.neval_jprod -= 1
nlp.counters.neval_jprod_nln += 1
nlp.counters.neval_jprod -=1
nlp.counters.neval_jprod_nln +=1
jv .= jvc[nlp.meta.nln]
end

Expand All @@ -583,7 +606,7 @@ function NLPModels.jprod_lin!(
)
@lencheck nlp.meta.nvar x v
@lencheck nlp.meta.nlin jv
nlp.counters.neval_jprod_lin += 1
nlp.counters.neval_jprod_lin +=1
eval_lin_structure!(nlp)
jprod_lin!(nlp, nlp.clinrows, nlp.clincols, nlp.clinvals, v, jv)
return jv
Expand Down Expand Up @@ -629,7 +652,7 @@ function NLPModels.jtprod!(
nvar,
)
@cutest_error
nlp.counters.neval_jtprod += 1
nlp.counters.neval_jtprod +=1
return jtv
end

Expand Down Expand Up @@ -669,8 +692,8 @@ function NLPModels.jtprod_nln!(
_v[nlp.meta.lin] .= 0.0
_v[nlp.meta.nln] = v
jtprod!(nlp, x, _v, jtv)
nlp.counters.neval_jtprod -= 1
nlp.counters.neval_jtprod_nln += 1
nlp.counters.neval_jtprod -=1
nlp.counters.neval_jtprod_nln +=1
return jtv
end

Expand All @@ -682,7 +705,7 @@ function NLPModels.jtprod_lin!(
)
@lencheck nlp.meta.nvar x jtv
@lencheck nlp.meta.nlin v
nlp.counters.neval_jtprod_lin += 1
nlp.counters.neval_jtprod_lin +=1
eval_lin_structure!(nlp)
jtprod_lin!(nlp, nlp.clinrows, nlp.clincols, nlp.clinvals, v, jtv)
return jtv
Expand Down Expand Up @@ -830,7 +853,7 @@ function NLPModels.hess_coord!(
nlp.hrows,
)
@cutest_error
nlp.counters.neval_hess += 1
nlp.counters.neval_hess +=1
return vals
end

Expand Down Expand Up @@ -891,7 +914,7 @@ function NLPModels.hess_coord!(
@cutest_error

obj_weight != 1.0 && (vals[:] *= obj_weight) # also ok if obj_weight == 0 and ncon == 0
nlp.counters.neval_hess += 1
nlp.counters.neval_hess +=1
return vals
end

Expand Down Expand Up @@ -966,7 +989,7 @@ function NLPModels.hprod!(
hv,
)
@cutest_error
nlp.counters.neval_hprod += 1
nlp.counters.neval_hprod +=1
return hv
end

Expand Down Expand Up @@ -1012,7 +1035,7 @@ function NLPModels.hprod!(
@cutest_error

obj_weight != 1.0 && (hv[:] *= obj_weight) # also ok if obj_weight == 0 and ncon == 0
nlp.counters.neval_hprod += 1
nlp.counters.neval_hprod +=1
return hv
end

Expand Down