Skip to content

Commit 2dc19ca

Browse files
refactor: use TaylorDiff.jl instead of TaylorSeries.jl
1 parent 5426e99 commit 2dc19ca

File tree

4 files changed

+70
-29
lines changed

4 files changed

+70
-29
lines changed

lib/NonlinearSolveHomotopyContinuation/Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1414
NonlinearSolveBase = "be0214bd-f91f-a760-ac4e-3421ce2b2da0"
1515
SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
1616
SymbolicIndexingInterface = "2efcf032-c050-4f8e-a9bb-153293bab1f5"
17-
TaylorSeries = "6aa5eb33-94cf-58f4-a9d0-e4b2c4fc25ea"
17+
TaylorDiff = "b36ab563-344f-407b-a36a-4f200bebf99c"
1818

1919
[compat]
2020
ADTypes = "1.11.0"
@@ -29,7 +29,7 @@ NonlinearSolve = "4"
2929
NonlinearSolveBase = "1.3.3"
3030
SciMLBase = "2.71"
3131
SymbolicIndexingInterface = "0.3.36"
32-
TaylorSeries = "0.18.2"
32+
TaylorDiff = "0.3.1"
3333
Test = "1.10"
3434
julia = "1.10"
3535

lib/NonlinearSolveHomotopyContinuation/src/NonlinearSolveHomotopyContinuation.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ using NonlinearSolveBase
66
using SymbolicIndexingInterface
77
using LinearAlgebra
88
using ADTypes
9-
using TaylorSeries
9+
using TaylorDiff
1010
using DocStringExtensions
1111
import CommonSolve
1212
import HomotopyContinuation as HC

lib/NonlinearSolveHomotopyContinuation/src/interface_types.jl

Lines changed: 61 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -161,47 +161,74 @@ for V in (Inplace, OutOfPlace, Scalar)
161161
end
162162

163163
function update_taylorvars_from_taylorvector!(
164-
vars, x::HC.ModelKit.TaylorVector{M}) where {M}
165-
for i in eachindex(vars)
166-
for j in 0:(M - 1)
167-
vars[i][j] = x[i, j + 1]
164+
vars, x::HC.ModelKit.TaylorVector)
165+
for i in eachindex(x)
166+
xvar = x[i]
167+
realx = ntuple(Val(5)) do j
168+
j <= length(xvar) ? real(xvar[j - 1]) : 0.0
168169
end
169-
for j in M:4
170-
vars[i][j] = zero(vars[i][j])
170+
imagx = ntuple(Val(5)) do j
171+
j <= length(xvar) ? imag(xvar[j - 1]) : 0.0
171172
end
173+
174+
vars[2i - 1] = TaylorScalar(realx)
175+
vars[2i] = TaylorScalar(imagx)
172176
end
173177
end
174178

175179
function update_taylorvars_from_taylorvector!(vars, x::AbstractVector)
176-
for i in eachindex(vars)
177-
vars[i][0] = x[i]
178-
for j in 1:4
179-
vars[i][j] = zero(vars[i][j])
180-
end
180+
for i in eachindex(x)
181+
vars[2i - 1] = TaylorScalar(real(x[i]), ntuple(Returns(0.0), Val(4)))
182+
vars[2i] = TaylorScalar(imag(x[i]), ntuple(Returns(0.0), Val(4)))
183+
end
184+
end
185+
186+
function check_taylor_equality(vars, x::HC.ModelKit.TaylorVector)
187+
for i in eachindex(x)
188+
TaylorDiff.flatten(vars[2i-1]) == map(real, x[i]) || return false
189+
TaylorDiff.flatten(vars[2i]) == map(imag, x[i]) || return false
190+
end
191+
return true
192+
end
193+
function check_taylor_equality(vars, x::AbstractVector)
194+
for i in eachindex(x)
195+
TaylorDiff.value(vars[2i-1]) != real(x[i]) && return false
196+
TaylorDiff.value(vars[2i]) != imag(x[i]) && return false
181197
end
198+
return true
182199
end
183200

184201
function update_maybe_taylorvector_from_taylorvars!(
185202
u::Vector, vars, buffer, ::Val{N}) where {N}
186203
for i in eachindex(vars)
187-
u[i] = buffer[i][N]
204+
rval = TaylorDiff.flatten(real(buffer[i]))
205+
ival = TaylorDiff.flatten(imag(buffer[i]))
206+
u[i] = rval[N] + im * ival[N]
188207
end
189208
end
190209

191210
function update_maybe_taylorvector_from_taylorvars!(
192-
u::HC.ModelKit.TaylorVector, vars, buffer, ::Val{N}) where {N}
211+
u::HC.ModelKit.TaylorVector{M}, vars, buffer, ::Val{N}) where {M, N}
193212
for i in eachindex(vars)
194-
u[i] = ntuple(j -> buffer[i][j - 1], Val(N + 1))
213+
rval = TaylorDiff.flatten(real(buffer[i]))
214+
ival = TaylorDiff.flatten(imag(buffer[i]))
215+
u[i] = ntuple(i -> rval[i] + im * ival[i], Val(length(rval)))
195216
end
196217
end
197218

198219
function HC.ModelKit.taylor!(u::AbstractVector, ::Val{N},
199220
sys::HomotopySystemWrapper{Inplace}, x, p = nothing) where {N}
200221
f = sys.f
201222
p = sys.p
202-
buffer, vars = sys.taylorvars
203-
update_taylorvars_from_taylorvector!(vars, x)
204-
f(buffer, vars, p)
223+
vars, buffer = sys.taylorvars
224+
if !check_taylor_equality(vars, x)
225+
update_taylorvars_from_taylorvector!(vars, x)
226+
vars = reinterpret(Complex{eltype(vars)}, vars)
227+
buffer = reinterpret(Complex{eltype(buffer)}, buffer)
228+
f(buffer, vars, p)
229+
else
230+
vars = reinterpret(Complex{eltype(vars)}, vars)
231+
end
205232
update_maybe_taylorvector_from_taylorvars!(u, vars, buffer, Val(N))
206233
return u
207234
end
@@ -211,8 +238,14 @@ function HC.ModelKit.taylor!(u::AbstractVector, ::Val{N},
211238
f = sys.f
212239
p = sys.p
213240
vars = sys.taylorvars
214-
update_taylorvars_from_taylorvector!(vars, x)
215-
buffer = f(vars, p)
241+
if !check_taylor_equality(vars, x)
242+
update_taylorvars_from_taylorvector!(vars, x)
243+
vars = reinterpret(Complex{eltype(vars)}, vars)
244+
buffer = f(vars, p)
245+
copyto!(vars, buffer)
246+
else
247+
vars = buffer = reinterpret(Complex{eltype(vars)}, vars)
248+
end
216249
update_maybe_taylorvector_from_taylorvars!(u, vars, buffer, Val(N))
217250
return u
218251
end
@@ -222,9 +255,15 @@ function HC.ModelKit.taylor!(u::AbstractVector, ::Val{N},
222255
f = sys.f
223256
p = sys.p
224257
var = sys.taylorvars
225-
update_taylorvars_from_taylorvector!((var,), x)
226-
buffer = f(var, p)
227-
update_maybe_taylorvector_from_taylorvars!(u, (var,), (buffer,), Val(N))
258+
if !check_taylor_equality(var, x)
259+
update_taylorvars_from_taylorvector!(var, x)
260+
var = reinterpret(Complex{eltype(var)}, var)
261+
buffer = f(var[1], p)
262+
var[1] = buffer
263+
else
264+
var = buffer = reinterpret(Complex{eltype(var)}, var)
265+
end
266+
update_maybe_taylorvector_from_taylorvars!(u, var, buffer, Val(N))
228267
return u
229268
end
230269

lib/NonlinearSolveHomotopyContinuation/src/solve.jl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,14 @@ function homotopy_continuation_preprocessing(
4444
end
4545

4646
taylorvars = if isscalar
47-
Taylor1(zeros(ComplexF64, 5), 4)
47+
[TaylorScalar(ntuple(Returns(0.0), 5)), TaylorScalar(ntuple(Returns(0.0), 5))]
4848
elseif iip
49-
([Taylor1(zeros(ComplexF64, 5), 4) for _ in u0],
50-
[Taylor1(zeros(ComplexF64, 5), 4) for _ in u0])
49+
(
50+
[TaylorScalar(ntuple(Returns(0.0), 4)) for _ in 1:2length(u0)],
51+
[TaylorScalar(ntuple(Returns(0.0), 4)) for _ in 1:2length(u0)]
52+
)
5153
else
52-
[Taylor1(zeros(ComplexF64, 5), 4) for _ in u0]
54+
[TaylorScalar(ntuple(Returns(0.0), 4)) for _ in 1:2length(u0)]
5355
end
5456

5557
jacobian_buffers = if isscalar

0 commit comments

Comments
 (0)