|
1 |
| -default_nlsolve(alg, isinplace, u, initprob, autodiff = false) = alg |
2 |
| - |
3 |
| -function default_nlsolve( |
4 |
| - ::Nothing, isinplace, u::Nothing, ::NonlinearProblem, autodiff = false) |
5 |
| - nothing |
6 |
| -end |
7 |
| -function default_nlsolve(::Nothing, isinplace, u, ::NonlinearProblem, autodiff = false) |
8 |
| - FastShortcutNonlinearPolyalg(; |
9 |
| - autodiff = autodiff ? AutoForwardDiff() : AutoFiniteDiff()) |
10 |
| -end |
11 |
| -function default_nlsolve(::Nothing, isinplace::Val{false}, u::StaticArray, |
| 1 | +if isdefined(OrdinaryDiffEqCore, :default_nlsolve) |
| 2 | + function OrdinaryDiffEqCore.default_nlsolve(::Nothing, isinplace::Val{true}, u, ::NonlinearProblem, autodiff = false) |
| 3 | + FastShortcutNonlinearPolyalg(; |
| 4 | + autodiff = autodiff ? AutoForwardDiff() : AutoFiniteDiff()) |
| 5 | + end |
| 6 | + function OrdinaryDiffEqCore.default_nlsolve( |
| 7 | + ::Nothing, isinplace::Val{true}, u, ::NonlinearLeastSquaresProblem, autodiff = false) |
| 8 | + FastShortcutNLLSPolyalg(; autodiff = autodiff ? AutoForwardDiff() : AutoFiniteDiff()) |
| 9 | + end |
| 10 | + function OrdinaryDiffEqCore.default_nlsolve(::Nothing, isinplace::Val{false}, u::StaticArray, |
12 | 11 | ::NonlinearProblem, autodiff = false)
|
13 |
| - SimpleTrustRegion(autodiff = autodiff ? AutoForwardDiff() : AutoFiniteDiff()) |
14 |
| -end |
15 |
| - |
16 |
| -function default_nlsolve( |
17 |
| - ::Nothing, isinplace, u::Nothing, ::NonlinearLeastSquaresProblem, autodiff = false) |
18 |
| - nothing |
19 |
| -end |
20 |
| -function default_nlsolve( |
| 12 | + SimpleTrustRegion(autodiff = autodiff ? AutoForwardDiff() : AutoFiniteDiff()) |
| 13 | + end |
| 14 | + function OrdinaryDiffEqCore.default_nlsolve(::Nothing, isinplace::Val{false}, u::StaticArray, |
| 15 | + ::NonlinearLeastSquaresProblem, autodiff = false) |
| 16 | + SimpleGaussNewton(autodiff = autodiff ? AutoForwardDiff() : AutoFiniteDiff()) |
| 17 | + end |
| 18 | +else |
| 19 | + function default_nlsolve(::Nothing, isinplace, u, ::NonlinearProblem, autodiff = false) |
| 20 | + FastShortcutNonlinearPolyalg(; |
| 21 | + autodiff = autodiff ? AutoForwardDiff() : AutoFiniteDiff()) |
| 22 | + end |
| 23 | + function default_nlsolve( |
21 | 24 | ::Nothing, isinplace, u, ::NonlinearLeastSquaresProblem, autodiff = false)
|
22 |
| - FastShortcutNLLSPolyalg(; autodiff = autodiff ? AutoForwardDiff() : AutoFiniteDiff()) |
23 |
| -end |
24 |
| -function default_nlsolve(::Nothing, isinplace::Val{false}, u::StaticArray, |
25 |
| - ::NonlinearLeastSquaresProblem, autodiff = false) |
26 |
| - SimpleGaussNewton(autodiff = autodiff ? AutoForwardDiff() : AutoFiniteDiff()) |
27 |
| -end |
28 |
| - |
29 |
| -## OverrideInit |
30 |
| - |
31 |
| -function _initialize_dae!(integrator, prob::Union{ODEProblem, DAEProblem}, |
32 |
| - alg::OverrideInit, isinplace::Union{Val{true}, Val{false}}) |
33 |
| - initializeprob = prob.f.initializeprob |
34 |
| - |
35 |
| - # If it doesn't have autodiff, assume it comes from symbolic system like ModelingToolkit |
36 |
| - # Since then it's the case of not a DAE but has initializeprob |
37 |
| - # In which case, it should be differentiable |
38 |
| - isAD = if initializeprob.u0 === nothing |
39 |
| - AutoForwardDiff |
40 |
| - elseif has_autodiff(integrator.alg) |
41 |
| - alg_autodiff(integrator.alg) isa AutoForwardDiff |
42 |
| - else |
43 |
| - true |
| 25 | + FastShortcutNLLSPolyalg(; autodiff = autodiff ? AutoForwardDiff() : AutoFiniteDiff()) |
44 | 26 | end
|
45 |
| - |
46 |
| - alg = default_nlsolve(alg.nlsolve, isinplace, initializeprob.u0, initializeprob, isAD) |
47 |
| - nlsol = solve(initializeprob, alg) |
48 |
| - if isinplace === Val{true}() |
49 |
| - integrator.u .= prob.f.initializeprobmap(nlsol) |
50 |
| - elseif isinplace === Val{false}() |
51 |
| - integrator.u = prob.f.initializeprobmap(nlsol) |
52 |
| - else |
53 |
| - error("Unreachable reached. Report this error.") |
| 27 | + function default_nlsolve(::Nothing, isinplace::Val{false}, u::StaticArray, |
| 28 | + ::NonlinearProblem, autodiff = false) |
| 29 | + SimpleTrustRegion(autodiff = autodiff ? AutoForwardDiff() : AutoFiniteDiff()) |
54 | 30 | end
|
55 |
| - |
56 |
| - if nlsol.retcode != ReturnCode.Success |
57 |
| - integrator.sol = SciMLBase.solution_new_retcode(integrator.sol, |
58 |
| - ReturnCode.InitialFailure) |
| 31 | + function default_nlsolve(::Nothing, isinplace::Val{false}, u::StaticArray, |
| 32 | + ::NonlinearLeastSquaresProblem, autodiff = false) |
| 33 | + SimpleGaussNewton(autodiff = autodiff ? AutoForwardDiff() : AutoFiniteDiff()) |
59 | 34 | end
|
60 | 35 | end
|
61 | 36 |
|
|
0 commit comments