Skip to content

Commit c35f0f4

Browse files
authored
refactor: migrate to LineSearch.jl (#461)
* refactor: migrate to LineSearch.jl * fix: forward reinit_cache to SciMLBase.reinit * fix: remaining tests from the migration * chore: bump min versions * fix: final set of bumps * fix: stop using deprecated API in default solvers * docs: fix references
1 parent f1969a2 commit c35f0f4

18 files changed

+105
-514
lines changed

Project.toml

Lines changed: 5 additions & 3 deletions
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.15.0-DEV"
4+
version = "3.15.0"
55

66
[deps]
77
ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b"
@@ -14,6 +14,7 @@ FastClosures = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a"
1414
FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41"
1515
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
1616
LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02"
17+
LineSearch = "87fe0de2-c867-4266-b59a-2f0a94fc965b"
1718
LineSearches = "d3d80556-e9d4-5f37-9878-2ab0fcc64255"
1819
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1920
LinearSolve = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae"
@@ -79,11 +80,12 @@ Hwloc = "3"
7980
InteractiveUtils = "<0.0.1, 1"
8081
LazyArrays = "1.8.2, 2"
8182
LeastSquaresOptim = "0.8.5"
82-
LineSearches = "7.2"
83+
LineSearch = "0.1.2"
84+
LineSearches = "7.3"
8385
LinearAlgebra = "1.10"
8486
LinearSolve = "2.35"
8587
MINPACK = "1.2"
86-
MaybeInplace = "0.1.3"
88+
MaybeInplace = "0.1.4"
8789
ModelingToolkit = "9.41.0"
8890
NLSolvers = "0.5"
8991
NLsolve = "4.5"

docs/make.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@ bib = CitationBibliography(joinpath(@__DIR__, "src", "refs.bib"))
1414

1515
interlinks = InterLinks(
1616
"ADTypes" => "https://sciml.github.io/ADTypes.jl/stable/",
17+
"LineSearch" => "https://sciml.github.io/LineSearch.jl/dev/"
1718
)
1819

19-
makedocs(; sitename = "NonlinearSolve.jl",
20+
makedocs(;
21+
sitename = "NonlinearSolve.jl",
2022
authors = "Chris Rackauckas",
2123
modules = [NonlinearSolve, SimpleNonlinearSolve, SteadyStateDiffEq,
2224
Sundials, DiffEqBase, SciMLBase, SciMLJacobianOperators],
@@ -30,6 +32,7 @@ makedocs(; sitename = "NonlinearSolve.jl",
3032
plugins = [bib, interlinks],
3133
format = Documenter.HTML(assets = ["assets/favicon.ico", "assets/citations.css"],
3234
canonical = "https://docs.sciml.ai/NonlinearSolve/stable/"),
33-
pages)
35+
pages
36+
)
3437

3538
deploydocs(repo = "github.com/SciML/NonlinearSolve.jl.git"; push_preview = true)

docs/src/devdocs/internal_interfaces.md

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,6 @@ NonlinearSolve.AbstractDampingFunction
3838
NonlinearSolve.AbstractDampingFunctionCache
3939
```
4040

41-
## Line Search
42-
43-
```@docs
44-
NonlinearSolve.AbstractNonlinearSolveLineSearchAlgorithm
45-
NonlinearSolve.AbstractNonlinearSolveLineSearchCache
46-
```
47-
4841
## Trust Region
4942

5043
```@docs

docs/src/native/globalization.md

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,9 @@ Pages = ["globalization.md"]
88

99
## [Line Search Algorithms](@id line-search)
1010

11-
```@docs
12-
LiFukushimaLineSearch
13-
LineSearchesJL
14-
RobustNonMonotoneLineSearch
15-
NoLineSearch
16-
```
11+
Line Searches have been moved to an external package. Take a look at the
12+
[LineSearch.jl](https://github.com/SciML/LineSearch.jl) package and its
13+
[documentation](https://sciml.github.io/LineSearch.jl/dev/).
1714

1815
## Radius Update Schemes for Trust Region
1916

docs/src/native/solvers.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ documentation.
2222
preconditioners. For more information on specifying preconditioners for LinearSolve
2323
algorithms, consult the
2424
[LinearSolve.jl documentation](https://docs.sciml.ai/LinearSolve/stable/).
25-
- `linesearch`: the line search algorithm to use. Defaults to [`NoLineSearch()`](@ref),
25+
- `linesearch`: the line search algorithm to use. Defaults to [`NoLineSearch()`](@extref LineSearch.NoLineSearch),
2626
which means that no line search is performed. Algorithms from
2727
[`LineSearches.jl`](https://github.com/JuliaNLSolvers/LineSearches.jl/) must be
2828
wrapped in [`LineSearchesJL`](@ref) before being supplied. For a detailed documentation

src/NonlinearSolve.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ using LazyArrays: LazyArrays, ApplyArray, cache
2222
using LinearAlgebra: LinearAlgebra, ColumnNorm, Diagonal, I, LowerTriangular, Symmetric,
2323
UpperTriangular, axpy!, cond, diag, diagind, dot, issuccess, istril,
2424
istriu, lu, mul!, norm, pinv, tril!, triu!
25+
using LineSearch: LineSearch, AbstractLineSearchAlgorithm, AbstractLineSearchCache,
26+
NoLineSearch, RobustNonMonotoneLineSearch
2527
using LineSearches: LineSearches
2628
using LinearSolve: LinearSolve, LUFactorization, QRFactorization,
2729
needs_concrete_A, AbstractFactorization,
@@ -172,8 +174,9 @@ export NewtonDescent, SteepestDescent, Dogleg, DampedNewtonDescent, GeodesicAcce
172174

173175
# Globalization
174176
## Line Search Algorithms
175-
export LineSearchesJL, NoLineSearch, RobustNonMonotoneLineSearch, LiFukushimaLineSearch
176-
export Static, HagerZhang, MoreThuente, StrongWolfe, BackTracking
177+
export LineSearchesJL, LiFukushimaLineSearch # FIXME: deprecated. use LineSearch.jl directly
178+
export Static, HagerZhang, MoreThuente, StrongWolfe, BackTracking # FIXME: deprecated
179+
export NoLineSearch, RobustNonMonotoneLineSearch
177180
## Trust Region Algorithms
178181
export RadiusUpdateSchemes
179182

src/abstract_types.jl

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -106,22 +106,6 @@ function last_step_accepted(cache::AbstractDescentCache)
106106
return true
107107
end
108108

109-
"""
110-
AbstractNonlinearSolveLineSearchAlgorithm
111-
112-
Abstract Type for all Line Search Algorithms used in NonlinearSolve.jl.
113-
114-
### `__internal_init` specification
115-
116-
```julia
117-
__internal_init(
118-
prob::AbstractNonlinearProblem, alg::AbstractNonlinearSolveLineSearchAlgorithm, f::F,
119-
fu, u, p, args...; internalnorm::IN = DEFAULT_NORM, kwargs...) where {F, IN} -->
120-
AbstractNonlinearSolveLineSearchCache
121-
```
122-
"""
123-
abstract type AbstractNonlinearSolveLineSearchAlgorithm end
124-
125109
"""
126110
AbstractNonlinearSolveLineSearchCache
127111
@@ -512,9 +496,9 @@ SciMLBase.isinplace(::AbstractNonlinearSolveJacobianCache{iip}) where {iip} = ii
512496
abstract type AbstractNonlinearSolveTraceLevel end
513497

514498
# Default Printing
515-
for aType in (AbstractTrustRegionMethod, AbstractNonlinearSolveLineSearchAlgorithm,
516-
AbstractResetCondition, AbstractApproximateJacobianUpdateRule,
517-
AbstractDampingFunction, AbstractNonlinearSolveExtensionAlgorithm)
499+
for aType in (AbstractTrustRegionMethod, AbstractResetCondition,
500+
AbstractApproximateJacobianUpdateRule, AbstractDampingFunction,
501+
AbstractNonlinearSolveExtensionAlgorithm)
518502
@eval function Base.show(io::IO, alg::$(aType))
519503
print(io, "$(nameof(typeof(alg)))()")
520504
end

src/algorithms/klement.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ over this.
2727
function Klement(; max_resets::Int = 100, linsolve = nothing, alpha = nothing,
2828
linesearch = NoLineSearch(), precs = DEFAULT_PRECS,
2929
autodiff = nothing, init_jacobian::Val{IJ} = Val(:identity)) where {IJ}
30-
if !(linesearch isa AbstractNonlinearSolveLineSearchAlgorithm)
30+
if !(linesearch isa AbstractLineSearchAlgorithm)
3131
Base.depwarn(
3232
"Passing in a `LineSearches.jl` algorithm directly is deprecated. \
3333
Please use `LineSearchesJL` instead.", :Klement)

src/algorithms/pseudo_transient.jl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
"""
22
PseudoTransient(; concrete_jac = nothing, linsolve = nothing,
3-
linesearch::AbstractNonlinearSolveLineSearchAlgorithm = NoLineSearch(),
4-
precs = DEFAULT_PRECS, autodiff = nothing)
3+
linesearch = NoLineSearch(), precs = DEFAULT_PRECS, autodiff = nothing)
54
65
An implementation of PseudoTransient Method [coffey2003pseudotransient](@cite) that is used
76
to solve steady state problems in an accelerated manner. It uses an adaptive time-stepping
@@ -16,8 +15,8 @@ This implementation specifically uses "switched evolution relaxation"
1615
you are going to need more iterations to converge but it can be more stable.
1716
"""
1817
function PseudoTransient(; concrete_jac = nothing, linsolve = nothing,
19-
linesearch::AbstractNonlinearSolveLineSearchAlgorithm = NoLineSearch(),
20-
precs = DEFAULT_PRECS, autodiff = nothing, alpha_initial = 1e-3)
18+
linesearch = NoLineSearch(), precs = DEFAULT_PRECS, autodiff = nothing,
19+
alpha_initial = 1e-3)
2120
descent = DampedNewtonDescent(; linsolve, precs, initial_damping = alpha_initial,
2221
damping_fn = SwitchedEvolutionRelaxation())
2322
return GeneralizedFirstOrderAlgorithm(;

src/core/approximate_jacobian.jl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ function ApproximateJacobianSolveAlgorithm{concrete_jac, name}(;
5959
linesearch = missing, trustregion = missing, descent, update_rule,
6060
reinit_rule, initialization, max_resets::Int = typemax(Int),
6161
max_shrink_times::Int = typemax(Int)) where {concrete_jac, name}
62-
if linesearch !== missing && !(linesearch isa AbstractNonlinearSolveLineSearchAlgorithm)
62+
if linesearch !== missing && !(linesearch isa AbstractLineSearchAlgorithm)
6363
Base.depwarn("Passing in a `LineSearches.jl` algorithm directly is deprecated. \
6464
Please use `LineSearchesJL` instead.",
6565
:GeneralizedFirstOrderAlgorithm)
@@ -199,8 +199,8 @@ function SciMLBase.__init(
199199
if alg.linesearch !== missing
200200
supports_line_search(alg.descent) || error("Line Search not supported by \
201201
$(alg.descent).")
202-
linesearch_cache = __internal_init(
203-
prob, alg.linesearch, f, fu, u, p; stats, internalnorm, kwargs...)
202+
linesearch_cache = init(
203+
prob, alg.linesearch, fu, u; stats, internalnorm, kwargs...)
204204
GB = :LineSearch
205205
end
206206

@@ -317,7 +317,9 @@ function __step!(cache::ApproximateJacobianSolveCache{INV, GB, iip};
317317
if descent_result.success
318318
if GB === :LineSearch
319319
@static_timeit cache.timer "linesearch" begin
320-
needs_reset, α = __internal_solve!(cache.linesearch_cache, cache.u, δu)
320+
linesearch_sol = solve!(cache.linesearch_cache, cache.u, δu)
321+
needs_reset = !SciMLBase.successful_retcode(linesearch_sol.retcode)
322+
α = linesearch_sol.step_size
321323
end
322324
if needs_reset && cache.steps_since_last_reset > 5 # Reset after a burn-in period
323325
cache.force_reinit = true

0 commit comments

Comments
 (0)