@@ -161,47 +161,74 @@ for V in (Inplace, OutOfPlace, Scalar)
161
161
end
162
162
163
163
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
168
169
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
171
172
end
173
+
174
+ vars[2 i - 1 ] = TaylorScalar (realx)
175
+ vars[2 i] = TaylorScalar (imagx)
172
176
end
173
177
end
174
178
175
179
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[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
181
197
end
198
+ return true
182
199
end
183
200
184
201
function update_maybe_taylorvector_from_taylorvars! (
185
202
u:: Vector , vars, buffer, :: Val{N} ) where {N}
186
203
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]
188
207
end
189
208
end
190
209
191
210
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}
193
212
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)))
195
216
end
196
217
end
197
218
198
219
function HC. ModelKit. taylor! (u:: AbstractVector , :: Val{N} ,
199
220
sys:: HomotopySystemWrapper{Inplace} , x, p = nothing ) where {N}
200
221
f = sys. f
201
222
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
205
232
update_maybe_taylorvector_from_taylorvars! (u, vars, buffer, Val (N))
206
233
return u
207
234
end
@@ -211,8 +238,14 @@ function HC.ModelKit.taylor!(u::AbstractVector, ::Val{N},
211
238
f = sys. f
212
239
p = sys. p
213
240
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
216
249
update_maybe_taylorvector_from_taylorvars! (u, vars, buffer, Val (N))
217
250
return u
218
251
end
@@ -222,9 +255,15 @@ function HC.ModelKit.taylor!(u::AbstractVector, ::Val{N},
222
255
f = sys. f
223
256
p = sys. p
224
257
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))
228
267
return u
229
268
end
230
269
0 commit comments