Skip to content

Commit eadf16f

Browse files
committed
Fix some correctness issues
1 parent f18fe15 commit eadf16f

File tree

12 files changed

+32
-45
lines changed

12 files changed

+32
-45
lines changed

src/broyden.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ function perform_step!(cache::GeneralBroydenCache{iip}) where {iip}
9696

9797
update_trace!(cache, α)
9898
check_and_update!(cache, cache.fu, cache.u, cache.u_cache)
99-
cache.stats.nf += 1
10099

101100
cache.force_stop && return nothing
102101

@@ -114,7 +113,7 @@ function perform_step!(cache::GeneralBroydenCache{iip}) where {iip}
114113
else
115114
@bb cache.du .*= -1
116115
@bb cache.J⁻¹dfu = cache.J⁻¹ × vec(cache.dfu)
117-
@bb cache.u_cache = cache.J⁻¹ × vec(cache.du)
116+
@bb cache.u_cache = transpose(cache.J⁻¹) × vec(cache.du)
118117
denom = dot(cache.du, cache.J⁻¹dfu)
119118
@bb @. cache.du = (cache.du - cache.J⁻¹dfu) / ifelse(iszero(denom), T(1e-5), denom)
120119
@bb cache.J⁻¹ += vec(cache.du) × transpose(cache.u_cache)

src/dfsane.jl

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ end
5858
alg
5959
u
6060
u_cache
61+
u_cache_2
6162
fu
6263
fu_cache
6364
du
@@ -95,6 +96,7 @@ function SciMLBase.__init(prob::NonlinearProblem{uType, iip}, alg::DFSane, args.
9596

9697
@bb du = similar(u)
9798
@bb u_cache = copy(u)
99+
@bb u_cache_2 = similar(u)
98100

99101
fu = evaluate_f(prob, u)
100102
@bb fu_cache = copy(fu)
@@ -108,48 +110,43 @@ function SciMLBase.__init(prob::NonlinearProblem{uType, iip}, alg::DFSane, args.
108110
termination_condition)
109111
trace = init_nonlinearsolve_trace(alg, u, fu, nothing, du; kwargs...)
110112

111-
return DFSaneCache{iip}(alg, u, u_cache, fu, fu_cache, du, history, f_norm, f_norm_0,
112-
alg.M, T(alg.σ_1), T(alg.σ_min), T(alg.σ_max), one(T), T(alg.γ), T(alg.τ_min),
113-
T(alg.τ_max), alg.n_exp, prob.p, false, maxiters, internalnorm, ReturnCode.Default,
114-
abstol, reltol, prob, NLStats(1, 0, 0, 0, 0), tc_cache, trace)
113+
return DFSaneCache{iip}(alg, u, u_cache, u_cache_2, fu, fu_cache, du, history, f_norm,
114+
f_norm_0, alg.M, T(alg.σ_1), T(alg.σ_min), T(alg.σ_max), one(T), T(alg.γ),
115+
T(alg.τ_min), T(alg.τ_max), alg.n_exp, prob.p, false, maxiters, internalnorm,
116+
ReturnCode.Default, abstol, reltol, prob, NLStats(1, 0, 0, 0, 0), tc_cache, trace)
115117
end
116118

117119
function perform_step!(cache::DFSaneCache{iip}) where {iip}
118120
@unpack alg, f_norm, σ_n, σ_min, σ_max, α_1, γ, τ_min, τ_max, n_exp, M, prob = cache
119121
T = eltype(cache.u)
120122
f_norm_old = f_norm
121123

122-
# Spectral parameter range check
123-
σ_n = sign(σ_n) * clamp(abs(σ_n), σ_min, σ_max)
124-
125124
# Line search direction
126125
@bb @. cache.du = -σ_n * cache.fu
127126

128-
η = alg.η_strategy(cache.f_norm_0, cache.stats.nsteps, cache.u, cache.fu)
127+
η = alg.η_strategy(cache.f_norm_0, cache.stats.nsteps + 1, cache.u, cache.fu)
129128

130129
f_bar = maximum(cache.history)
131130
α₊ = α_1
132131
α₋ = α_1
133132

134-
@bb axpy!(α₊, cache.du, cache.u)
135-
136-
evaluate_f(cache, cache.u, cache.p)
133+
@bb @. cache.u_cache_2 = cache.u + α₊ * cache.du
134+
evaluate_f(cache, cache.u_cache_2, cache.p)
137135
f_norm = cache.internalnorm(cache.fu)^n_exp
138-
α = α₊
136+
α = -α₊
139137

140138
inner_converged = false
141139
for k in 1:(cache.alg.max_inner_iterations)
142140
if f_norm f_bar + η - γ * α₊^2 * f_norm_old
143-
α = α₊
141+
α = -α₊
144142
inner_converged = true
145143
break
146144
end
147145

148146
α₊ = α₊ * clamp(α₊ * f_norm_old / (f_norm + (T(2) * α₊ - T(1)) * f_norm_old),
149147
τ_min, τ_max)
150-
@bb axpy!(-α₋, cache.du, cache.u)
151-
152-
evaluate_f(cache, cache.u, cache.p)
148+
@bb @. cache.u_cache_2 = cache.u - α₋ * cache.du
149+
evaluate_f(cache, cache.u_cache_2, cache.p)
153150
f_norm = cache.internalnorm(cache.fu)^n_exp
154151

155152
if f_norm f_bar + η - γ * α₋^2 * f_norm_old
@@ -160,9 +157,8 @@ function perform_step!(cache::DFSaneCache{iip}) where {iip}
160157

161158
α₋ = α₋ * clamp(α₋ * f_norm_old / (f_norm + (T(2) * α₋ - T(1)) * f_norm_old),
162159
τ_min, τ_max)
163-
@bb axpy!(α₊, cache.du, cache.u)
164-
165-
evaluate_f(cache, cache.u, cache.p)
160+
@bb @. cache.u_cache_2 = cache.u + α₊ * cache.du
161+
evaluate_f(cache, cache.u_cache_2, cache.p)
166162
f_norm = cache.internalnorm(cache.fu)^n_exp
167163
end
168164

@@ -171,21 +167,20 @@ function perform_step!(cache::DFSaneCache{iip}) where {iip}
171167
cache.force_stop = true
172168
end
173169

170+
@bb copyto!(cache.u, cache.u_cache_2)
171+
174172
update_trace!(cache, α)
175173
check_and_update!(cache, cache.fu, cache.u, cache.u_cache)
176174

177175
# Update spectral parameter
178176
@bb @. cache.u_cache = cache.u - cache.u_cache
179177
@bb @. cache.fu_cache = cache.fu - cache.fu_cache
180178

181-
α₊ = sum(abs2, cache.u_cache)
182-
@bb @. cache.u_cache *= cache.fu_cache
183-
α₋ = sum(cache.u_cache)
184-
cache.σ_n = α₊ / α₋
179+
cache.σ_n = dot(cache.u_cache, cache.u_cache) / dot(cache.fu_cache, cache.u_cache)
185180

186181
# Spectral parameter bounds check
187182
if !(σ_min abs(cache.σ_n) σ_max)
188-
test_norm = sqrt(sum(abs2, cache.fuprev))
183+
test_norm = dot(cache.fu, cache.fu)
189184
cache.σ_n = clamp(inv(test_norm), T(1), T(1e5))
190185
end
191186

@@ -196,7 +191,6 @@ function perform_step!(cache::DFSaneCache{iip}) where {iip}
196191

197192
# Update history
198193
cache.history[cache.stats.nsteps % M + 1] = f_norm
199-
cache.stats.nf += 1
200194
return nothing
201195
end
202196

src/gaussnewton.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ function perform_step!(cache::GaussNewtonCache{iip}) where {iip}
142142
@bb copyto!(cache.u_cache, cache.u)
143143
@bb copyto!(cache.dfu, cache.fu)
144144

145-
cache.stats.nf += 1
146145
cache.stats.njacs += 1
147146
cache.stats.nsolve += 1
148147
cache.stats.nfactors += 1

src/klement.jl

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""
2-
GeneralKlement(; max_resets = 5, linsolve = nothing,
3-
linesearch = nothing, precs = DEFAULT_PRECS)
2+
GeneralKlement(; max_resets = 5, linsolve = nothing, linesearch = nothing,
3+
precs = DEFAULT_PRECS)
44
55
An implementation of `Klement` with line search, preconditioning and customizable linear
66
solves.
@@ -91,8 +91,8 @@ function SciMLBase.__init(prob::NonlinearProblem{uType, iip}, alg_::GeneralKleme
9191
termination_condition)
9292
trace = init_nonlinearsolve_trace(alg, u, fu, J, du; kwargs...)
9393

94-
@bb u_cache = similar(u)
95-
@bb fu_cache = similar(fu)
94+
@bb u_cache = copy(u)
95+
@bb fu_cache = copy(fu)
9696
@bb J_cache = similar(J)
9797
@bb J_cache_2 = similar(J)
9898
@bb Jdu = similar(fu)
@@ -139,7 +139,6 @@ function perform_step!(cache::GeneralKlementCache{iip}) where {iip}
139139

140140
@bb copyto!(cache.u_cache, cache.u)
141141

142-
cache.stats.nf += 1
143142
cache.stats.nsolve += 1
144143
cache.stats.nfactors += 1
145144

@@ -152,8 +151,8 @@ function perform_step!(cache::GeneralKlementCache{iip}) where {iip}
152151
@bb cache.Jdu_cache = cache.J_cache × vec(cache.Jdu)
153152
@bb cache.Jdu = cache.J × vec(cache.du)
154153
@bb @. cache.fu_cache = (cache.fu - cache.fu_cache - cache.Jdu) /
155-
max(cache.Jdu_cache, eps(real(T)))
156-
@bb cache.J_cache = vec(cache.fu) × transpose(_vec(cache.du))
154+
ifelse(iszero(cache.Jdu_cache), T(1e-5), cache.Jdu_cache)
155+
@bb cache.J_cache = vec(cache.fu_cache) × transpose(_vec(cache.du))
157156
@bb @. cache.J_cache *= cache.J
158157
@bb cache.J_cache_2 = cache.J_cache × cache.J
159158
@bb cache.J .+= cache.J_cache_2

src/lbroyden.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ function perform_step!(cache::LimitedMemoryBroydenCache{iip}) where {iip}
125125
ApplyArray(*, Vᵀ_part, U_part), cache.du, α)
126126

127127
check_and_update!(cache, cache.fu, cache.u, cache.u_cache)
128-
cache.stats.nf += 1
129128

130129
cache.force_stop && return nothing
131130

src/levenberg.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,6 @@ function perform_step!(cache::LevenbergMarquardtCache{true, fastls}) where {fast
312312
_vec(cache.δ) .= _vec(v) .+ _vec(cache.a) ./ 2
313313
@unpack δ, loss_old, norm_v_old, v_old, b_uphill = cache
314314
f(cache.fu_tmp, u .+ δ, p)
315-
cache.stats.nf += 1
316315
loss = cache.internalnorm(cache.fu_tmp)
317316

318317
# Condition to accept uphill steps (evaluates to `loss ≤ loss_old` in iteration 1).
@@ -411,7 +410,6 @@ function perform_step!(cache::LevenbergMarquardtCache{false, fastls}) where {fas
411410
cache.δ = _restructure(cache.δ, _vec(v) .+ _vec(cache.a) ./ 2)
412411
@unpack δ, loss_old, norm_v_old, v_old, b_uphill = cache
413412
fu_new = f(u .+ δ, p)
414-
cache.stats.nf += 1
415413
loss = cache.internalnorm(fu_new)
416414

417415
# Condition to accept uphill steps (evaluates to `loss ≤ loss_old` in iteration 1).

src/linesearch.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
LineSearch(method = nothing, autodiff = nothing, alpha = true)
2+
LineSearch(; method = nothing, autodiff = nothing, alpha = true)
33
44
Wrapper over algorithms from
55
[LineSearches.jl](https://github.com/JuliaNLSolvers/LineSearches.jl/). Allows automatic

src/pseudotransient.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,6 @@ function perform_step!(cache::PseudoTransientCache{iip}) where {iip}
145145
check_and_update!(cache, cache.fu, cache.u, cache.u_cache)
146146

147147
@bb copyto!(cache.u_cache, cache.u)
148-
cache.stats.nf += 1
149148
cache.stats.njacs += 1
150149
cache.stats.nsolve += 1
151150
cache.stats.nfactors += 1

src/raphson.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ function perform_step!(cache::NewtonRaphsonCache{iip}) where {iip}
119119
check_and_update!(cache, cache.fu, cache.u, cache.u_cache)
120120

121121
@bb copyto!(cache.u_cache, cache.u)
122-
cache.stats.nf += 1
123122
cache.stats.njacs += 1
124123
cache.stats.nsolve += 1
125124
cache.stats.nfactors += 1

src/trustRegion.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,6 @@ function perform_step!(cache::TrustRegionCache{iip}) where {iip}
376376
@bb @. cache.u_cache_2 = cache.u + cache.du
377377
evaluate_f(cache, cache.u_tmp, cache.p, Val{:fu_cache_2}())
378378
trust_region_step!(cache)
379-
cache.stats.nf += 1
380379
cache.stats.nsolve += 1
381380
cache.stats.nfactors += 1
382381
return nothing

0 commit comments

Comments
 (0)