1+ using AbstractFFTs
2+ using ForwardDiff
3+ using Test
4+ using ForwardDiff: Dual, partials, value
5+
6+ @testset " ForwardDiff extension tests" begin
7+ x1 = Dual .(1 : 4.0 , 2 : 5 , 3 : 6 )
8+
9+ @test AbstractFFTs. complexfloat (x1)[1 ] === AbstractFFTs. complexfloat (x1[1 ]) === Dual (1.0 , 2.0 , 3.0 ) + 0im
10+ @test AbstractFFTs. realfloat (x1)[1 ] === AbstractFFTs. realfloat (x1[1 ]) === Dual (1.0 , 2.0 , 3.0 )
11+
12+ @test fft (x1, 1 )[1 ] isa Complex{<: Dual }
13+
14+ @testset " $f " for f in (fft, ifft, rfft, bfft)
15+ @test value .(f (x1)) == f (value .(x1))
16+ @test partials .(real (f (x1)), 1 ) + im* partials .(imag (f (x1)), 1 ) == f (partials .(x1, 1 ))
17+ @test partials .(real (f (x1)), 2 ) + im* partials .(imag (f (x1)), 2 ) == f (partials .(x1, 2 ))
18+ end
19+
20+ @test ifft (fft (x1)) ≈ x1
21+ @test irfft (rfft (x1), length (x1)) ≈ x1
22+ @test brfft (rfft (x1), length (x1)) ≈ 4 x1
23+
24+ f = x -> real (fft ([x; 0 ; 0 ])[1 ])
25+ @test derivative (f,0.1 ) ≈ 1
26+
27+ r = x -> real (rfft ([x; 0 ; 0 ])[1 ])
28+ @test derivative (r,0.1 ) ≈ 1
29+
30+
31+ n = 100
32+ θ = range (0 ,2 π; length= n+ 1 )[1 : end - 1 ]
33+ # emperical from Mathematical
34+ @test derivative (ω -> fft (exp .(ω .* cos .(θ)))[1 ]/ n, 1 ) ≈ 0.565159103992485
35+
36+ # c = x -> dct([x; 0; 0])[1]
37+ # @test derivative(c,0.1) ≈ 1
38+
39+ @testset " matrix" begin
40+ A = x1 * (1 : 10 )'
41+ @test value .(fft (A)) == fft (value .(A))
42+ @test partials .(fft (A), 1 ) == fft (partials .(A, 1 ))
43+ @test partials .(fft (A), 2 ) == fft (partials .(A, 2 ))
44+
45+ @test value .(fft (A, 1 )) == fft (value .(A), 1 )
46+ @test partials .(fft (A, 1 ), 1 ) == fft (partials .(A, 1 ), 1 )
47+ @test partials .(fft (A, 1 ), 2 ) == fft (partials .(A, 2 ), 1 )
48+
49+ @test value .(fft (A, 2 )) == fft (value .(A), 2 )
50+ @test partials .(fft (A, 2 ), 1 ) == fft (partials .(A, 1 ), 2 )
51+ @test partials .(fft (A, 2 ), 2 ) == fft (partials .(A, 2 ), 2 )
52+ end
53+
54+ c1 = complex .(x1)
55+ @test mul! (similar (c1), FFTW. plan_fft (x1), x1) == fft (x1)
56+ @test mul! (similar (c1), FFTW. plan_fft (c1), c1) == fft (c1)
57+ end
0 commit comments