11using SimpleNonlinearSolve
22using StaticArrays
33using BenchmarkTools
4+ using DiffEqBase
45using Test
56
7+ const BATCHED_BROYDEN_SOLVERS = Broyden[]
8+ const BROYDEN_SOLVERS = Broyden[]
9+
10+ for mode in instances (NLSolveTerminationMode. T)
11+ if mode ∈
12+ (NLSolveTerminationMode. SteadyStateDefault, NLSolveTerminationMode. RelSafeBest,
13+ NLSolveTerminationMode. AbsSafeBest)
14+ continue
15+ end
16+
17+ termination_condition = NLSolveTerminationCondition (mode; abstol = nothing ,
18+ reltol = nothing )
19+ push! (BROYDEN_SOLVERS, Broyden (; batched = false , termination_condition))
20+ push! (BATCHED_BROYDEN_SOLVERS, Broyden (; batched = true , termination_condition))
21+ end
22+
623# SimpleNewtonRaphson
724function benchmark_scalar (f, u0)
825 probN = NonlinearProblem {false} (f, u0)
@@ -27,16 +44,19 @@ if VERSION >= v"1.7"
2744end
2845
2946# Broyden
30- function benchmark_scalar (f, u0)
47+ function benchmark_scalar (f, u0, alg )
3148 probN = NonlinearProblem {false} (f, u0)
32- sol = (solve (probN, Broyden () ))
49+ sol = (solve (probN, alg ))
3350end
3451
35- sol = benchmark_scalar (sf, csu0)
36- @test sol. retcode === ReturnCode. Success
37- @test sol. u * sol. u - 2 < 1e-9
38- if VERSION >= v " 1.7"
39- @test (@ballocated benchmark_scalar (sf, csu0)) == 0
52+ for alg in BROYDEN_SOLVERS
53+ sol = benchmark_scalar (sf, csu0, alg)
54+ @test sol. retcode === ReturnCode. Success
55+ @test sol. u * sol. u - 2 < 1e-9
56+ # FIXME : Termination Condition Implementation is allocating. Not sure how to fix it.
57+ # if VERSION >= v"1.7"
58+ # @test (@ballocated benchmark_scalar($sf, $csu0, $termination_condition)) == 0
59+ # end
4060end
4161
4262# Klement
@@ -78,8 +98,8 @@ using ForwardDiff
7898# Immutable
7999f, u0 = (u, p) -> u .* u .- p, @SVector [1.0 , 1.0 ]
80100
81- for alg in (SimpleNewtonRaphson (), Broyden (), LBroyden (), Klement (), SimpleTrustRegion (),
82- SimpleDFSane ())
101+ for alg in (SimpleNewtonRaphson (), LBroyden (), Klement (), SimpleTrustRegion (),
102+ SimpleDFSane (), BROYDEN_SOLVERS ... )
83103 g = function (p)
84104 probN = NonlinearProblem {false} (f, csu0, p)
85105 sol = solve (probN, alg, abstol = 1e-9 )
94114
95115# Scalar
96116f, u0 = (u, p) -> u * u - p, 1.0
97- for alg in (SimpleNewtonRaphson (), Broyden (), LBroyden (), Klement (), SimpleTrustRegion (),
98- SimpleDFSane ())
117+ for alg in (SimpleNewtonRaphson (), LBroyden (), Klement (), SimpleTrustRegion (),
118+ SimpleDFSane (), BROYDEN_SOLVERS ... )
99119 g = function (p)
100120 probN = NonlinearProblem {false} (f, oftype (p, u0), p)
101121 sol = solve (probN, alg)
@@ -160,8 +180,8 @@ for alg in [Bisection(), Falsi(), Ridder(), Brent()]
160180 @test ForwardDiff. jacobian (g, p) ≈ ForwardDiff. jacobian (t, p)
161181end
162182
163- for alg in (SimpleNewtonRaphson (), Broyden (), LBroyden (), Klement (), SimpleTrustRegion (),
164- SimpleDFSane ())
183+ for alg in (SimpleNewtonRaphson (), LBroyden (), Klement (), SimpleTrustRegion (),
184+ SimpleDFSane (), BROYDEN_SOLVERS ... )
165185 global g, p
166186 g = function (p)
167187 probN = NonlinearProblem {false} (f, 0.5 , p)
@@ -176,33 +196,32 @@ end
176196f, u0 = (u, p) -> u .* u .- 2.0 , @SVector [1.0 , 1.0 ]
177197probN = NonlinearProblem (f, u0)
178198
179- @test solve (probN, SimpleNewtonRaphson ()). u[end ] ≈ sqrt (2.0 )
180- @test solve (probN, SimpleNewtonRaphson (; autodiff = false )). u[end ] ≈ sqrt (2.0 )
181- @test solve (probN, SimpleTrustRegion ()). u[end ] ≈ sqrt (2.0 )
182- @test solve (probN, SimpleTrustRegion (; autodiff = false )). u[end ] ≈ sqrt (2.0 )
183- @test solve (probN, Broyden ()). u[end ] ≈ sqrt (2.0 )
184- @test solve (probN, LBroyden ()). u[end ] ≈ sqrt (2.0 )
185- @test solve (probN, Klement ()). u[end ] ≈ sqrt (2.0 )
186- @test solve (probN, SimpleDFSane ()). u[end ] ≈ sqrt (2.0 )
199+ for alg in (SimpleNewtonRaphson (), SimpleNewtonRaphson (; autodiff = false ),
200+ SimpleTrustRegion (),
201+ SimpleTrustRegion (; autodiff = false ), LBroyden (), Klement (), SimpleDFSane (),
202+ BROYDEN_SOLVERS... )
203+ sol = solve (probN, alg)
204+
205+ @test sol. retcode == ReturnCode. Success
206+ @test sol. u[end ] ≈ sqrt (2.0 )
207+ end
187208
188209for u0 in [1.0 , [1 , 1.0 ]]
189210 local f, probN, sol
190211 f = (u, p) -> u .* u .- 2.0
191212 probN = NonlinearProblem (f, u0)
192213 sol = sqrt (2 ) * u0
193214
194- @test solve (probN, SimpleNewtonRaphson ()). u ≈ sol
195- @test solve (probN, SimpleNewtonRaphson ()). u ≈ sol
196- @test solve (probN, SimpleNewtonRaphson (; autodiff = false )). u ≈ sol
197-
198- @test solve (probN, SimpleTrustRegion ()). u ≈ sol
199- @test solve (probN, SimpleTrustRegion ()). u ≈ sol
200- @test solve (probN, SimpleTrustRegion (; autodiff = false )). u ≈ sol
215+ for alg in (SimpleNewtonRaphson (), SimpleNewtonRaphson (; autodiff = false ),
216+ SimpleTrustRegion (),
217+ SimpleTrustRegion (; autodiff = false ), LBroyden (), Klement (),
218+ SimpleDFSane (),
219+ BROYDEN_SOLVERS... )
220+ sol2 = solve (probN, alg)
201221
202- @test solve (probN, Broyden ()). u ≈ sol
203- @test solve (probN, LBroyden ()). u ≈ sol
204- @test solve (probN, Klement ()). u ≈ sol
205- @test solve (probN, SimpleDFSane ()). u ≈ sol
222+ @test sol2. retcode == ReturnCode. Success
223+ @test sol2. u ≈ sol
224+ end
206225end
207226
208227# Bisection Tests
@@ -382,3 +401,10 @@ probN = NonlinearProblem{false}(f, u0, p);
382401sol = solve (probN, Broyden (batched = true ))
383402
384403@test abs .(sol. u) ≈ sqrt .(p)
404+
405+ for alg in BATCHED_BROYDEN_SOLVERS
406+ sol = solve (probN, alg)
407+
408+ @test sol. retcode == ReturnCode. Success
409+ @test abs .(sol. u) ≈ sqrt .(p)
410+ end
0 commit comments