|
1 | | -function init_termination_cache(abstol, reltol, du, u, ::Nothing) |
2 | | - return init_termination_cache( |
3 | | - abstol, reltol, du, u, AbsSafeBestTerminationMode(; max_stalled_steps = 32)) |
| 1 | +function init_termination_cache(prob::NonlinearProblem, abstol, reltol, du, u, ::Nothing) |
| 2 | + return init_termination_cache(prob, abstol, reltol, du, u, |
| 3 | + AbsSafeBestTerminationMode(Base.Fix1(maximum, abs); max_stalled_steps = 32)) |
4 | 4 | end |
5 | | -function init_termination_cache(abstol, reltol, du, u, tc::AbstractNonlinearTerminationMode) |
6 | | - tc_cache = init(du, u, tc; abstol, reltol, use_deprecated_retcodes = Val(false)) |
| 5 | +function init_termination_cache( |
| 6 | + prob::NonlinearLeastSquaresProblem, abstol, reltol, du, u, ::Nothing) |
| 7 | + return init_termination_cache(prob, abstol, reltol, du, u, |
| 8 | + AbsSafeBestTerminationMode(Base.Fix2(norm, 2); max_stalled_steps = 32)) |
| 9 | +end |
| 10 | + |
| 11 | +function init_termination_cache(prob::Union{NonlinearProblem, NonlinearLeastSquaresProblem}, |
| 12 | + abstol, reltol, du, u, tc::AbstractNonlinearTerminationMode) |
| 13 | + tc_ = if hasfield(typeof(tc), :internalnorm) && tc.internalnorm === nothing |
| 14 | + internalnorm = ifelse( |
| 15 | + prob isa NonlinearProblem, Base.Fix1(maximum, abs), Base.Fix2(norm, 2)) |
| 16 | + DiffEqBase.set_termination_mode_internalnorm(tc, internalnorm) |
| 17 | + else |
| 18 | + tc |
| 19 | + end |
| 20 | + tc_cache = init(du, u, tc_; abstol, reltol, use_deprecated_retcodes = Val(false)) |
7 | 21 | return DiffEqBase.get_abstol(tc_cache), DiffEqBase.get_reltol(tc_cache), tc_cache |
8 | 22 | end |
9 | 23 |
|
|
0 commit comments