Skip to content

Commit 91efd8a

Browse files
authored
Merge branch 'master' into ap/step_polyalg
2 parents bd5d988 + 5292a61 commit 91efd8a

File tree

7 files changed

+73
-4
lines changed

7 files changed

+73
-4
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "NonlinearSolve"
22
uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec"
33
authors = ["SciML"]
4-
version = "3.6.1"
4+
version = "3.7.1"
55

66
[deps]
77
ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b"

ext/NonlinearSolveLeastSquaresOptimExt.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ end
2323
kwargs
2424
end
2525

26+
function Base.show(io::IO, cache::LeastSquaresOptimJLCache)
27+
print(io, "LeastSquaresOptimJLCache()")
28+
end
29+
2630
function SciMLBase.reinit!(cache::LeastSquaresOptimJLCache, args...; kwargs...)
2731
error("Reinitialization not supported for LeastSquaresOptimJL.")
2832
end

src/NonlinearSolve.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ include("core/generic.jl")
6666
include("core/approximate_jacobian.jl")
6767
include("core/generalized_first_order.jl")
6868
include("core/spectral_methods.jl")
69+
include("core/noinit.jl")
6970

7071
include("algorithms/raphson.jl")
7172
include("algorithms/pseudo_transient.jl")

src/abstract_types.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,9 @@ get_u(cache::AbstractNonlinearSolveCache) = cache.u
231231
set_fu!(cache::AbstractNonlinearSolveCache, fu) = (cache.fu = fu)
232232
SciMLBase.set_u!(cache::AbstractNonlinearSolveCache, u) = (cache.u = u)
233233

234+
function SciMLBase.reinit!(cache::AbstractNonlinearSolveCache; kwargs...)
235+
return reinit_cache!(cache; kwargs...)
236+
end
234237
function SciMLBase.reinit!(cache::AbstractNonlinearSolveCache, u0; kwargs...)
235238
return reinit_cache!(cache; u0, kwargs...)
236239
end

src/core/noinit.jl

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# Some algorithms don't support creating a cache and doing `solve!`, this unfortunately
2+
# makes it difficult to write generic code that supports caching. For the algorithms that
3+
# don't have a `__init` function defined, we create a "Fake Cache", which just calls
4+
# `__solve` from `solve!`
5+
@concrete mutable struct NonlinearSolveNoInitCache{iip, timeit} <:
6+
AbstractNonlinearSolveCache{iip, timeit}
7+
prob
8+
alg
9+
args
10+
kwargs::Any
11+
end
12+
13+
function SciMLBase.reinit!(
14+
cache::NonlinearSolveNoInitCache, u0 = cache.prob.u0; p = cache.prob.p, kwargs...)
15+
prob = remake(cache.prob; u0, p)
16+
cache.prob = prob
17+
cache.kwargs = merge(cache.kwargs, kwargs)
18+
return cache
19+
end
20+
21+
function Base.show(io::IO, cache::NonlinearSolveNoInitCache)
22+
print(io, "NonlinearSolveNoInitCache(alg = $(cache.alg))")
23+
end
24+
25+
function SciMLBase.__init(prob::AbstractNonlinearProblem{uType, iip},
26+
alg::Union{AbstractNonlinearSolveAlgorithm,
27+
SimpleNonlinearSolve.AbstractSimpleNonlinearSolveAlgorithm},
28+
args...;
29+
maxtime = nothing,
30+
kwargs...) where {uType, iip}
31+
return NonlinearSolveNoInitCache{iip, maxtime !== nothing}(
32+
prob, alg, args, merge((; maxtime), kwargs))
33+
end
34+
35+
function SciMLBase.solve!(cache::NonlinearSolveNoInitCache)
36+
return solve(cache.prob, cache.alg, cache.args...; cache.kwargs...)
37+
end

test/misc/noinit_caching_tests.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
@testitem "NoInit Caching" begin
2+
using LinearAlgebra
3+
import NLsolve, NLSolvers
4+
5+
solvers = [SimpleNewtonRaphson(), SimpleTrustRegion(), SimpleDFSane(), NLsolveJL(),
6+
NLSolversJL(NLSolvers.LineSearch(NLSolvers.Newton(), NLSolvers.Backtracking()))]
7+
8+
prob = NonlinearProblem((u, p) -> u .^ 2 .- p, [0.1, 0.3], 2.0)
9+
10+
for alg in solvers
11+
cache = init(prob, alg)
12+
sol = solve!(cache)
13+
@test SciMLBase.successful_retcode(sol)
14+
@test norm(sol.resid, Inf) 1e-6
15+
16+
reinit!(cache; p = 5.0)
17+
@test cache.prob.p == 5.0
18+
sol = solve!(cache)
19+
@test SciMLBase.successful_retcode(sol)
20+
@test norm(sol.resid, Inf) 1e-6
21+
@test norm(sol.u .^ 2 .- 5.0, Inf) 1e-6
22+
end
23+
end

test/misc/qa_tests.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
@testitem "Aqua" begin
2-
using NonlinearSolve, Aqua
2+
using NonlinearSolve, SimpleNonlinearSolve, Aqua
33

44
Aqua.find_persistent_tasks_deps(NonlinearSolve)
55
Aqua.test_ambiguities(NonlinearSolve; recursive = false)
66
Aqua.test_deps_compat(NonlinearSolve)
7-
Aqua.test_piracies(
8-
NonlinearSolve, treat_as_own = [NonlinearProblem, NonlinearLeastSquaresProblem])
7+
Aqua.test_piracies(NonlinearSolve,
8+
treat_as_own = [NonlinearProblem, NonlinearLeastSquaresProblem,
9+
SimpleNonlinearSolve.AbstractSimpleNonlinearSolveAlgorithm])
910
Aqua.test_project_extras(NonlinearSolve)
1011
# Timer Outputs needs to be enabled via Preferences
1112
Aqua.test_stale_deps(NonlinearSolve; ignore = [:TimerOutputs])

0 commit comments

Comments
 (0)