@@ -100,7 +100,7 @@ function LM(
100100
101101 xkn = similar (xk)
102102
103- local ξ1
103+ local ξ1, ξ
104104 k = 0
105105 Fobj_hist = zeros (maxIter)
106106 Hobj_hist = zeros (maxIter)
@@ -110,7 +110,7 @@ function LM(
110110
111111 if verbose > 0
112112 # ! format: off
113- @info @sprintf " %6s %8s %8s %8s %7s %7s %8s %7s %7s %7s %7s %1s" " outer" " inner" " f(x)" " h(x)" " √ξ1 " " √ξ " " ρ" " σ" " ‖x‖" " ‖s‖" " ‖Jₖ‖²" " reg"
113+ @info @sprintf " %6s %8s %8s %8s %7s %7s %8s %7s %7s %7s %7s %1s" " outer" " inner" " f(x)" " h(x)" " √(ξ1/ν) " " √(ξ/ν) " " ρ" " σ" " ‖x‖" " ‖s‖" " ‖Jₖ‖²" " reg"
114114 # ! format: on
115115 end
116116
@@ -125,6 +125,7 @@ function LM(
125125
126126 σmax = opnorm (Jk)
127127 νInv = (1 + θ) * (σmax^ 2 + σk) # ‖J'J + σₖ I‖ = ‖J‖² + σₖ
128+ ν = 1 / νInv
128129
129130 s = zero (xk)
130131
@@ -178,18 +179,18 @@ function LM(
178179 ξ1 > 0 || error (" LM: first prox-gradient step should produce a decrease but ξ1 = $(ξ1) " )
179180
180181 if ξ1 ≥ 0 && k == 1
181- ϵ_increment = ϵr * sqrt (ξ1)
182+ ϵ_increment = ϵr * sqrt (ξ1/ ν )
182183 ϵ += ϵ_increment # make stopping test absolute and relative
183184 ϵ_subsolver += ϵ_increment
184185 end
185186
186- if sqrt (ξ1) < ϵ
187+ if sqrt (ξ1/ ν ) < ϵ
187188 # the current xk is approximately first-order stationary
188189 optimal = true
189190 continue
190191 end
191192
192- subsolver_options. ϵa = k == 1 ? 1.0e-1 : max (ϵ_subsolver, min (1.0e-2 , ξ1 / 10 ))
193+ subsolver_options. ϵa = k == 1 ? 1.0e-1 : max (ϵ_subsolver, min (1.0e-2 , ξ1 / ν / 10 ))
193194 subsolver_options. ν = ν
194195 @debug " setting inner stopping tolerance to" subsolver_options. optTol
195196 s, iter, _ = with_logger (subsolver_logger) do
@@ -220,7 +221,7 @@ function LM(
220221
221222 if (verbose > 0 ) && (k % ptf == 0 )
222223 # ! format: off
223- @info @sprintf " %6d %8d %8.1e %8.1e %7.1e %7.1e %8.1e %7.1e %7.1e %7.1e %7.1e %1s" k iter fk hk sqrt (ξ1) sqrt (ξ) ρk σk norm (xk) norm (s) νInv σ_stat
224+ @info @sprintf " %6d %8d %8.1e %8.1e %7.1e %7.1e %8.1e %7.1e %7.1e %7.1e %7.1e %1s" k iter fk hk sqrt (ξ1/ ν ) sqrt (ξ/ ν ) ρk σk norm (xk) norm (s) νInv σ_stat
224225 # ! format: off
225226 end
226227
@@ -260,9 +261,9 @@ function LM(
260261 @info @sprintf " %6d %8s %8.1e %8.1e" k " " fk hk
261262 elseif optimal
262263 # ! format: off
263- @info @sprintf " %6d %8d %8.1e %8.1e %7.1e %7.1e %8s %7.1e %7.1e %7.1e %7.1e" k 1 fk hk sqrt (ξ1) sqrt (ξ1 ) " " σk norm (xk) norm (s) νInv
264+ @info @sprintf " %6d %8d %8.1e %8.1e %7.1e %7.1e %8s %7.1e %7.1e %7.1e %7.1e" k 1 fk hk sqrt (ξ1/ ν ) sqrt (ξ / ν ) " " σk norm (xk) norm (s) νInv
264265 # ! format: on
265- @info " LM: terminating with √ξ1 = $(sqrt (ξ1)) "
266+ @info " LM: terminating with √(ξ1/ν) = $(sqrt (ξ1/ ν )) "
266267 end
267268 end
268269 status = if optimal
@@ -279,7 +280,7 @@ function LM(
279280 set_status! (stats, status)
280281 set_solution! (stats, xk)
281282 set_objective! (stats, fk + hk)
282- set_residuals! (stats, zero (eltype (xk)), ξ1 ≥ 0 ? sqrt (ξ1) : ξ1)
283+ set_residuals! (stats, zero (eltype (xk)), ξ1 ≥ 0 ? sqrt (ξ1/ ν ) : ξ1)
283284 set_iter! (stats, k)
284285 set_time! (stats, elapsed_time)
285286 set_solver_specific! (stats, :Fhist , Fobj_hist[1 : k])
0 commit comments