From b8bd591e1bc03a43f47ad9362906c746c7464cd0 Mon Sep 17 00:00:00 2001 From: fpacaud Date: Mon, 26 Sep 2022 09:58:07 -0500 Subject: [PATCH] improve error messages when invalid number is detected --- src/IPM/callbacks.jl | 16 ++++++++-------- src/IPM/solver.jl | 14 +++++++++++++- src/IPM/utils.jl | 4 +++- src/enums.jl | 16 ++++++++++++++-- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/IPM/callbacks.jl b/src/IPM/callbacks.jl index 359d85c7..16f22319 100644 --- a/src/IPM/callbacks.jl +++ b/src/IPM/callbacks.jl @@ -5,7 +5,7 @@ function eval_f_wrapper(solver::MadNLPSolver, x::Vector{T}) where T x_nlpmodel = _madnlp_unsafe_wrap(x, get_nvar(nlp)) cnt.eval_function_time += @elapsed obj_val = (get_minimize(nlp) ? 1. : -1.) * obj(nlp,x_nlpmodel) cnt.obj_cnt+=1 - cnt.obj_cnt==1 && (is_valid(obj_val) || throw(InvalidNumberException())) + cnt.obj_cnt==1 && (is_valid(obj_val) || throw(InvalidNumberException(:obj))) return obj_val*solver.obj_scale[] end @@ -22,7 +22,7 @@ function eval_grad_f_wrapper!(solver::MadNLPSolver, f::Vector{T},x::Vector{T}) w ) f.*=solver.obj_scale[] * (get_minimize(nlp) ? 1. : -1.) cnt.obj_grad_cnt+=1 - cnt.obj_grad_cnt==1 && (is_valid(f) || throw(InvalidNumberException())) + cnt.obj_grad_cnt==1 && (is_valid(f) || throw(InvalidNumberException(:grad))) return f end @@ -41,7 +41,7 @@ function eval_cons_wrapper!(solver::MadNLPSolver, c::Vector{T},x::Vector{T}) whe c.-=solver.rhs c.*=solver.con_scale cnt.con_cnt+=1 - cnt.con_cnt==2 && (is_valid(c) || throw(InvalidNumberException())) + cnt.con_cnt==2 && (is_valid(c) || throw(InvalidNumberException(:cons))) return c end @@ -55,12 +55,12 @@ function eval_jac_wrapper!(solver::MadNLPSolver, kkt::AbstractKKTSystem, x::Vect jac_nlpmodel = _madnlp_unsafe_wrap(jac, get_nnzj(nlp.meta)) cnt.eval_function_time += @elapsed jac_coord!( nlp, - x_nlpmodel, + x_nlpmodel, jac_nlpmodel ) compress_jacobian!(kkt) cnt.con_jac_cnt+=1 - cnt.con_jac_cnt==1 && (is_valid(jac) || throw(InvalidNumberException())) + cnt.con_jac_cnt==1 && (is_valid(jac) || throw(InvalidNumberException(:jac))) @trace(solver.logger,"Constraint jacobian evaluation started.") return jac end @@ -82,7 +82,7 @@ function eval_lag_hess_wrapper!(solver::MadNLPSolver, kkt::AbstractKKTSystem, x: ) compress_hessian!(kkt) cnt.lag_hess_cnt+=1 - cnt.lag_hess_cnt==1 && (is_valid(hess) || throw(InvalidNumberException())) + cnt.lag_hess_cnt==1 && (is_valid(hess) || throw(InvalidNumberException(:hess))) return hess end @@ -100,7 +100,7 @@ function eval_jac_wrapper!(solver::MadNLPSolver, kkt::AbstractDenseKKTSystem, x: ) compress_jacobian!(kkt) cnt.con_jac_cnt+=1 - cnt.con_jac_cnt==1 && (is_valid(jac) || throw(InvalidNumberException())) + cnt.con_jac_cnt==1 && (is_valid(jac) || throw(InvalidNumberException(:jac))) @trace(solver.logger,"Constraint jacobian evaluation started.") return jac end @@ -121,6 +121,6 @@ function eval_lag_hess_wrapper!(solver::MadNLPSolver, kkt::AbstractDenseKKTSyste ) compress_hessian!(kkt) cnt.lag_hess_cnt+=1 - cnt.lag_hess_cnt==1 && (is_valid(hess) || throw(InvalidNumberException())) + cnt.lag_hess_cnt==1 && (is_valid(hess) || throw(InvalidNumberException(:hess))) return hess end diff --git a/src/IPM/solver.jl b/src/IPM/solver.jl index a231b4d1..6dfa9aba 100644 --- a/src/IPM/solver.jl +++ b/src/IPM/solver.jl @@ -150,7 +150,19 @@ function solve!( end catch e if e isa InvalidNumberException - solver.status=INVALID_NUMBER_DETECTED + if e.callback == :obj + solver.status=INVALID_NUMBER_OBJECTIVE + elseif e.callback == :grad + solver.status=INVALID_NUMBER_GRADIENT + elseif e.callback == :cons + solver.status=INVALID_NUMBER_CONSTRAINTS + elseif e.callback == :jac + solver.status=INVALID_NUMBER_JACOBIAN + elseif e.callback == :hess + solver.status=INVALID_NUMBER_HESSIAN_LAGRANGIAN + else + solver.status=INVALID_NUMBER_DETECTED + end elseif e isa NotEnoughDegreesOfFreedomException solver.status=NOT_ENOUGH_DEGREES_OF_FREEDOM elseif e isa LinearSolverException diff --git a/src/IPM/utils.jl b/src/IPM/utils.jl index b1ca2b98..6002bd16 100644 --- a/src/IPM/utils.jl +++ b/src/IPM/utils.jl @@ -13,7 +13,9 @@ struct MadNLPExecutionStats{T} <: AbstractExecutionStats elapsed_time::Real end -struct InvalidNumberException <: Exception end +struct InvalidNumberException <: Exception + callback::Symbol +end struct NotEnoughDegreesOfFreedomException <: Exception end MadNLPExecutionStats(solver::MadNLPSolver) =MadNLPExecutionStats( diff --git a/src/enums.jl b/src/enums.jl index 3f21bc2d..1f69c00b 100644 --- a/src/enums.jl +++ b/src/enums.jl @@ -43,7 +43,13 @@ ERROR_IN_STEP_COMPUTATION = -3, NOT_ENOUGH_DEGREES_OF_FREEDOM = -4, USER_REQUESTED_STOP = -5, - INTERNAL_ERROR = -6) + INTERNAL_ERROR = -6, + INVALID_NUMBER_OBJECTIVE = -7, + INVALID_NUMBER_GRADIENT = -8, + INVALID_NUMBER_CONSTRAINTS = -9, + INVALID_NUMBER_JACOBIAN = -10, + INVALID_NUMBER_HESSIAN_LAGRANGIAN = -11, +) const STATUS_OUTPUT_DICT = Dict( SOLVE_SUCCEEDED => "Optimal Solution Found.", @@ -58,4 +64,10 @@ const STATUS_OUTPUT_DICT = Dict( ERROR_IN_STEP_COMPUTATION => "Error in step computation.", NOT_ENOUGH_DEGREES_OF_FREEDOM => "Problem has too few degrees of freedom.", USER_REQUESTED_STOP => "Stopping optimization at current point as requested by user.", - INTERNAL_ERROR => "Internal Error.") + INTERNAL_ERROR => "Internal Error.", + INVALID_NUMBER_OBJECTIVE => "Invalid number in NLP objective function detected.", + INVALID_NUMBER_GRADIENT => "Invalid number in NLP objective gradient detected.", + INVALID_NUMBER_CONSTRAINTS => "Invalid number in NLP constraint function detected.", + INVALID_NUMBER_JACOBIAN => "Invalid number in NLP constraint Jacobian detected.", + INVALID_NUMBER_HESSIAN_LAGRANGIAN => "Invalid number in NLP Hessian Lagrangian detected.", +)