From 4744db8356ee3cf1b1c74f3454f39117c7ef2c3d Mon Sep 17 00:00:00 2001 From: MohamedLaghdafHABIBOULLAH Date: Tue, 23 Sep 2025 19:20:35 -0400 Subject: [PATCH 1/3] Add prox_evals --- src/LM_alg.jl | 4 ++++ src/R2N.jl | 4 ++++ src/TR_alg.jl | 6 +++++- src/utils.jl | 1 + 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/LM_alg.jl b/src/LM_alg.jl index bec67249..9f179a5e 100644 --- a/src/LM_alg.jl +++ b/src/LM_alg.jl @@ -255,6 +255,7 @@ function SolverCore.solve!( local ξ1::T local ρk::T = zero(T) + local prox_evals::Int = 0 residual!(nls, xk, Fk) jtprod_residual!(nls, xk, Fk, ∇fk) @@ -273,6 +274,7 @@ function SolverCore.solve!( set_objective!(stats, fk + hk) set_solver_specific!(stats, :smooth_obj, fk) set_solver_specific!(stats, :nonsmooth_obj, hk) + set_solver_specific!(stats, :prox_evals, prox_evals + 1) φ1 = let Fk = Fk, ∇fk = ∇fk d -> dot(Fk, Fk) / 2 + dot(∇fk, d) # ∇fk = Jk^T Fk @@ -329,6 +331,7 @@ function SolverCore.solve!( ) end + prox_evals += solver.substats.iter s .= solver.substats.solution xkn .= xk .+ s @@ -402,6 +405,7 @@ function SolverCore.solve!( set_solver_specific!(stats, :nonsmooth_obj, hk) set_iter!(stats, stats.iter + 1) set_time!(stats, time() - start_time) + set_solver_specific!(stats, :prox_evals, prox_evals + 1) ν = θ / (σmax^2 + σk) # ‖J'J + σₖ I‖ = ‖J‖² + σₖ diff --git a/src/R2N.jl b/src/R2N.jl index e7fe1dce..1fd94b14 100644 --- a/src/R2N.jl +++ b/src/R2N.jl @@ -291,6 +291,7 @@ function SolverCore.solve!( local ξ1::T local ρk::T = zero(T) + local prox_evals::Int = 0 fk = obj(nlp, xk) grad!(nlp, xk, ∇fk) @@ -317,6 +318,7 @@ function SolverCore.solve!( set_solver_specific!(stats, :nonsmooth_obj, hk) set_solver_specific!(stats, :sigma, σk) set_solver_specific!(stats, :sigma_cauchy, 1/ν₁) + set_solver_specific!(stats, :prox_evals, prox_evals + 1) m_monotone > 1 && (m_fh_hist[stats.iter % (m_monotone - 1) + 1] = fk + hk) φ1 = let ∇fk = ∇fk @@ -386,6 +388,7 @@ function SolverCore.solve!( ) end + prox_evals += solver.substats.iter s .= solver.substats.solution if norm(s) > β * norm(s1) @@ -470,6 +473,7 @@ function SolverCore.solve!( set_solver_specific!(stats, :sigma_cauchy, 1/ν₁) set_iter!(stats, stats.iter + 1) set_time!(stats, time() - start_time) + set_solver_specific!(stats, :prox_evals, prox_evals + 1) @. mν∇fk = - ν₁ * ∇fk prox!(s1, ψ, mν∇fk, ν₁) diff --git a/src/TR_alg.jl b/src/TR_alg.jl index 0b102d63..d55dca16 100644 --- a/src/TR_alg.jl +++ b/src/TR_alg.jl @@ -266,6 +266,7 @@ function SolverCore.solve!( local ξ1::T local ρk = zero(T) + local prox_evals::Int = 0 α = 1 / eps(T) β = 1 / eps(T) @@ -291,6 +292,7 @@ function SolverCore.solve!( set_objective!(stats, fk + hk) set_solver_specific!(stats, :smooth_obj, fk) set_solver_specific!(stats, :nonsmooth_obj, hk) + set_solver_specific!(stats, :prox_evals, prox_evals + 1) # models φ1 = let ∇fk = ∇fk @@ -369,7 +371,8 @@ function SolverCore.solve!( ) end end - + + prox_evals += solver.substats.iter s .= solver.substats.solution xkn .= xk .+ s @@ -454,6 +457,7 @@ function SolverCore.solve!( set_solver_specific!(stats, :nonsmooth_obj, hk) set_iter!(stats, stats.iter + 1) set_time!(stats, time() - start_time) + set_solver_specific!(stats, :prox_evals, prox_evals + 1) ν₁ = α * Δk / (1 + λmax * (α * Δk + 1)) @. mν∇fk = -ν₁ * ∇fk diff --git a/src/utils.jl b/src/utils.jl index 2f5d40bf..acc35592 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -114,5 +114,6 @@ function RegularizedExecutionStats(reg_nlp::AbstractRegularizedNLPModel{T, V}) w set_solver_specific!(stats, :sigma, T(Inf)) set_solver_specific!(stats, :sigma_cauchy, T(Inf)) set_solver_specific!(stats, :radius, T(Inf)) + set_solver_specific!(stats, :prox_evals, T(Inf)) return stats end From 30bced2395e872d87bad2ffe591eab7b6e72778d Mon Sep 17 00:00:00 2001 From: MohamedLaghdafHABIBOULLAH Date: Wed, 24 Sep 2025 16:26:20 -0400 Subject: [PATCH 2/3] Update prox_evals initialization to use Inf(Inf) in RegularizedExecutionStats --- src/utils.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.jl b/src/utils.jl index acc35592..5743d57e 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -114,6 +114,6 @@ function RegularizedExecutionStats(reg_nlp::AbstractRegularizedNLPModel{T, V}) w set_solver_specific!(stats, :sigma, T(Inf)) set_solver_specific!(stats, :sigma_cauchy, T(Inf)) set_solver_specific!(stats, :radius, T(Inf)) - set_solver_specific!(stats, :prox_evals, T(Inf)) + set_solver_specific!(stats, :prox_evals, Inf(Inf)) return stats end From 18fe099f9b3bdc95f8925bc88008ad6537a29689 Mon Sep 17 00:00:00 2001 From: MohamedLaghdafHABIBOULLAH Date: Wed, 24 Sep 2025 16:35:17 -0400 Subject: [PATCH 3/3] Put back prox_evals initialization to use T(Inf) in RegularizedExecutionStats --- src/utils.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.jl b/src/utils.jl index 5743d57e..acc35592 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -114,6 +114,6 @@ function RegularizedExecutionStats(reg_nlp::AbstractRegularizedNLPModel{T, V}) w set_solver_specific!(stats, :sigma, T(Inf)) set_solver_specific!(stats, :sigma_cauchy, T(Inf)) set_solver_specific!(stats, :radius, T(Inf)) - set_solver_specific!(stats, :prox_evals, Inf(Inf)) + set_solver_specific!(stats, :prox_evals, T(Inf)) return stats end