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+
16value (x:: Complex{<:Dual} ) = Complex (x. re. value, x. im. value)
27
38partials (x:: Complex{<:Dual} , n:: Int ) = Complex (partials (x. re, n), partials (x. im, n))
@@ -12,70 +17,32 @@ AbstractFFTs.complexfloat(d::Dual{T,V,N}) where {T,V,N} = convert(Dual{T,float(V
1217AbstractFFTs. realfloat (x:: AbstractArray{<:Dual} ) = AbstractFFTs. realfloat .(x)
1318AbstractFFTs. realfloat (d:: Dual{T,V,N} ) where {T,V,N} = convert (Dual{T,float (V),N}, d)
1419
15- for plan in [ :plan_fft , :plan_ifft , :plan_bfft ]
20+ for plan in ( :plan_fft , :plan_ifft , :plan_bfft , :plan_rfft )
1621 @eval begin
17-
18- AbstractFFTs.$ plan (x:: AbstractArray{<:Dual} , region= 1 : ndims (x)) =
19- AbstractFFTs.$ plan (value .(x), region)
20-
21- AbstractFFTs.$ plan (x:: AbstractArray{<:Complex{<:Dual}} , region= 1 : ndims (x)) =
22- AbstractFFTs.$ plan (value .(x), region)
23-
22+ $ plan (x:: AbstractArray{<:Dual} , dims= 1 : ndims (x)) = $ plan (dual2array (x), 1 .+ dims)
23+ $ plan (x:: AbstractArray{<:Complex{<:Dual}} , dims= 1 : ndims (x)) = $ plan (dual2array (x), 1 .+ dims)
2424 end
2525end
2626
27- # rfft only accepts real arrays
28- AbstractFFTs. plan_rfft (x:: AbstractArray{<:Dual} , region= 1 : ndims (x)) =
29- AbstractFFTs. plan_rfft (value .(x), region)
27+ plan_r2r (x:: AbstractArray{<:Dual} , FLAG, dims= 1 : ndims (x)) = plan_r2r (dual2array (x), FLAG, 1 .+ dims)
28+ plan_r2r (x:: AbstractArray{<:Complex{<:Dual}} , FLAG, dims= 1 : ndims (x)) = plan_r2r (dual2array (x), FLAG, 1 .+ dims)
3029
31- for plan in [ :plan_irfft , :plan_brfft ] # these take an extra argument, only when complex?
30+ for plan in ( :plan_irfft , :plan_brfft ) # these take an extra argument, only when complex?
3231 @eval begin
33-
34- AbstractFFTs.$ plan (x:: AbstractArray{<:Dual} , region= 1 : ndims (x)) =
35- AbstractFFTs.$ plan (value .(x), region)
36-
37- AbstractFFTs.$ plan (x:: AbstractArray{<:Complex{<:Dual}} , d:: Integer , region= 1 : ndims (x)) =
38- AbstractFFTs.$ plan (value .(x), d, region)
39-
32+ $ plan (x:: AbstractArray{<:Dual} , dims= 1 : ndims (x)) = $ plan (dual2array (x), 1 .+ dims)
33+ $ plan (x:: AbstractArray{<:Complex{<:Dual}} , d:: Integer , dims= 1 : ndims (x)) = $ plan (dual2array (x), d, 1 .+ dims)
4034 end
4135end
4236
43- # for f in (:dct, :idct)
44- # pf = Symbol("plan_", f)
45- # @eval begin
46- # AbstractFFTs.$f(x::AbstractArray{<:Dual}) = $pf(x) * x
47- # AbstractFFTs.$f(x::AbstractArray{<:Dual}, region) = $pf(x, region) * x
48- # AbstractFFTs.$pf(x::AbstractArray{<:Dual}, region; kws...) = $pf(value.(x), region; kws...)
49- # AbstractFFTs.$pf(x::AbstractArray{<:Complex}, region; kws...) = $pf(value.(x), region; kws...)
50- # end
51- # end
37+ r2r (x:: AbstractArray{<:Dual} , kinds, region... ) = plan_r2r (x, kinds, region... ) * x
38+ r2r (x:: AbstractArray{<:Complex{<:Dual}} , kinds, region... ) = plan_r2r (x, kinds, region... ) * x
5239
5340
54- for P in [ :Plan , :ScaledPlan ] # need ScaledPlan to avoid ambiguities
41+ for P in ( :Plan , :ScaledPlan ) # need ScaledPlan to avoid ambiguities
5542 @eval begin
56-
57- Base.:* (p:: AbstractFFTs. $ P, x:: AbstractArray{<:Dual} ) =
58- _apply_plan (p, x)
59-
60- Base.:* (p:: AbstractFFTs. $ P, x:: AbstractArray{<:Complex{<:Dual}} ) =
61- _apply_plan (p, x)
62-
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))
6345 end
6446end
6547
66- function _apply_plan (p:: AbstractFFTs.Plan , x:: AbstractArray )
67- xtil = p * value .(x)
68- dxtils = ntuple (npartials (eltype (x))) do n
69- p * partials .(x, n)
70- end
71- __apply_plan (tagtype (eltype (x)), xtil, dxtils)
72- end
73-
74- function __apply_plan (T, xtil, dxtils)
75- map (xtil, dxtils... ) do val, parts...
76- Complex (
77- Dual {T} (real (val), map (real, parts)),
78- Dual {T} (imag (val), map (imag, parts)),
79- )
80- end
81- end
48+ mul! (y:: AbstractArray{<:Dual} , p:: Plan , x:: AbstractArray{<:Dual} ) = copyto! (y, p* x)
0 commit comments