@@ -163,61 +163,69 @@ end
163
163
164
164
# --- TrustRegion tests ---
165
165
166
- function benchmark_immutable (f, u0)
166
+ function benchmark_immutable (f, u0, radius_update_scheme )
167
167
probN = NonlinearProblem {false} (f, u0)
168
- solver = init (probN, TrustRegion (), abstol = 1e-9 )
168
+ solver = init (probN, TrustRegion (radius_update_scheme = radius_update_scheme ), abstol = 1e-9 )
169
169
sol = solve! (solver)
170
170
end
171
171
172
- function benchmark_mutable (f, u0)
172
+ function benchmark_mutable (f, u0, radius_update_scheme )
173
173
probN = NonlinearProblem {false} (f, u0)
174
- solver = init (probN, TrustRegion (), abstol = 1e-9 )
174
+ solver = init (probN, TrustRegion (radius_update_scheme = radius_update_scheme ), abstol = 1e-9 )
175
175
sol = solve! (solver)
176
176
end
177
177
178
- function benchmark_scalar (f, u0)
178
+ function benchmark_scalar (f, u0, radius_update_scheme )
179
179
probN = NonlinearProblem {false} (f, u0)
180
- sol = (solve (probN, TrustRegion (), abstol = 1e-9 ))
180
+ sol = (solve (probN, TrustRegion (radius_update_scheme = radius_update_scheme ), abstol = 1e-9 ))
181
181
end
182
182
183
- function ff (u, p)
183
+ function ff (u, p= nothing )
184
184
u .* u .- 2
185
185
end
186
186
187
- function sf (u, p)
187
+ function sf (u, p= nothing )
188
188
u * u - 2
189
189
end
190
+
190
191
u0 = [1.0 , 1.0 ]
192
+ radius_update_schemes = [RadiusUpdateSchemes. Simple, RadiusUpdateSchemes. Hei, RadiusUpdateSchemes. Yuan]
191
193
192
- sol = benchmark_immutable (ff, cu0)
193
- @test sol. retcode === ReturnCode. Success
194
- @test all (abs .(sol. u .* sol. u .- 2 ) .< 1e-9 )
195
- sol = benchmark_mutable (ff, u0)
196
- @test sol. retcode === ReturnCode. Success
197
- @test all (abs .(sol. u .* sol. u .- 2 ) .< 1e-9 )
198
- sol = benchmark_scalar (sf, csu0)
199
- @test sol. retcode === ReturnCode. Success
200
- @test abs (sol. u * sol. u - 2 ) < 1e-9
194
+ for radius_update_scheme in radius_update_schemes
195
+ sol = benchmark_immutable (ff, cu0, radius_update_scheme)
196
+ @test sol. retcode === ReturnCode. Success
197
+ @test all (abs .(sol. u .* sol. u .- 2 ) .< 1e-9 )
198
+ sol = benchmark_mutable (ff, u0, radius_update_scheme)
199
+ @test sol. retcode === ReturnCode. Success
200
+ @test all (abs .(sol. u .* sol. u .- 2 ) .< 1e-9 )
201
+ sol = benchmark_scalar (sf, csu0, radius_update_scheme)
202
+ @test sol. retcode === ReturnCode. Success
203
+ @test abs (sol. u * sol. u - 2 ) < 1e-9
204
+ end
201
205
202
- function benchmark_inplace (f, u0)
206
+
207
+ function benchmark_inplace (f, u0, radius_update_scheme)
203
208
probN = NonlinearProblem {true} (f, u0)
204
- solver = init (probN, TrustRegion (), abstol = 1e-9 )
209
+ solver = init (probN, TrustRegion (radius_update_scheme = radius_update_scheme ), abstol = 1e-9 )
205
210
sol = solve! (solver)
206
211
end
207
212
208
- function ffiip (du, u, p)
213
+ function ffiip (du, u, p= nothing )
209
214
du .= u .* u .- 2
210
215
end
211
216
u0 = [1.0 , 1.0 ]
212
217
213
- sol = benchmark_inplace (ffiip, u0)
214
- @test sol. retcode === ReturnCode. Success
215
- @test all (abs .(sol. u .* sol. u .- 2 ) .< 1e-9 )
218
+ for radius_update_scheme in radius_update_schemes
219
+ sol = benchmark_inplace (ffiip, u0, radius_update_scheme)
220
+ @test sol. retcode === ReturnCode. Success
221
+ @test all (abs .(sol. u .* sol. u .- 2 ) .< 1e-9 )
222
+ end
216
223
217
- u0 = [1.0 , 1.0 ]
218
- probN = NonlinearProblem {true} (ffiip, u0)
219
- solver = init (probN, TrustRegion (), abstol = 1e-9 )
220
- @test (@ballocated solve! (solver)) < 200
224
+ for radius_update_scheme in radius_update_schemes
225
+ probN = NonlinearProblem {true} (ffiip, u0)
226
+ solver = init (probN, TrustRegion (radius_update_scheme = radius_update_scheme), abstol = 1e-9 )
227
+ @test (@ballocated solve! (solver)) < 200
228
+ end
221
229
222
230
# AD Tests
223
231
using ForwardDiff
@@ -236,6 +244,29 @@ for p in 1.1:0.1:100.0
236
244
@test ForwardDiff. derivative (g, p) ≈ 1 / (2 * sqrt (p))
237
245
end
238
246
247
+ g = function (p)
248
+ probN = NonlinearProblem {false} (f, csu0, p)
249
+ sol = solve (probN, TrustRegion (radius_update_scheme = RadiusUpdateSchemes. Hei), abstol = 1e-9 )
250
+ return sol. u[end ]
251
+ end
252
+
253
+ for p in 1.1 : 0.1 : 100.0
254
+ @test g (p) ≈ sqrt (p)
255
+ @test ForwardDiff. derivative (g, p) ≈ 1 / (2 * sqrt (p))
256
+ end
257
+
258
+ # # FAIL BECAUSE JVP CANNOT ACCEPT PARAMETERS IN FUNCTIONS
259
+ g = function (p)
260
+ probN = NonlinearProblem {false} (f, csu0, p)
261
+ sol = solve (probN, TrustRegion (radius_update_scheme = RadiusUpdateSchemes. Yuan), abstol = 1e-9 )
262
+ return sol. u[end ]
263
+ end
264
+
265
+ for p in 1.1 : 0.1 : 100.0
266
+ @test g (p) ≈ sqrt (p)
267
+ @test ForwardDiff. derivative (g, p) ≈ 1 / (2 * sqrt (p))
268
+ end
269
+
239
270
# Scalar
240
271
f, u0 = (u, p) -> u * u - p, 1.0
241
272
@@ -252,6 +283,32 @@ for p in 1.1:0.1:100.0
252
283
@test ForwardDiff. derivative (g, p) ≈ 1 / (2 * sqrt (p))
253
284
end
254
285
286
+ g = function (p)
287
+ probN = NonlinearProblem {false} (f, oftype (p, u0), p)
288
+ sol = solve (probN, TrustRegion (radius_update_scheme = RadiusUpdateSchemes. Hei), abstol = 1e-10 )
289
+ return sol. u
290
+ end
291
+
292
+ @test ForwardDiff. derivative (g, 3.0 ) ≈ 1 / (2 * sqrt (3.0 ))
293
+
294
+ for p in 1.1 : 0.1 : 100.0
295
+ @test g (p) ≈ sqrt (p)
296
+ @test ForwardDiff. derivative (g, p) ≈ 1 / (2 * sqrt (p))
297
+ end
298
+
299
+ g = function (p)
300
+ probN = NonlinearProblem {false} (f, oftype (p, u0), p)
301
+ sol = solve (probN, TrustRegion (radius_update_scheme = RadiusUpdateSchemes. Yuan), abstol = 1e-10 )
302
+ return sol. u
303
+ end
304
+
305
+ @test ForwardDiff. derivative (g, 3.0 ) ≈ 1 / (2 * sqrt (3.0 ))
306
+
307
+ for p in 1.1 : 0.1 : 100.0
308
+ @test g (p) ≈ sqrt (p)
309
+ @test ForwardDiff. derivative (g, p) ≈ 1 / (2 * sqrt (p))
310
+ end
311
+
255
312
f = (u, p) -> p[1 ] * u * u - p[2 ]
256
313
t = (p) -> [sqrt (p[2 ] / p[1 ])]
257
314
p = [0.9 , 50.0 ]
263
320
@test gnewton (p) ≈ [sqrt (p[2 ] / p[1 ])]
264
321
@test ForwardDiff. jacobian (gnewton, p) ≈ ForwardDiff. jacobian (t, p)
265
322
323
+ gnewton = function (p)
324
+ probN = NonlinearProblem {false} (f, 0.5 , p)
325
+ sol = solve (probN, TrustRegion (radius_update_scheme = RadiusUpdateSchemes. Hei))
326
+ return [sol. u]
327
+ end
328
+ @test gnewton (p) ≈ [sqrt (p[2 ] / p[1 ])]
329
+ @test ForwardDiff. jacobian (gnewton, p) ≈ ForwardDiff. jacobian (t, p)
330
+
266
331
# Iterator interface
267
332
f = (u, p) -> u * u - p
268
333
g = function (p_range)
@@ -295,12 +360,18 @@ p = range(0.01, 2, length = 200)
295
360
@test g (p) ≈ sqrt .(p)
296
361
297
362
# Error Checks
298
- f, u0 = (u, p) -> u .* u .- 2.0 , @SVector [1.0 , 1.0 ]
363
+ f, u0 = (u, p) -> u .* u .- 2 , @SVector [1.0 , 1.0 ]
299
364
probN = NonlinearProblem (f, u0)
300
365
301
366
@test solve (probN, TrustRegion ()). u[end ] ≈ sqrt (2.0 )
302
367
@test solve (probN, TrustRegion (; autodiff = false )). u[end ] ≈ sqrt (2.0 )
303
368
369
+ @test solve (probN, TrustRegion (radius_update_scheme = RadiusUpdateSchemes. Hei)). u[end ] ≈ sqrt (2.0 )
370
+ @test solve (probN, TrustRegion (; radius_update_scheme = RadiusUpdateSchemes. Hei, autodiff = false )). u[end ] ≈ sqrt (2.0 )
371
+
372
+ @test solve (probN, TrustRegion (radius_update_scheme = RadiusUpdateSchemes. Yuan)). u[end ] ≈ sqrt (2.0 )
373
+ @test solve (probN, TrustRegion (; radius_update_scheme = RadiusUpdateSchemes. Yuan, autodiff = false )). u[end ] ≈ sqrt (2.0 )
374
+
304
375
for u0 in [1.0 , [1 , 1.0 ]]
305
376
local f, probN, sol
306
377
f = (u, p) -> u .* u .- 2.0
0 commit comments