Skip to content

Commit ac6c3dc

Browse files
refactor: format
1 parent f66af4e commit ac6c3dc

File tree

5 files changed

+88
-54
lines changed

5 files changed

+88
-54
lines changed

lib/NonlinearSolveHomotopyContinuation/src/NonlinearSolveHomotopyContinuation.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ specified using ADTypes.jl.
4545
HomotopyContinuation.jl requires the taylor series of the polynomial system for the single
4646
root method. This is automatically computed using TaylorSeries.jl.
4747
"""
48-
@concrete struct HomotopyContinuationJL{AllRoots} <: NonlinearSolveBase.AbstractNonlinearSolveAlgorithm
48+
@concrete struct HomotopyContinuationJL{AllRoots} <:
49+
NonlinearSolveBase.AbstractNonlinearSolveAlgorithm
4950
autodiff
5051
kwargs
5152
end

lib/NonlinearSolveHomotopyContinuation/src/interface_types.jl

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,26 @@ regardless of the signature of ``f``.
1818
f
1919
end
2020

21-
function (cjw::ComplexJacobianWrapper{Inplace})(u::AbstractVector{T}, x::AbstractVector{T}, p) where {T}
21+
function (cjw::ComplexJacobianWrapper{Inplace})(
22+
u::AbstractVector{T}, x::AbstractVector{T}, p) where {T}
2223
x = reinterpret(Complex{T}, x)
2324
u = reinterpret(Complex{T}, u)
2425
cjw.f(u, x, p)
2526
u = parent(u)
2627
return u
2728
end
2829

29-
function (cjw::ComplexJacobianWrapper{OutOfPlace})(u::AbstractVector{T}, x::AbstractVector{T}, p) where {T}
30+
function (cjw::ComplexJacobianWrapper{OutOfPlace})(
31+
u::AbstractVector{T}, x::AbstractVector{T}, p) where {T}
3032
x = reinterpret(Complex{T}, x)
3133
u_tmp = cjw.f(x, p)
3234
u_tmp = reinterpret(T, u_tmp)
3335
copyto!(u, u_tmp)
3436
return u
3537
end
3638

37-
function (cjw::ComplexJacobianWrapper{Scalar})(u::AbstractVector{T}, x::AbstractVector{T}, p) where {T}
39+
function (cjw::ComplexJacobianWrapper{Scalar})(
40+
u::AbstractVector{T}, x::AbstractVector{T}, p) where {T}
3841
x = reinterpret(Complex{T}, x)
3942
u_tmp = cjw.f(x[1], p)
4043
u[1] = real(u_tmp)
@@ -52,7 +55,8 @@ polynomial systems specified using `NonlinearProblem`.
5255
5356
$(FIELDS)
5457
"""
55-
@concrete struct HomotopySystemWrapper{variant <: HomotopySystemVariant} <: HC.AbstractSystem
58+
@concrete struct HomotopySystemWrapper{variant <: HomotopySystemVariant} <:
59+
HC.AbstractSystem
5660
"""
5761
The wrapped polynomial function.
5862
"""
@@ -107,14 +111,16 @@ function HC.ModelKit.evaluate!(u, sys::HomotopySystemWrapper{Scalar}, x, p = not
107111
return u
108112
end
109113

110-
function HC.ModelKit.evaluate_and_jacobian!(u, U, sys::HomotopySystemWrapper{Inplace}, x, p = nothing)
114+
function HC.ModelKit.evaluate_and_jacobian!(
115+
u, U, sys::HomotopySystemWrapper{Inplace}, x, p = nothing)
111116
p = sys.p
112117
sys.f(u, x, p)
113118
sys.jac(U, x, p)
114119
return u, U
115120
end
116121

117-
function HC.ModelKit.evaluate_and_jacobian!(u, U, sys::HomotopySystemWrapper{OutOfPlace}, x, p = nothing)
122+
function HC.ModelKit.evaluate_and_jacobian!(
123+
u, U, sys::HomotopySystemWrapper{OutOfPlace}, x, p = nothing)
118124
p = sys.p
119125
u_tmp = sys.f(x, p)
120126
copyto!(u, u_tmp)
@@ -123,15 +129,18 @@ function HC.ModelKit.evaluate_and_jacobian!(u, U, sys::HomotopySystemWrapper{Out
123129
return u, U
124130
end
125131

126-
function HC.ModelKit.evaluate_and_jacobian!(u, U, sys::HomotopySystemWrapper{Scalar}, x, p = nothing)
132+
function HC.ModelKit.evaluate_and_jacobian!(
133+
u, U, sys::HomotopySystemWrapper{Scalar}, x, p = nothing)
127134
p = sys.p
128135
u[1] = sys.f(x[1], p)
129136
U[1] = sys.jac(x[1], p)
130137
return u, U
131138
end
132139

133140
for V in (Inplace, OutOfPlace, Scalar)
134-
@eval function HC.ModelKit.evaluate_and_jacobian!(u, U, sys::HomotopySystemWrapper{$V, F, J}, x, p = nothing) where {F, J <: ComplexJacobianWrapper}
141+
@eval function HC.ModelKit.evaluate_and_jacobian!(
142+
u, U, sys::HomotopySystemWrapper{$V, F, J}, x,
143+
p = nothing) where {F, J <: ComplexJacobianWrapper}
135144
p = sys.p
136145
U_tmp = sys.jacobian_buffers
137146
x = reinterpret(Float64, x)
@@ -151,9 +160,10 @@ for V in (Inplace, OutOfPlace, Scalar)
151160
end
152161
end
153162

154-
function update_taylorvars_from_taylorvector!(vars, x::HC.ModelKit.TaylorVector{M}) where {M}
163+
function update_taylorvars_from_taylorvector!(
164+
vars, x::HC.ModelKit.TaylorVector{M}) where {M}
155165
for i in eachindex(vars)
156-
for j in 0:M-1
166+
for j in 0:(M - 1)
157167
vars[i][j] = x[i, j + 1]
158168
end
159169
for j in M:4
@@ -171,19 +181,22 @@ function update_taylorvars_from_taylorvector!(vars, x::AbstractVector)
171181
end
172182
end
173183

174-
function update_maybe_taylorvector_from_taylorvars!(u::Vector, vars, buffer, ::Val{N}) where {N}
184+
function update_maybe_taylorvector_from_taylorvars!(
185+
u::Vector, vars, buffer, ::Val{N}) where {N}
175186
for i in eachindex(vars)
176187
u[i] = buffer[i][N]
177188
end
178189
end
179190

180-
function update_maybe_taylorvector_from_taylorvars!(u::HC.ModelKit.TaylorVector, vars, buffer, ::Val{N}) where {N}
191+
function update_maybe_taylorvector_from_taylorvars!(
192+
u::HC.ModelKit.TaylorVector, vars, buffer, ::Val{N}) where {N}
181193
for i in eachindex(vars)
182194
u[i] = ntuple(j -> buffer[i][j - 1], Val(N + 1))
183195
end
184196
end
185197

186-
function HC.ModelKit.taylor!(u::AbstractVector, ::Val{N}, sys::HomotopySystemWrapper{Inplace}, x, p = nothing) where {N}
198+
function HC.ModelKit.taylor!(u::AbstractVector, ::Val{N},
199+
sys::HomotopySystemWrapper{Inplace}, x, p = nothing) where {N}
187200
f = sys.f
188201
p = sys.p
189202
buffer, vars = sys.taylorvars
@@ -193,7 +206,8 @@ function HC.ModelKit.taylor!(u::AbstractVector, ::Val{N}, sys::HomotopySystemWra
193206
return u
194207
end
195208

196-
function HC.ModelKit.taylor!(u::AbstractVector, ::Val{N}, sys::HomotopySystemWrapper{OutOfPlace}, x, p = nothing) where {N}
209+
function HC.ModelKit.taylor!(u::AbstractVector, ::Val{N},
210+
sys::HomotopySystemWrapper{OutOfPlace}, x, p = nothing) where {N}
197211
f = sys.f
198212
p = sys.p
199213
vars = sys.taylorvars
@@ -203,7 +217,8 @@ function HC.ModelKit.taylor!(u::AbstractVector, ::Val{N}, sys::HomotopySystemWra
203217
return u
204218
end
205219

206-
function HC.ModelKit.taylor!(u::AbstractVector, ::Val{N}, sys::HomotopySystemWrapper{Scalar}, x, p = nothing) where {N}
220+
function HC.ModelKit.taylor!(u::AbstractVector, ::Val{N},
221+
sys::HomotopySystemWrapper{Scalar}, x, p = nothing) where {N}
207222
f = sys.f
208223
p = sys.p
209224
var = sys.taylorvars
@@ -270,8 +285,10 @@ function HC.ModelKit.evaluate_and_jacobian!(u, U, h::GuessHomotopy, x, t, p = no
270285
return u, U
271286
end
272287

273-
HC.ModelKit.taylor!(u, v::Val{N}, H::GuessHomotopy, tx, t, incremental::Bool) where {N} =
288+
function HC.ModelKit.taylor!(
289+
u, v::Val{N}, H::GuessHomotopy, tx, t, incremental::Bool) where {N}
274290
HC.ModelKit.taylor!(u, v, H, tx, t)
291+
end
275292

276293
function HC.ModelKit.taylor!(u, ::Val{N}, h::GuessHomotopy, x, t, p = nothing) where {N}
277294
HC.ModelKit.taylor!(h.taylorbuffer, Val(N), h.sys, x, p)

lib/NonlinearSolveHomotopyContinuation/src/solve.jl

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
Create and return the appropriate `HomotopySystemWrapper` to use for solving the given
55
`prob` with `alg`.
66
"""
7-
function homotopy_continuation_preprocessing(prob::NonlinearProblem, alg::HomotopyContinuationJL)
7+
function homotopy_continuation_preprocessing(
8+
prob::NonlinearProblem, alg::HomotopyContinuationJL)
89
# cast to a `HomotopyNonlinearFunction`
910
f = if prob.f isa HomotopyNonlinearFunction
1011
prob.f
@@ -45,7 +46,8 @@ function homotopy_continuation_preprocessing(prob::NonlinearProblem, alg::Homoto
4546
taylorvars = if isscalar
4647
Taylor1(zeros(ComplexF64, 5), 4)
4748
elseif iip
48-
([Taylor1(zeros(ComplexF64, 5), 4) for _ in u0], [Taylor1(zeros(ComplexF64, 5), 4) for _ in u0])
49+
([Taylor1(zeros(ComplexF64, 5), 4) for _ in u0],
50+
[Taylor1(zeros(ComplexF64, 5), 4) for _ in u0])
4951
else
5052
[Taylor1(zeros(ComplexF64, 5), 4) for _ in u0]
5153
end
@@ -57,12 +59,14 @@ function homotopy_continuation_preprocessing(prob::NonlinearProblem, alg::Homoto
5759
end
5860

5961
# HC-compatible system
60-
hcsys = HomotopySystemWrapper{variant}(f.f.f, jac, p, alg.autodiff, prep, vars, taylorvars, jacobian_buffers)
62+
hcsys = HomotopySystemWrapper{variant}(
63+
f.f.f, jac, p, alg.autodiff, prep, vars, taylorvars, jacobian_buffers)
6164

6265
return f, hcsys
6366
end
6467

65-
function CommonSolve.solve(prob::NonlinearProblem, alg::HomotopyContinuationJL{true}; denominator_abstol = 1e-7, kwargs...)
68+
function CommonSolve.solve(prob::NonlinearProblem, alg::HomotopyContinuationJL{true};
69+
denominator_abstol = 1e-7, kwargs...)
6670
f, hcsys = homotopy_continuation_preprocessing(prob, alg)
6771

6872
u0 = state_values(prob)
@@ -110,7 +114,8 @@ function CommonSolve.solve(prob::NonlinearProblem, alg::HomotopyContinuationJL{t
110114
return SciMLBase.EnsembleSolution(nlsols, 0.0, true, nothing)
111115
end
112116

113-
function CommonSolve.solve(prob::NonlinearProblem, alg::HomotopyContinuationJL{false}; denominator_abstol = 1e-7, kwargs...)
117+
function CommonSolve.solve(prob::NonlinearProblem, alg::HomotopyContinuationJL{false};
118+
denominator_abstol = 1e-7, kwargs...)
114119
f, hcsys = homotopy_continuation_preprocessing(prob, alg)
115120

116121
u0 = state_values(prob)
@@ -120,14 +125,16 @@ function CommonSolve.solve(prob::NonlinearProblem, alg::HomotopyContinuationJL{f
120125
fu0 = NonlinearSolveBase.Utils.evaluate_f(prob, u0_p)
121126

122127
homotopy = GuessHomotopy(hcsys, fu0)
123-
orig_sol = HC.solve(homotopy, u0_p isa Number ? [[u0_p]] : [u0_p]; alg.kwargs..., kwargs...)
128+
orig_sol = HC.solve(
129+
homotopy, u0_p isa Number ? [[u0_p]] : [u0_p]; alg.kwargs..., kwargs...)
124130
realsols = map(res -> res.solution, HC.results(orig_sol; only_real = true))
125131
if u0 isa Number
126132
realsols = map(only, realsols)
127133
end
128134

129135
# no real solutions or infeasible solution
130-
if isempty(realsols) || any(<=(denominator_abstol), map(abs, f.denominator(real.(only(realsols)), p)))
136+
if isempty(realsols) ||
137+
any(<=(denominator_abstol), map(abs, f.denominator(real.(only(realsols)), p)))
131138
retcode = if isempty(realsols)
132139
SciMLBase.ReturnCode.ConvergenceFailure
133140
else
@@ -153,4 +160,3 @@ function CommonSolve.solve(prob::NonlinearProblem, alg::HomotopyContinuationJL{f
153160
retcode = SciMLBase.ReturnCode.Success
154161
return SciMLBase.build_solution(prob, alg, u, resid; retcode, original = orig_sol)
155162
end
156-

lib/NonlinearSolveHomotopyContinuation/test/allroots.jl

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ alg = HomotopyContinuationJL{true}(; threading = false)
1111
jac = function (u, p)
1212
return 2u - p[1]
1313
end
14-
@testset "`NonlinearProblem` - $name" for (jac, name) in [(nothing, "no jac"), (jac, "jac")]
14+
@testset "`NonlinearProblem` - $name" for (jac, name) in [
15+
(nothing, "no jac"), (jac, "jac")]
1516
fn = NonlinearFunction(rhs; jac)
1617
prob = NonlinearProblem(fn, 1.0, [5.0, 6.0])
1718
sol = solve(prob, alg)
@@ -21,14 +22,14 @@ alg = HomotopyContinuationJL{true}(; threading = false)
2122
sort!(sol.u; by = x -> x.u)
2223
@test sol.u[1] isa NonlinearSolution
2324
@test SciMLBase.successful_retcode(sol.u[1])
24-
@test sol.u[1].u 2.0 atol = 1e-10
25+
@test sol.u[1].u2.0 atol=1e-10
2526
@test sol.u[2] isa NonlinearSolution
2627
@test SciMLBase.successful_retcode(sol.u[2])
27-
@test sol.u[2].u 3.0 atol = 1e-10
28+
@test sol.u[2].u3.0 atol=1e-10
2829

2930
@testset "no real solutions" begin
3031
prob = NonlinearProblem(1.0, 0.5) do u, p
31-
return u * u - 2p * u + p
32+
return u * u - 2p * u + p
3233
end
3334
sol = solve(prob, alg)
3435
@test length(sol) == 1
@@ -47,7 +48,8 @@ alg = HomotopyContinuationJL{true}(; threading = false)
4748
unpolynomialize = function (u, p)
4849
return [asin(u)]
4950
end
50-
fn = HomotopyNonlinearFunction(; denominator, polynomialize, unpolynomialize) do u, p
51+
fn = HomotopyNonlinearFunction(;
52+
denominator, polynomialize, unpolynomialize) do u, p
5153
return (u - p[1]) * (u - p[2])
5254
end
5355
prob = NonlinearProblem(fn, 0.0, [0.5, 0.7])
@@ -74,12 +76,12 @@ alg = HomotopyContinuationJL{true}(; threading = false)
7476
end
7577

7678
f! = function (du, u, p)
77-
du[1] = u[1] * u[1] - p[1] * u[2] + u[2] ^ 3 + 1
78-
du[2] = u[2] ^ 3 + 2 * p[2] * u[1] * u[2] + u[2]
79+
du[1] = u[1] * u[1] - p[1] * u[2] + u[2]^3 + 1
80+
du[2] = u[2]^3 + 2 * p[2] * u[1] * u[2] + u[2]
7981
end
8082

8183
f = function (u, p)
82-
[u[1] * u[1] - p[1] * u[2] + u[2] ^ 3 + 1, u[2] ^ 3 + 2 * p[2] * u[1] * u[2] + u[2]]
84+
[u[1] * u[1] - p[1] * u[2] + u[2]^3 + 1, u[2]^3 + 2 * p[2] * u[1] * u[2] + u[2]]
8385
end
8486

8587
jac! = function (j, u, p)
@@ -89,11 +91,13 @@ jac! = function (j, u, p)
8991
j[2, 2] = 3 * u[2]^2 + 2 * p[2] * u[1] + 1
9092
end
9193
jac = function (u, p)
92-
[2u[1] -p[1] + 3 * u[2]^2;
93-
2 * p[2] * u[2] 3 * u[2]^2 + 2 * p[2] * u[1] + 1]
94+
[2u[1] -p[1]+3 * u[2]^2;
95+
2*p[2]*u[2] 3*u[2]^2+2*p[2]*u[1]+1]
9496
end
9597

96-
@testset "vector u - $name" for (rhs, jac, name) in [(f, nothing, "oop"), (f, jac, "oop + jac"), (f!, nothing, "iip"), (f!, jac!, "iip + jac")]
98+
@testset "vector u - $name" for (rhs, jac, name) in [
99+
(f, nothing, "oop"), (f, jac, "oop + jac"),
100+
(f!, nothing, "iip"), (f!, jac!, "iip + jac")]
97101
sol = nothing
98102
@testset "`NonlinearProblem`" begin
99103
fn = NonlinearFunction(rhs; jac)
@@ -103,7 +107,7 @@ end
103107
@test sol.converged
104108
for nlsol in sol.u
105109
@test SciMLBase.successful_retcode(nlsol)
106-
@test f(nlsol.u, prob.p) [0.0, 0.0] atol = 1e-10
110+
@test f(nlsol.u, prob.p)[0.0, 0.0] atol=1e-10
107111
end
108112

109113
@testset "no real solutions" begin
@@ -123,7 +127,7 @@ end
123127
return [[cbrt(u[1]), sin(u[2] / 40)]]
124128
end
125129
polynomialize = function (u, p)
126-
return [u[1] ^ 3, 40asin(u[2])]
130+
return [u[1]^3, 40asin(u[2])]
127131
end
128132
nlfn = NonlinearFunction(rhs; jac)
129133
fn = HomotopyNonlinearFunction(nlfn; denominator, polynomialize, unpolynomialize)
@@ -133,7 +137,9 @@ end
133137
@test sol2.converged
134138
@test length(sol.u) == length(sol2.u)
135139
for nlsol2 in sol2.u
136-
@test any(nlsol -> isapprox(polynomialize(nlsol2.u, prob.p), nlsol.u; rtol = 1e-8), sol.u)
140+
@test any(
141+
nlsol -> isapprox(polynomialize(nlsol2.u, prob.p), nlsol.u; rtol = 1e-8),
142+
sol.u)
137143
end
138144

139145
@testset "some invalid solutions" begin

0 commit comments

Comments
 (0)