|
| 1 | +import numpy as np |
| 2 | +import pytest |
| 3 | + |
| 4 | +import s2fft |
| 5 | +import s2fft.sampling as smp |
| 6 | +import s2fft.utils.signal_generator as gen |
| 7 | + |
| 8 | +L_values_to_test = [4, 7, 64] |
| 9 | +L_lower_to_test = [0] |
| 10 | +spin_to_test = [-2, 0, 1] |
| 11 | +reality_values_to_test = [False, True] |
| 12 | + |
| 13 | + |
| 14 | +@pytest.mark.parametrize("L", L_values_to_test) |
| 15 | +@pytest.mark.parametrize("min_el", [0, 1]) |
| 16 | +def test_complex_el_and_m_indices(L, min_el): |
| 17 | + expected_el_indices, expected_m_indices = np.array( |
| 18 | + [(el, m) for el in range(min_el, L) for m in range(1, el + 1)] |
| 19 | + ).T |
| 20 | + el_indices, m_indices = gen.complex_el_and_m_indices(L, min_el) |
| 21 | + assert (el_indices == expected_el_indices).all() |
| 22 | + assert (m_indices == expected_m_indices).all() |
| 23 | + |
| 24 | + |
| 25 | +def check_flm_conjugate_symmetry(flm, L, min_el): |
| 26 | + for el in range(min_el, L): |
| 27 | + for m in range(el + 1): |
| 28 | + assert flm[el, L - 1 - m] == (-1) ** m * flm[el, L - 1 + m].conj() |
| 29 | + |
| 30 | + |
| 31 | +@pytest.mark.parametrize("L", L_values_to_test) |
| 32 | +@pytest.mark.parametrize("L_lower", L_lower_to_test) |
| 33 | +@pytest.mark.parametrize("spin", spin_to_test) |
| 34 | +@pytest.mark.parametrize("reality", reality_values_to_test) |
| 35 | +@pytest.mark.filterwarnings("ignore::RuntimeWarning") |
| 36 | +def test_generate_flm(rng, L, L_lower, spin, reality): |
| 37 | + if reality and spin != 0: |
| 38 | + pytest.skip("Reality only valid for scalar fields (spin=0).") |
| 39 | + flm = gen.generate_flm(rng, L, L_lower, spin, reality) |
| 40 | + assert flm.shape == smp.s2_samples.flm_shape(L) |
| 41 | + assert flm.dtype == np.complex128 |
| 42 | + assert np.isfinite(flm).all() |
| 43 | + if reality: |
| 44 | + check_flm_conjugate_symmetry(flm, L, max(L_lower, abs(spin))) |
| 45 | + f_complex = s2fft.inverse(flm, L, spin=spin, reality=False, L_lower=L_lower) |
| 46 | + assert np.allclose(f_complex.imag, 0) |
| 47 | + f_real = s2fft.inverse(flm, L, spin=spin, reality=True, L_lower=L_lower) |
| 48 | + assert np.allclose(f_complex.real, f_real) |
0 commit comments