diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ba39cc53 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +Manifest.toml diff --git a/src/LMTR_alg.jl b/src/LMTR_alg.jl index d6116533..af6279ec 100644 --- a/src/LMTR_alg.jl +++ b/src/LMTR_alg.jl @@ -188,7 +188,7 @@ function SolverCore.solve!( solver::LMTRSolver{T, G, V}, reg_nls::AbstractRegularizedNLPModel{T, V}, stats::GenericExecutionStats{T, V}; - callback = (args...) -> nothing, + callback = (args...) -> false, x::V = reg_nls.model.meta.x0, atol::T = √eps(T), sub_atol::T = atol, @@ -310,12 +310,15 @@ function SolverCore.solve!( atol += rtol * sqrt_ξ1_νInv # make stopping test absolute and relative sub_atol += rtol * sqrt_ξ1_νInv + user_requested_exit = callback(nls, solver, stats) :: Bool + set_status!( stats, get_status( reg_nls, elapsed_time = stats.elapsed_time, iter = stats.iter, + user_requested_exit = user_requested_exit, optimal = solved, improper = improper, max_eval = max_eval, @@ -324,8 +327,6 @@ function SolverCore.solve!( ), ) - callback(nls, solver, stats) - done = stats.status != :unknown while !done @@ -459,12 +460,15 @@ function SolverCore.solve!( (ξ1 < 0 && sqrt_ξ1_νInv > neg_tol) && error("LM: prox-gradient step should produce a decrease but ξ1 = $(ξ1)") + user_requested_exit = callback(nls, solver, stats) :: Bool + set_status!( stats, get_status( reg_nls, elapsed_time = stats.elapsed_time, iter = stats.iter, + user_requested_exit = user_requested_exit, optimal = solved, improper = improper, max_eval = max_eval, @@ -473,8 +477,6 @@ function SolverCore.solve!( ), ) - callback(nls, solver, stats) - done = stats.status != :unknown end diff --git a/src/LM_alg.jl b/src/LM_alg.jl index 1f4658f6..cb2c220c 100644 --- a/src/LM_alg.jl +++ b/src/LM_alg.jl @@ -187,7 +187,7 @@ function SolverCore.solve!( solver::LMSolver{T, G, V}, reg_nls::AbstractRegularizedNLPModel{T, V}, stats::GenericExecutionStats{T, V}; - callback = (args...) -> nothing, + callback = (args...) -> false, x::V = reg_nls.model.meta.x0, nonlinear::Bool = true, atol::T = √eps(T), @@ -313,12 +313,15 @@ function SolverCore.solve!( error("LM: prox-gradient step should produce a decrease but ξ1 = $(ξ1)") atol += rtol * sqrt_ξ1_νInv # make stopping test absolute and relative + user_requested_exit = callback(nls, solver, stats) :: Bool + set_status!( stats, get_status( reg_nls, elapsed_time = stats.elapsed_time, iter = stats.iter, + user_requested_exit = user_requested_exit, optimal = solved, improper = improper, max_eval = max_eval, @@ -327,8 +330,6 @@ function SolverCore.solve!( ), ) - callback(nls, solver, stats) - done = stats.status != :unknown while !done @@ -449,12 +450,15 @@ function SolverCore.solve!( (ξ1 < 0 && sqrt_ξ1_νInv > neg_tol) && error("LM: prox-gradient step should produce a decrease but ξ1 = $(ξ1)") + user_requested_exit = callback(nls, solver, stats) :: Bool + set_status!( stats, get_status( reg_nls, elapsed_time = stats.elapsed_time, iter = stats.iter, + user_requested_exit = user_requested_exit, optimal = solved, improper = improper, max_eval = max_eval, @@ -462,9 +466,6 @@ function SolverCore.solve!( max_iter = max_iter, ), ) - - callback(nls, solver, stats) - done = stats.status != :unknown end diff --git a/src/R2DH.jl b/src/R2DH.jl index 5c2f8f1e..ecd2fe7d 100644 --- a/src/R2DH.jl +++ b/src/R2DH.jl @@ -213,7 +213,7 @@ function SolverCore.solve!( solver::R2DHSolver{T}, reg_nlp::AbstractRegularizedNLPModel{T, V}, stats::GenericExecutionStats{T, V}; - callback = (args...) -> nothing, + callback = (args...) -> false, x::V = reg_nlp.model.meta.x0, atol::T = √eps(T), rtol::T = √eps(T), @@ -338,12 +338,15 @@ function SolverCore.solve!( error("R2DH: prox-gradient step should produce a decrease but ξ = $(ξ)") atol += rtol * sqrt_ξ_νInv # make stopping test absolute and relative + user_requested_exit = callback(nlp, solver, stats) :: Bool + set_status!( stats, get_status( reg_nlp, elapsed_time = stats.elapsed_time, iter = stats.iter, + user_requested_exit = user_requested_exit, optimal = solved, improper = improper, max_eval = max_eval, @@ -352,8 +355,6 @@ function SolverCore.solve!( ), ) - callback(nlp, solver, stats) - done = stats.status != :unknown while !done @@ -433,12 +434,15 @@ function SolverCore.solve!( (ξ < 0 && sqrt_ξ_νInv > neg_tol) && error("R2DH: prox-gradient step should produce a decrease but ξ = $(ξ)") + user_requested_exit = callback(nlp, solver, stats) :: Bool + set_status!( stats, get_status( reg_nlp, elapsed_time = stats.elapsed_time, iter = stats.iter, + user_requested_exit = user_requested_exit, optimal = solved, improper = improper, max_eval = max_eval, @@ -447,8 +451,6 @@ function SolverCore.solve!( ), ) - callback(nlp, solver, stats) - done = stats.status != :unknown end diff --git a/src/R2N.jl b/src/R2N.jl index 14d47075..b5dc3424 100644 --- a/src/R2N.jl +++ b/src/R2N.jl @@ -199,7 +199,7 @@ function SolverCore.solve!( solver::R2NSolver{T, G, V}, reg_nlp::AbstractRegularizedNLPModel{T, V}, stats::GenericExecutionStats{T, V}; - callback = (args...) -> nothing, + callback = (args...) -> false, qn_update_y!::Function = _qn_grad_update_y!, qn_copy!::Function = _qn_grad_copy!, x::V = reg_nlp.model.meta.x0, @@ -340,12 +340,15 @@ function SolverCore.solve!( error("R2N: prox-gradient step should produce a decrease but ξ1 = $(ξ1)") atol += rtol * sqrt_ξ1_νInv # make stopping test absolute and relative + user_requested_exit = callback(nlp, solver, stats) :: Bool + set_status!( stats, get_status( reg_nlp, elapsed_time = stats.elapsed_time, iter = stats.iter, + user_requested_exit = user_requested_exit, optimal = solved, improper = improper, max_eval = max_eval, @@ -354,8 +357,6 @@ function SolverCore.solve!( ), ) - callback(nlp, solver, stats) - done = stats.status != :unknown while !done @@ -486,12 +487,15 @@ function SolverCore.solve!( (ξ1 < 0 && sqrt_ξ1_νInv > neg_tol) && error("R2N: prox-gradient step should produce a decrease but ξ1 = $(ξ1)") + user_requested_exit = callback(nlp, solver, stats) :: Bool + set_status!( stats, get_status( reg_nlp, elapsed_time = stats.elapsed_time, iter = stats.iter, + user_requested_exit = user_requested_exit, optimal = solved, improper = improper, max_eval = max_eval, @@ -500,8 +504,6 @@ function SolverCore.solve!( ), ) - callback(nlp, solver, stats) - done = stats.status != :unknown end diff --git a/src/R2_alg.jl b/src/R2_alg.jl index 05109399..15d43f0a 100644 --- a/src/R2_alg.jl +++ b/src/R2_alg.jl @@ -296,6 +296,7 @@ function R2(reg_nlp::AbstractRegularizedNLPModel; kwargs...) solver.Fobj_hist[stats.iter + 1] = stats.solver_specific[:smooth_obj] solver.Hobj_hist[stats.iter + 1] = stats.solver_specific[:nonsmooth_obj] solver.Complex_hist[stats.iter + 1] += 1 + return false end, ) solve!(solver, reg_nlp, stats; callback = cb, max_iter = max_iter, kwargs...) @@ -309,7 +310,7 @@ function SolverCore.solve!( solver::R2Solver{T}, reg_nlp::AbstractRegularizedNLPModel{T, V}, stats::GenericExecutionStats{T, V}; - callback = (args...) -> nothing, + callback = (args...) -> false, x::V = reg_nlp.model.meta.x0, atol::T = √eps(T), rtol::T = √eps(T), @@ -413,12 +414,15 @@ function SolverCore.solve!( (ξ < 0 && sqrt_ξ_νInv > neg_tol) && error("R2: prox-gradient step should produce a decrease but ξ = $(ξ)") + user_requested_exit = callback(nlp, solver, stats) :: Bool + set_status!( stats, get_status( reg_nlp, elapsed_time = stats.elapsed_time, iter = stats.iter, + user_requested_exit = user_requested_exit, optimal = solved, improper = improper, max_eval = max_eval, @@ -427,8 +431,6 @@ function SolverCore.solve!( ), ) - callback(nlp, solver, stats) - done = stats.status != :unknown while !done @@ -497,12 +499,15 @@ function SolverCore.solve!( (ξ < 0 && sqrt_ξ_νInv > neg_tol) && error("R2: prox-gradient step should produce a decrease but ξ = $(ξ)") + user_requested_exit = callback(nlp, solver, stats) :: Bool + set_status!( stats, get_status( reg_nlp, elapsed_time = stats.elapsed_time, iter = stats.iter, + user_requested_exit = user_requested_exit, optimal = solved, improper = improper, max_eval = max_eval, @@ -511,8 +516,6 @@ function SolverCore.solve!( ), ) - callback(nlp, solver, stats) - done = stats.status != :unknown end diff --git a/src/TRDH_alg.jl b/src/TRDH_alg.jl index e53ba5da..e4fd1ec0 100644 --- a/src/TRDH_alg.jl +++ b/src/TRDH_alg.jl @@ -227,7 +227,7 @@ function SolverCore.solve!( solver::TRDHSolver{T, G, V}, reg_nlp::AbstractRegularizedNLPModel{T, V}, stats::GenericExecutionStats{T, V}; - callback = (args...) -> nothing, + callback = (args...) -> false, x::V = reg_nlp.model.meta.x0, atol::T = √eps(T), rtol::T = √eps(T), @@ -390,12 +390,15 @@ function SolverCore.solve!( atol += rtol * sqrt_ξ_νInv # make stopping test absolute and relative #TODO : this is redundant code with the other case of the test. end + user_requested_exit = callback(nlp, solver, stats) :: Bool + set_status!( stats, get_status( reg_nlp, elapsed_time = stats.elapsed_time, iter = stats.iter, + user_requested_exit = user_requested_exit, optimal = solved, improper = improper, max_eval = max_eval, @@ -404,8 +407,6 @@ function SolverCore.solve!( ), ) - callback(nlp, solver, stats) - done = stats.status != :unknown while !done @@ -496,12 +497,15 @@ function SolverCore.solve!( error("TRDH: prox-gradient step should produce a decrease but ξ = $(ξ)") end + user_requested_exit = callback(nlp, solver, stats) :: Bool + set_status!( stats, get_status( reg_nlp, elapsed_time = stats.elapsed_time, iter = stats.iter, + user_requested_exit = user_requested_exit, optimal = solved, improper = improper, max_eval = max_eval, @@ -510,8 +514,6 @@ function SolverCore.solve!( ), ) - callback(nlp, solver, stats) - done = stats.status != :unknown end diff --git a/src/TR_alg.jl b/src/TR_alg.jl index 0b75df70..3f6bfdc0 100644 --- a/src/TR_alg.jl +++ b/src/TR_alg.jl @@ -198,7 +198,7 @@ function SolverCore.solve!( solver::TRSolver{T, G, V}, reg_nlp::AbstractRegularizedNLPModel{T, V}, stats::GenericExecutionStats{T, V}; - callback = (args...) -> nothing, + callback = (args...) -> false, x::V = reg_nlp.model.meta.x0, atol::T = √eps(T), sub_atol::T = √eps(T), @@ -340,12 +340,15 @@ function SolverCore.solve!( atol += rtol * sqrt_ξ1_νInv # make stopping test absolute and relative sub_atol += rtol * sqrt_ξ1_νInv + user_requested_exit = callback(nlp, solver, stats) :: Bool + set_status!( stats, get_status( reg_nlp, elapsed_time = stats.elapsed_time, iter = stats.iter, + user_requested_exit = user_requested_exit, optimal = solved, improper = improper, max_eval = max_eval, @@ -354,8 +357,6 @@ function SolverCore.solve!( ), ) - callback(nlp, solver, stats) - done = stats.status != :unknown while !done sub_atol = stats.iter == 0 ? 1e-5 : max(sub_atol, min(1e-2, sqrt_ξ1_νInv)) @@ -499,12 +500,15 @@ function SolverCore.solve!( (ξ1 < 0 && sqrt_ξ1_νInv > neg_tol) && error("TR: prox-gradient step should produce a decrease but ξ1 = $(ξ1)") + user_requested_exit = callback(nlp, solver, stats) :: Bool + set_status!( stats, get_status( reg_nlp, elapsed_time = stats.elapsed_time, iter = stats.iter, + user_requested_exit = user_requested_exit, optimal = solved, improper = improper, max_eval = max_eval, @@ -513,8 +517,6 @@ function SolverCore.solve!( ), ) - callback(nlp, solver, stats) - done = stats.status != :unknown end if verbose > 0 && stats.status == :first_order diff --git a/src/utils.jl b/src/utils.jl index ee257198..7ba9a35d 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -135,13 +135,14 @@ function get_status( reg_nlp::M; elapsed_time = 0.0, iter = 0, + user_requested_exit = false, optimal = false, improper = false, max_eval = Inf, max_time = Inf, max_iter = Inf, ) where {M <: AbstractRegularizedNLPModel} - if optimal + if optimal || user_requested_exit :first_order elseif improper :improper