@@ -161,47 +161,74 @@ for V in (Inplace, OutOfPlace, Scalar)
161161end
162162
163163function 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[2 i - 1 ] = TaylorScalar (realx)
175+ vars[2 i] = TaylorScalar (imagx)
172176 end
173177end
174178
175179function 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[2 i - 1 ] = TaylorScalar (real (x[i]), ntuple (Returns (0.0 ), Val (4 )))
182+ vars[2 i] = 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[2 i- 1 ]) == map (real, x[i]) || return false
189+ TaylorDiff. flatten (vars[2 i]) == 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[2 i- 1 ]) != real (x[i]) && return false
196+ TaylorDiff. value (vars[2 i]) != imag (x[i]) && return false
181197 end
198+ return true
182199end
183200
184201function 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
189208end
190209
191210function 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
196217end
197218
198219function 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
207234end
@@ -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
218251end
@@ -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
229268end
230269
0 commit comments