|
1 | 1 | using DSP, Test |
2 | | -using Random: MersenneTwister |
| 2 | +using Random: MersenneTwister, default_rng, seed! |
| 3 | +using StableRNGs |
| 4 | +using Statistics: mean |
3 | 5 |
|
4 | 6 | @testset "Unwrap 1D" begin |
5 | | - @test unwrap([0.1, 0.2, 0.3, 0.4]) ≈ [0.1, 0.2, 0.3, 0.4] |
6 | | - @test unwrap([0.1, 0.2 + 2pi, 0.3, 0.4]) ≈ [0.1, 0.2, 0.3, 0.4] |
7 | | - @test unwrap([0.1, 0.2 - 2pi, 0.3, 0.4]) ≈ [0.1, 0.2, 0.3, 0.4] |
8 | | - @test unwrap([0.1, 0.2 - 2pi, 0.3 - 2pi, 0.4]) ≈ [0.1, 0.2, 0.3, 0.4] |
9 | | - @test unwrap([0.1 + 2pi, 0.2, 0.3, 0.4]) ≈ [0.1 + 2pi, 0.2 + 2pi, 0.3 + 2pi, 0.4 + 2pi] |
10 | | - @test unwrap([0.1, 0.2 + 6pi, 0.3, 0.4]) ≈ [0.1, 0.2, 0.3, 0.4] |
| 7 | + unwrapped = [0.1, 0.2, 0.3, 0.4] |
| 8 | + @test unwrap([0.1, 0.2, 0.3, 0.4]) ≈ unwrapped |
| 9 | + @test unwrap([0.1, 0.2 + 2pi, 0.3, 0.4]) ≈ unwrapped |
| 10 | + @test unwrap([0.1, 0.2 - 2pi, 0.3, 0.4]) ≈ unwrapped |
| 11 | + @test unwrap([0.1, 0.2 - 2pi, 0.3 - 2pi, 0.4]) ≈ unwrapped |
| 12 | + @test unwrap([0.1 + 2pi, 0.2, 0.3, 0.4]) ≈ unwrapped .+ 2pi |
| 13 | + @test unwrap([0.1, 0.2 + 6pi, 0.3, 0.4]) ≈ unwrapped |
11 | 14 |
|
12 | 15 | test_v = [0.1, 0.2, 0.3 + 2pi, 0.4] |
13 | 16 | res_v = unwrap(test_v) |
14 | | - @test test_v ≈ [0.1, 0.2, 0.3 + 2pi, 0.4] |
| 17 | + @test res_v ≈ unwrapped |
| 18 | + @test test_v == [0.1, 0.2, 0.3 + 2pi, 0.4] |
| 19 | + |
15 | 20 | res_v .= 0 |
16 | 21 | unwrap!(res_v, test_v) |
17 | | - @test res_v ≈ [0.1, 0.2, 0.3, 0.4] |
18 | | - @test test_v ≈ [0.1, 0.2, 0.3 + 2pi, 0.4] |
19 | | - unwrap!(test_v) |
20 | | - @test test_v ≈ [0.1, 0.2, 0.3, 0.4] |
| 22 | + @test res_v ≈ unwrapped |
| 23 | + @test test_v == [0.1, 0.2, 0.3 + 2pi, 0.4] |
| 24 | + |
| 25 | + @test unwrap!(test_v) === test_v |
| 26 | + @test test_v ≈ unwrapped |
21 | 27 |
|
22 | 28 | # test unwrapping within multi-dimensional array |
23 | | - wrapped = [0.1, 0.2 + 2pi, 0.3, 0.4] |
24 | | - unwrapped = [0.1, 0.2, 0.3, 0.4] |
25 | | - wrapped = hcat(wrapped, wrapped) |
| 29 | + wrapped = repeat([0.1, 0.2 + 2pi, 0.3, 0.4], 1, 2) |
26 | 30 | unwrapped = hcat(unwrapped, unwrapped) |
27 | 31 | @test unwrap(wrapped, dims=2) ≈ wrapped |
28 | 32 | @test unwrap(wrapped, dims=1) ≈ unwrapped |
@@ -101,39 +105,46 @@ end |
101 | 105 |
|
102 | 106 | @testset "Unwrap 3D" begin |
103 | 107 | types = (Float32, Float64, BigFloat) |
104 | | - f(x, y, z) = 0.1x^2 - 2y + 2z |
| 108 | + |
| 109 | + f_nowrap(x, y, z) = 0.1x^2 - 2y + 2z |
105 | 110 | f_wraparound2(x, y, z) = 5*sin(x) + 2*cos(y) + z |
106 | 111 | f_wraparound3(x, y, z) = 5*sin(x) + 2*cos(y) - 4*cos(z) |
| 112 | + |
107 | 113 | for T in types |
108 | 114 | grid = range(zero(T), stop=2convert(T, π), length=11) |
109 | | - f_uw = f.(grid, grid', reshape(grid, 1, 1, :)) |
110 | | - f_wr = f_uw .% (2convert(T, π)) |
111 | | - uw_test = unwrap(f_wr, dims=1:3) |
112 | | - offset = first(f_uw) - first(uw_test) |
113 | | - @test (uw_test.+offset) ≈ f_uw rtol=eps(T) #oop, nowrap |
114 | | - # test in-place version |
115 | | - unwrap!(f_wr, dims=1:3) |
116 | | - offset = first(f_uw) - first(f_wr) |
117 | | - @test (f_wr.+offset) ≈ f_uw rtol=eps(T) #ip, nowrap |
118 | | - |
119 | | - f_uw = f_wraparound2.(grid, grid', reshape(grid, 1, 1, :)) |
120 | | - f_wr = f_uw .% (2convert(T, π)) |
121 | | - uw_test = unwrap(f_wr, dims=1:3) |
122 | | - offset = first(f_uw) - first(uw_test) |
123 | | - @test (uw_test.+offset) ≈ f_uw #oop, 2wrap |
124 | | - # test in-place version |
125 | | - unwrap!(f_wr, dims=1:3, circular_dims=(true, true, false)) |
126 | | - offset = first(f_uw) - first(f_wr) |
127 | | - @test (f_wr.+offset) ≈ f_uw #ip, 2wrap |
128 | | - |
129 | | - f_uw = f_wraparound3.(grid, grid', reshape(grid, 1, 1, :)) |
130 | | - f_wr = f_uw .% (2convert(T, π)) |
131 | | - uw_test = unwrap(f_wr, dims=1:3, circular_dims=(true, true, true)) |
132 | | - offset = first(f_uw) - first(uw_test) |
133 | | - @test (uw_test.+offset) ≈ f_uw #oop, 3wrap |
134 | | - # test in-place version |
135 | | - unwrap!(f_wr, dims=1:3, circular_dims=(true, true, true)) |
136 | | - offset = first(f_uw) - first(f_wr) |
137 | | - @test (f_wr.+offset) ≈ f_uw #oop, 3wrap |
| 115 | + |
| 116 | + for (func, circular_dims) in ( |
| 117 | + (f_nowrap, (false, false, false)), |
| 118 | + (f_wraparound2, (true, true, false)), |
| 119 | + (f_wraparound3, (true, true, true)) |
| 120 | + ) |
| 121 | + f_uw = func.(grid, grid', reshape(grid, 1, 1, :)) |
| 122 | + f_wr = f_uw .% (2convert(T, π)) |
| 123 | + uw_test = unwrap(f_wr; dims=1:3, circular_dims) |
| 124 | + offset = first(f_uw) - first(uw_test) |
| 125 | + @test (uw_test .+ offset) ≈ f_uw rtol = eps(T) # oop |
| 126 | + |
| 127 | + # test in-place version |
| 128 | + unwrap!(f_wr; dims=1:3, circular_dims) |
| 129 | + offset = first(f_uw) - first(f_wr) |
| 130 | + @test (f_wr .+ offset) ≈ f_uw rtol = eps(T) # ip |
| 131 | + end |
| 132 | + end |
| 133 | +end |
| 134 | + |
| 135 | +@testset "reproducible unwrap" begin |
| 136 | + function measure(s, rng, seed=rand(UInt)) |
| 137 | + u1 = unwrap(s; dims=1:ndims(s), rng=seed!(rng, seed)) |
| 138 | + u2 = unwrap(s; dims=1:ndims(s), rng=seed!(rng, seed)) |
| 139 | + return sqrt(mean(abs2, u1 - u2)) |
| 140 | + end |
| 141 | + |
| 142 | + x1 = 1234 * rand(10_000) |
| 143 | + x2 = 1357 * rand(200, 200) |
| 144 | + x3 = 1248 * rand(30, 30, 30) |
| 145 | + |
| 146 | + for x in (x1, x2, x3) |
| 147 | + @test measure(x, default_rng()) == measure(x, MersenneTwister()) == |
| 148 | + measure(x, StableRNG(10)) == 0.0 |
138 | 149 | end |
139 | 150 | end |
0 commit comments