Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
**/Manifest.toml
4 changes: 4 additions & 0 deletions src/LMTR_alg.jl
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,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, :sigma_cauchy, 1/ν)
set_solver_specific!(stats, :prox_evals, prox_evals + 1)

φ1 = let Fk = Fk, ∇fk = ∇fk
Expand All @@ -302,6 +303,7 @@ function SolverCore.solve!(
# Take first proximal gradient step s1 and see if current xk is nearly stationary.
# s1 minimizes φ1(d) + ‖d‖² / 2 / ν + ψ(d) ⟺ s1 ∈ prox{νψ}(-ν∇φ1(0))
prox!(s, ψ, mν∇fk, ν)
set_solver_specific!(stats, :scp_norm, norm(s))
ξ1 = fk + hk - mk1(s) + max(1, abs(fk + hk)) * 10 * eps()
sqrt_ξ1_νInv = ξ1 ≥ 0 ? sqrt(ξ1 / ν) : sqrt(-ξ1 / ν)
solved = (ξ1 < 0 && sqrt_ξ1_νInv ≤ neg_tol) || (ξ1 ≥ 0 && sqrt_ξ1_νInv ≤ atol)
Expand Down Expand Up @@ -448,9 +450,11 @@ function SolverCore.solve!(
set_solver_specific!(stats, :prox_evals, prox_evals + 1)

ν = α * Δk / (1 + σmax^2 * (α * Δk + 1))
set_solver_specific!(stats, :sigma_cauchy, 1/ν)
@. mν∇fk = -∇fk * ν

prox!(s, ψ, mν∇fk, ν)
set_solver_specific!(stats, :scp_norm, norm(s))
mks = mk1(s)

ξ1 = fk + hk - mks + max(1, abs(hk)) * 10 * eps()
Expand Down
9 changes: 8 additions & 1 deletion src/LM_alg.jl
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,7 @@ function SolverCore.solve!(
local ξ1::T
local ρk::T = zero(T)
local prox_evals::Int = 0
local norm_s::T = zero(T)

residual!(nls, xk, Fk)
jtprod_residual!(nls, xk, Fk, ∇fk)
Expand All @@ -290,6 +291,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, :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)

Expand All @@ -306,6 +308,8 @@ function SolverCore.solve!(
end

prox!(s, ψ, mν∇fk, ν)
norm_s = norm(s)
set_solver_specific!(stats, :scp_norm, norm_s)
ξ1 = fk + hk - mk1(s) + max(1, abs(fk + hk)) * 10 * eps()
sqrt_ξ1_νInv = ξ1 ≥ 0 ? sqrt(ξ1 / ν) : sqrt(-ξ1 / ν)
solved = (ξ1 < 0 && sqrt_ξ1_νInv ≤ neg_tol) || (ξ1 ≥ 0 && sqrt_ξ1_νInv ≤ atol)
Expand Down Expand Up @@ -436,9 +440,12 @@ function SolverCore.solve!(
set_solver_specific!(stats, :prox_evals, prox_evals + 1)

ν = θ / (σmax^2 + σk) # ‖J'J + σₖ I‖ = ‖J‖² + σₖ
set_solver_specific!(stats, :sigma_cauchy, 1/ν)

@. mν∇fk = - ν * ∇fk
prox!(s, ψ, mν∇fk, ν)
norm_s = norm(s)
set_solver_specific!(stats, :scp_norm, norm_s)
mks = mk1(s)

ξ1 = fk + hk - mks + max(1, abs(hk)) * 10 * eps()
Expand Down Expand Up @@ -470,7 +477,7 @@ function SolverCore.solve!(

if verbose > 0 && stats.status == :first_order
@info log_row(
Any[stats.iter, 0, fk, hk, sqrt_ξ1_νInv, ρk, σk, norm(xk), norm(s), 1 / ν, ""],
Any[stats.iter, 0, fk, hk, sqrt_ξ1_νInv, ρk, σk, norm(xk), norm_s, 1 / ν, ""],
colsep = 1,
)
@info "LM: terminating with √(ξ1/ν) = $(sqrt_ξ1_νInv)"
Expand Down
11 changes: 8 additions & 3 deletions src/R2DH.jl
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,7 @@ function SolverCore.solve!(

local ξ::T
local ρk::T = zero(T)
local norm_s::T = zero(T)

fk = obj(nlp, xk)
grad!(nlp, xk, ∇fk)
Expand Down Expand Up @@ -328,6 +329,8 @@ function SolverCore.solve!(
mk(d)::T = φ(d) + ψ(d)::T

spectral_test ? prox!(s, ψ, mν∇fk, ν₁) : iprox!(s, ψ, ∇fk, dkσk)
norm_s = norm(s)
set_solver_specific!(stats, :scp_norm, norm_s)

mks = mk(s)

Expand Down Expand Up @@ -379,7 +382,7 @@ function SolverCore.solve!(
ρk,
σk,
norm(xk),
norm(s),
norm_s,
(η2 ≤ ρk < Inf) ? '↘' : (ρk < η1 ? '↗' : '='),
],
colsep = 1,
Expand Down Expand Up @@ -412,19 +415,21 @@ function SolverCore.solve!(
set_solver_specific!(stats, :smooth_obj, fk)
set_solver_specific!(stats, :nonsmooth_obj, hk)
set_solver_specific!(stats, :sigma, σk)
set_solver_specific!(stats, :sigma_cauchy, 1/ν₁)
set_iter!(stats, stats.iter + 1)
set_time!(stats, time() - start_time)

@. dkσk = D.d .+ σk
DNorm = norm(D.d, Inf)

ν₁ = θ / (DNorm + σk)
set_solver_specific!(stats, :sigma_cauchy, 1/ν₁)

@. mν∇fk = -ν₁ * ∇fk
m_monotone > 1 && (m_fh_hist[stats.iter % (m_monotone - 1) + 1] = fk + hk)

spectral_test ? prox!(s, ψ, mν∇fk, ν₁) : iprox!(s, ψ, ∇fk, dkσk)
norm_s = norm(s)
set_solver_specific!(stats, :scp_norm, norm_s)
mks = mk(s)

ξ = hk - mks + max(1, abs(hk)) * 10 * eps()
Expand Down Expand Up @@ -453,7 +458,7 @@ function SolverCore.solve!(
end

if verbose > 0 && stats.status == :first_order
@info log_row(Any[stats.iter, fk, hk, sqrt_ξ_νInv, ρk, σk, norm(xk), norm(s), ""], colsep = 1)
@info log_row(Any[stats.iter, fk, hk, sqrt_ξ_νInv, ρk, σk, norm(xk), norm_s, ""], colsep = 1)
@info "R2DH: terminating with √(ξ/ν) = $(sqrt_ξ_νInv)"
end

Expand Down
2 changes: 2 additions & 0 deletions src/R2N.jl
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,7 @@ function SolverCore.solve!(
end

prox!(s1, ψ, mν∇fk, ν₁)
set_solver_specific!(stats, :scp_norm, norm(s1))
mks = mk1(s1)

ξ1 = hk - mks + max(1, abs(hk)) * 10 * eps()
Expand Down Expand Up @@ -477,6 +478,7 @@ function SolverCore.solve!(

@. mν∇fk = - ν₁ * ∇fk
prox!(s1, ψ, mν∇fk, ν₁)
set_solver_specific!(stats, :scp_norm, norm(s1))
mks = mk1(s1)

ξ1 = hk - mks + max(1, abs(hk)) * 10 * eps()
Expand Down
9 changes: 7 additions & 2 deletions src/R2_alg.jl
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,7 @@ function SolverCore.solve!(

local ξ::T
local ρk::T
local norm_s::T = zero(T)
σk = max(1 / ν, σmin)
ν = 1 / σk
sqrt_ξ_νInv = one(T)
Expand All @@ -402,6 +403,8 @@ function SolverCore.solve!(
mk(d)::T = φk(d) + ψ(d)::T

prox!(s, ψ, mν∇fk, ν)
norm_s = norm(s)
set_solver_specific!(stats, :scp_norm, norm_s)
mks = mk(s)

ξ = hk - mks + max(1, abs(hk)) * 10 * eps()
Expand Down Expand Up @@ -453,7 +456,7 @@ function SolverCore.solve!(
ρk,
σk,
norm(xk),
norm(s),
norm_s,
(η2 ≤ ρk < Inf) ? '↘' : (ρk < η1 ? '↗' : '='),
],
colsep = 1,
Expand Down Expand Up @@ -489,6 +492,8 @@ function SolverCore.solve!(
set_time!(stats, time() - start_time)

prox!(s, ψ, mν∇fk, ν)
norm_s = norm(s)
set_solver_specific!(stats, :scp_norm, norm_s)
mks = mk(s)

ξ = hk - mks + max(1, abs(hk)) * 10 * eps()
Expand Down Expand Up @@ -517,7 +522,7 @@ function SolverCore.solve!(
end

if verbose > 0 && stats.status == :first_order
@info log_row(Any[stats.iter, fk, hk, sqrt_ξ_νInv, ρk, σk, norm(xk), norm(s), ""], colsep = 1)
@info log_row(Any[stats.iter, fk, hk, sqrt_ξ_νInv, ρk, σk, norm(xk), norm_s, ""], colsep = 1)
@info "R2: terminating with √(ξ/ν) = $(sqrt_ξ_νInv)"
end

Expand Down
6 changes: 6 additions & 0 deletions src/TRDH_alg.jl
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,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, :sigma_cauchy, 1/ν)

# models
φ1 = let ∇fk = ∇fk
Expand All @@ -358,6 +359,7 @@ function SolverCore.solve!(

if reduce_TR
prox!(s, ψ, mν∇fk, ν)
set_solver_specific!(stats, :scp_norm, norm(s))
mks = mk1(s)

ξ1 = hk - mks + max(1, abs(hk)) * 10 * eps()
Expand All @@ -383,6 +385,7 @@ function SolverCore.solve!(
sNorm = χ(s)

if !reduce_TR
set_solver_specific!(stats, :scp_norm, norm(s))
sqrt_ξ_νInv = ξ ≥ 0 ? sqrt(ξ / ν) : sqrt(-ξ / ν)
solved = (ξ < 0 && sqrt_ξ_νInv ≤ neg_tol) || (ξ ≥ 0 && sqrt_ξ_νInv < atol)
(ξ < 0 && sqrt_ξ_νInv > neg_tol) &&
Expand Down Expand Up @@ -473,10 +476,12 @@ function SolverCore.solve!(
set_time!(stats, time() - start_time)

ν = reduce_TR ? (α * Δk)/(DNorm + one(T)) : α / (DNorm + one(T))
set_solver_specific!(stats, :sigma_cauchy, 1/ν)
mν∇fk .= -ν .* ∇fk

if reduce_TR
prox!(s, ψ, mν∇fk, ν)
set_solver_specific!(stats, :scp_norm, norm(s))
ξ1 = hk - mk1(s) + max(1, abs(hk)) * 10 * eps()
sqrt_ξ_νInv = ξ1 ≥ 0 ? sqrt(ξ1 / ν) : sqrt(-ξ1 / ν)
solved = (ξ1 < 0 && sqrt_ξ_νInv ≤ neg_tol) || (ξ1 ≥ 0 && sqrt_ξ_νInv < atol)
Expand All @@ -489,6 +494,7 @@ function SolverCore.solve!(
sNorm = χ(s)

if !reduce_TR
set_solver_specific!(stats, :scp_norm, norm(s))
ξ = hk - mk(s) + max(1, abs(hk)) * 10 * eps()
sqrt_ξ_νInv = ξ ≥ 0 ? sqrt(ξ / ν) : sqrt(-ξ / ν)
solved = (ξ < 0 && sqrt_ξ_νInv ≤ neg_tol) || (ξ ≥ 0 && sqrt_ξ_νInv < atol)
Expand Down
4 changes: 4 additions & 0 deletions src/TR_alg.jl
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,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, :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)

Expand All @@ -330,6 +331,7 @@ function SolverCore.solve!(
end

prox!(s, ψ, mν∇fk, ν₁)
set_solver_specific!(stats, :scp_norm, norm(s))
ξ1 = hk - mk1(s) + max(1, abs(hk)) * 10 * eps()
ξ1 > 0 || error("TR: first prox-gradient step should produce a decrease but ξ1 = $(ξ1)")
sqrt_ξ1_νInv = sqrt(ξ1 / ν₁)
Expand Down Expand Up @@ -489,9 +491,11 @@ function SolverCore.solve!(
set_solver_specific!(stats, :prox_evals, prox_evals + 1)

ν₁ = α * Δk / (1 + λmax * (α * Δk + 1))
set_solver_specific!(stats, :sigma_cauchy, 1/ν₁)
@. mν∇fk = -ν₁ * ∇fk

prox!(s, ψ, mν∇fk, ν₁)
set_solver_specific!(stats, :scp_norm, norm(s))
ξ1 = hk - mk1(s) + max(1, abs(hk)) * 10 * eps()
sqrt_ξ1_νInv = sqrt(ξ1 / ν₁)

Expand Down
1 change: 1 addition & 0 deletions src/utils.jl
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ function RegularizedExecutionStats(reg_nlp::AbstractRegularizedNLPModel{T, V}) w
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, :scp_norm, T(Inf))
return stats
end

Expand Down
Loading