1- dual2array (x:: Array{<:Dual{Tag,T}} ) where {Tag,T} = reinterpret (reshape, T, x)
2- dual2array (x:: Array{<:Complex{<:Dual{Tag, T}}} ) where {Tag,T} = complex .(dual2array (real (x)), dual2array (imag (x)))
3- array2dual (DT:: Type{<:Dual} , x:: Array{T} ) where T = reinterpret (reshape, DT, real (x))
4- array2dual (DT:: Type{<:Dual} , x:: Array{<:Complex{T}} ) where T = complex .(array2dual (DT, real (x)), array2dual (DT, imag (x)))
5-
6- value (x:: Complex{<:Dual} ) = Complex (x. re. value, x. im. value)
7-
8- partials (x:: Complex{<:Dual} , n:: Int ) = Complex (partials (x. re, n), partials (x. im, n))
9-
10- npartials (x:: Complex{<:Dual{T,V,N}} ) where {T,V,N} = N
11- npartials (:: Type{<:Complex{<:Dual{T,V,N}}} ) where {T,V,N} = N
121
132# AbstractFFTs.complexfloat(x::AbstractArray{<:Dual}) = float.(x .+ 0im)
143AbstractFFTs. complexfloat (x:: AbstractArray{<:Dual} ) = AbstractFFTs. complexfloat .(x)
3726r2r (x:: AbstractArray{<:Dual} , kinds, region... ) = plan_r2r (x, kinds, region... ) * x
3827r2r (x:: AbstractArray{<:Complex{<:Dual}} , kinds, region... ) = plan_r2r (x, kinds, region... ) * x
3928
40-
41- for P in (:Plan , :ScaledPlan ) # need ScaledPlan to avoid ambiguities
42- @eval begin
43- Base.:* (p:: AbstractFFTs. $ P, x:: AbstractArray{DT} ) where DT<: Dual = array2dual (DT, p * dual2array (x))
44- Base.:* (p:: AbstractFFTs. $ P, x:: AbstractArray{<:Complex{DT}} ) where DT<: Dual = array2dual (DT, p * dual2array (x))
45- end
46- end
47-
48- mul! (y:: AbstractArray{<:Dual} , p:: Plan , x:: AbstractArray{<:Dual} ) = copyto! (y, p* x)
0 commit comments