From 6991ca38c55b601a48a581af05705d79d03c4150 Mon Sep 17 00:00:00 2001 From: Maxence Gollier Date: Fri, 20 Feb 2026 13:11:36 -0500 Subject: [PATCH 1/3] fix step computations --- src/LMTR_alg.jl | 4 ++-- src/TRDH_alg.jl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/LMTR_alg.jl b/src/LMTR_alg.jl index c8c0ecb6..997dc0a0 100644 --- a/src/LMTR_alg.jl +++ b/src/LMTR_alg.jl @@ -275,7 +275,7 @@ function SolverCore.solve!( σmax, found_σ = opnorm(solver.subpb.model.J) found_σ || error("operator norm computation failed") - ν = α * Δk / (1 + σmax^2 * (α * Δk + 1)) + ν = 1 / (σmax^2 + 1 / (α * Δk)) @. mν∇fk = -∇fk * ν sqrt_ξ1_νInv = one(T) @@ -447,7 +447,7 @@ function SolverCore.solve!( set_time!(stats, time() - start_time) set_solver_specific!(stats, :prox_evals, prox_evals + 1) - ν = α * Δk / (1 + σmax^2 * (α * Δk + 1)) + ν = 1 / (σmax^2 + 1 / (α * Δk)) @. mν∇fk = -∇fk * ν prox!(s, ψ, mν∇fk, ν) diff --git a/src/TRDH_alg.jl b/src/TRDH_alg.jl index 032e72fc..7f97bd11 100644 --- a/src/TRDH_alg.jl +++ b/src/TRDH_alg.jl @@ -326,7 +326,7 @@ function SolverCore.solve!( dk .= D.d DNorm = norm(D.d, Inf) - ν = (α * Δk)/(DNorm + one(T)) + ν = 1 / (DNorm + 1 / (α * Δk)) sqrt_ξ_νInv = one(T) @. mν∇fk = -ν * ∇fk @@ -476,7 +476,7 @@ function SolverCore.solve!( set_iter!(stats, stats.iter + 1) set_time!(stats, time() - start_time) - ν = reduce_TR ? (α * Δk)/(DNorm + one(T)) : α / (DNorm + one(T)) + ν = reduce_TR ? 1 / (DNorm + 1 / (α * Δk)) : 1 / (DNorm + 1 / α) mν∇fk .= -ν .* ∇fk if reduce_TR From 17b9d26901d71cbc9e97c4d20fb2b819433b5f8f Mon Sep 17 00:00:00 2001 From: Maxence Gollier Date: Fri, 20 Feb 2026 14:31:29 -0500 Subject: [PATCH 2/3] remove TRDH with bound test --- test/test_bounds.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_bounds.jl b/test/test_bounds.jl index 0b173df8..17947d03 100644 --- a/test/test_bounds.jl +++ b/test/test_bounds.jl @@ -25,6 +25,7 @@ end for (mod, mod_name) ∈ ((SpectralGradientModel, "spg"),) # ((DiagonalPSBModel, "psb"),(DiagonalAndreiModel, "andrei")) work but do not always terminate for (h, h_name) ∈ ((NormL0(λ), "l0"), (NormL1(λ), "l1")) + continue # FIXME @testset "bpdn-with-bounds-$(mod_name)-TRDH-$(h_name)" begin x0 = zeros(bpdn2.meta.nvar) p = randperm(bpdn2.meta.nvar)[1:nz] From 0118a02df4ce07fd6635cf68f08ac0ceabb3c506 Mon Sep 17 00:00:00 2001 From: Maxence Gollier Date: Fri, 27 Feb 2026 14:36:50 -0500 Subject: [PATCH 3/3] fix xi computation bug in TRDH --- src/TRDH_alg.jl | 16 ++++------------ test/test_bounds.jl | 1 - 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/TRDH_alg.jl b/src/TRDH_alg.jl index 63b97a87..af601d7d 100644 --- a/src/TRDH_alg.jl +++ b/src/TRDH_alg.jl @@ -345,13 +345,6 @@ function SolverCore.solve!( set_solver_specific!(stats, :nonsmooth_obj, hk) # models - φ1 = let ∇fk = ∇fk - d -> dot(∇fk, d) - end - mk1 = let ψ = ψ - d -> φ1(d) + ψ(d)::T - end - φ = let ∇fk = ∇fk, dk = dk d -> begin result = zero(T) @@ -368,7 +361,7 @@ function SolverCore.solve!( if reduce_TR prox!(s, ψ, mν∇fk, ν) - mks = mk1(s) + mks = mk(s) ξ1 = hk - mks + max(1, abs(hk)) * 10 * eps() sqrt_ξ_νInv = ξ1 ≥ 0 ? sqrt(ξ1 / ν) : sqrt(-ξ1 / ν) @@ -489,7 +482,7 @@ function SolverCore.solve!( if reduce_TR prox!(s, ψ, mν∇fk, ν) - ξ1 = hk - mk1(s) + max(1, abs(hk)) * 10 * eps() + ξ1 = hk - mk(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) (ξ1 < 0 && sqrt_ξ_νInv > neg_tol) && @@ -497,11 +490,10 @@ function SolverCore.solve!( end iprox!(s, ψ, ∇fk, dk) - + ξ = hk - mk(s) + max(1, abs(hk)) * 10 * eps() sNorm = χ(s) - if !reduce_TR - ξ = hk - mk(s) + max(1, abs(hk)) * 10 * eps() + if !reduce_TR sqrt_ξ_νInv = ξ ≥ 0 ? sqrt(ξ / ν) : sqrt(-ξ / ν) solved = (ξ < 0 && sqrt_ξ_νInv ≤ neg_tol) || (ξ ≥ 0 && sqrt_ξ_νInv < atol) (ξ < 0 && sqrt_ξ_νInv > neg_tol) && diff --git a/test/test_bounds.jl b/test/test_bounds.jl index 17947d03..0b173df8 100644 --- a/test/test_bounds.jl +++ b/test/test_bounds.jl @@ -25,7 +25,6 @@ end for (mod, mod_name) ∈ ((SpectralGradientModel, "spg"),) # ((DiagonalPSBModel, "psb"),(DiagonalAndreiModel, "andrei")) work but do not always terminate for (h, h_name) ∈ ((NormL0(λ), "l0"), (NormL1(λ), "l1")) - continue # FIXME @testset "bpdn-with-bounds-$(mod_name)-TRDH-$(h_name)" begin x0 = zeros(bpdn2.meta.nvar) p = randperm(bpdn2.meta.nvar)[1:nz]