|
5 | 5 | import s2fft.sampling as smp |
6 | 6 | import s2fft.utils.signal_generator as gen |
7 | 7 |
|
8 | | -L_values_to_test = [4, 7, 64] |
9 | | -L_lower_to_test = [0] |
| 8 | +L_values_to_test = [6, 7, 16] |
| 9 | +L_lower_to_test = [0, 1] |
10 | 10 | spin_to_test = [-2, 0, 1] |
11 | 11 | reality_values_to_test = [False, True] |
12 | 12 |
|
@@ -74,3 +74,46 @@ def test_generate_flm(rng, L, L_lower, spin, reality): |
74 | 74 | assert np.allclose(f_complex.imag, 0) |
75 | 75 | f_real = s2fft.inverse(flm, L, spin=spin, reality=True, L_lower=L_lower) |
76 | 76 | assert np.allclose(f_complex.real, f_real) |
| 77 | + |
| 78 | + |
| 79 | +def check_flmn_zeros(flmn, L, N, L_lower): |
| 80 | + for n in range(-N + 1, N): |
| 81 | + min_el = max(L_lower, abs(n)) |
| 82 | + for el in range(L): |
| 83 | + for m in range(L): |
| 84 | + if el < min_el or m > el: |
| 85 | + assert ( |
| 86 | + flmn[N - 1 + n, el, L - 1 + m] |
| 87 | + == flmn[N - 1 + n, el, L - 1 - m] |
| 88 | + == 0 |
| 89 | + ) |
| 90 | + |
| 91 | + |
| 92 | +def check_flmn_conjugate_symmetry(flmn, L, N, L_lower): |
| 93 | + for n in range(-N + 1, N): |
| 94 | + min_el = max(L_lower, abs(n)) |
| 95 | + for el in range(min_el, L): |
| 96 | + for m in range(el + 1): |
| 97 | + assert ( |
| 98 | + flmn[N - 1 - n, el, L - 1 - m] |
| 99 | + == (-1) ** (m + n) * flmn[N - 1 + n, el, L - 1 + m].conj() |
| 100 | + ) |
| 101 | + |
| 102 | + |
| 103 | +@pytest.mark.parametrize("L", L_values_to_test) |
| 104 | +@pytest.mark.parametrize("N", [1, 2]) |
| 105 | +@pytest.mark.parametrize("L_lower", L_lower_to_test) |
| 106 | +@pytest.mark.parametrize("reality", reality_values_to_test) |
| 107 | +@pytest.mark.filterwarnings("ignore::RuntimeWarning") |
| 108 | +def test_generate_flmn(rng, L, N, L_lower, reality): |
| 109 | + flmn = gen.generate_flmn(rng, L, N, L_lower, reality) |
| 110 | + assert flmn.shape == smp.so3_samples.flmn_shape(L, N) |
| 111 | + assert flmn.dtype == np.complex128 |
| 112 | + assert np.isfinite(flmn).all() |
| 113 | + check_flmn_zeros(flmn, L, N, L_lower) |
| 114 | + if reality: |
| 115 | + check_flmn_conjugate_symmetry(flmn, L, N, L_lower) |
| 116 | + f_complex = s2fft.wigner.inverse(flmn, L, N, reality=False, L_lower=L_lower) |
| 117 | + assert np.allclose(f_complex.imag, 0) |
| 118 | + f_real = s2fft.wigner.inverse(flmn, L, N, reality=True, L_lower=L_lower) |
| 119 | + assert np.allclose(f_complex.real, f_real) |
0 commit comments