Skip to content

Commit 6026bf3

Browse files
Add sigma_cauchy and scp_norm to solver statistics in LMTR, LMSolver, R2DH, R2N, and R2Solver
1 parent 350cfd6 commit 6026bf3

File tree

8 files changed

+26
-1
lines changed

8 files changed

+26
-1
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Manifest.toml

src/LMTR_alg.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ function SolverCore.solve!(
285285
set_objective!(stats, fk + hk)
286286
set_solver_specific!(stats, :smooth_obj, fk)
287287
set_solver_specific!(stats, :nonsmooth_obj, hk)
288+
set_solver_specific!(stats, :sigma_cauchy, 1/ν)
288289
set_solver_specific!(stats, :prox_evals, prox_evals + 1)
289290

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

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

453456
prox!(s, ψ, mν∇fk, ν)
457+
set_solver_specific!(stats, :scp_norm, norm(s))
454458
mks = mk1(s)
455459

456460
ξ1 = fk + hk - mks + max(1, abs(hk)) * 10 * eps()

src/LM_alg.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ function SolverCore.solve!(
290290
set_objective!(stats, fk + hk)
291291
set_solver_specific!(stats, :smooth_obj, fk)
292292
set_solver_specific!(stats, :nonsmooth_obj, hk)
293+
set_solver_specific!(stats, :sigma_cauchy, 1/ν)
293294
set_solver_specific!(stats, :prox_evals, prox_evals + 1)
294295
m_monotone > 1 && (m_fh_hist[stats.iter % (m_monotone - 1) + 1] = fk + hk)
295296

@@ -306,6 +307,7 @@ function SolverCore.solve!(
306307
end
307308

308309
prox!(s, ψ, mν∇fk, ν)
310+
set_solver_specific!(stats, :scp_norm, norm(s))
309311
ξ1 = fk + hk - mk1(s) + max(1, abs(fk + hk)) * 10 * eps()
310312
sqrt_ξ1_νInv = ξ1 0 ? sqrt(ξ1 / ν) : sqrt(-ξ1 / ν)
311313
solved = (ξ1 < 0 && sqrt_ξ1_νInv neg_tol) || (ξ1 0 && sqrt_ξ1_νInv atol)
@@ -436,9 +438,11 @@ function SolverCore.solve!(
436438
set_solver_specific!(stats, :prox_evals, prox_evals + 1)
437439

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

440443
@. mν∇fk = - ν * ∇fk
441444
prox!(s, ψ, mν∇fk, ν)
445+
set_solver_specific!(stats, :scp_norm, norm(s))
442446
mks = mk1(s)
443447

444448
ξ1 = fk + hk - mks + max(1, abs(hk)) * 10 * eps()

src/R2DH.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ function SolverCore.solve!(
328328
mk(d)::T = φ(d) + ψ(d)::T
329329

330330
spectral_test ? prox!(s, ψ, mν∇fk, ν₁) : iprox!(s, ψ, ∇fk, dkσk)
331+
set_solver_specific!(stats, :scp_norm, norm(s))
331332

332333
mks = mk(s)
333334

@@ -412,19 +413,20 @@ function SolverCore.solve!(
412413
set_solver_specific!(stats, :smooth_obj, fk)
413414
set_solver_specific!(stats, :nonsmooth_obj, hk)
414415
set_solver_specific!(stats, :sigma, σk)
415-
set_solver_specific!(stats, :sigma_cauchy, 1/ν₁)
416416
set_iter!(stats, stats.iter + 1)
417417
set_time!(stats, time() - start_time)
418418

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

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

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

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

430432
ξ = hk - mks + max(1, abs(hk)) * 10 * eps()

src/R2N.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ function SolverCore.solve!(
331331
end
332332

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

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

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

482484
ξ1 = hk - mks + max(1, abs(hk)) * 10 * eps()

src/R2_alg.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,7 @@ function SolverCore.solve!(
402402
mk(d)::T = φk(d) + ψ(d)::T
403403

404404
prox!(s, ψ, mν∇fk, ν)
405+
set_solver_specific!(stats, :scp_norm, norm(s))
405406
mks = mk(s)
406407

407408
ξ = hk - mks + max(1, abs(hk)) * 10 * eps()
@@ -489,6 +490,7 @@ function SolverCore.solve!(
489490
set_time!(stats, time() - start_time)
490491

491492
prox!(s, ψ, mν∇fk, ν)
493+
set_solver_specific!(stats, :scp_norm, norm(s))
492494
mks = mk(s)
493495

494496
ξ = hk - mks + max(1, abs(hk)) * 10 * eps()

src/TRDH_alg.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ function SolverCore.solve!(
333333
set_objective!(stats, fk + hk)
334334
set_solver_specific!(stats, :smooth_obj, fk)
335335
set_solver_specific!(stats, :nonsmooth_obj, hk)
336+
set_solver_specific!(stats, :sigma_cauchy, 1/ν)
336337

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

359360
if reduce_TR
360361
prox!(s, ψ, mν∇fk, ν)
362+
set_solver_specific!(stats, :scp_norm, norm(s))
361363
mks = mk1(s)
362364

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

385387
if !reduce_TR
388+
set_solver_specific!(stats, :scp_norm, norm(s))
386389
sqrt_ξ_νInv = ξ 0 ? sqrt/ ν) : sqrt(-ξ / ν)
387390
solved =< 0 && sqrt_ξ_νInv neg_tol) || 0 && sqrt_ξ_νInv < atol)
388391
< 0 && sqrt_ξ_νInv > neg_tol) &&
@@ -473,10 +476,12 @@ function SolverCore.solve!(
473476
set_time!(stats, time() - start_time)
474477

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

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

491496
if !reduce_TR
497+
set_solver_specific!(stats, :scp_norm, norm(s))
492498
ξ = hk - mk(s) + max(1, abs(hk)) * 10 * eps()
493499
sqrt_ξ_νInv = ξ 0 ? sqrt/ ν) : sqrt(-ξ / ν)
494500
solved =< 0 && sqrt_ξ_νInv neg_tol) || 0 && sqrt_ξ_νInv < atol)

src/TR_alg.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ function SolverCore.solve!(
314314
set_objective!(stats, fk + hk)
315315
set_solver_specific!(stats, :smooth_obj, fk)
316316
set_solver_specific!(stats, :nonsmooth_obj, hk)
317+
set_solver_specific!(stats, :sigma_cauchy, 1/ν₁)
317318
set_solver_specific!(stats, :prox_evals, prox_evals + 1)
318319
m_monotone > 1 && (m_fh_hist[stats.iter % (m_monotone - 1) + 1] = fk + hk)
319320

@@ -330,6 +331,7 @@ function SolverCore.solve!(
330331
end
331332

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

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

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

0 commit comments

Comments
 (0)