import pypocketfft import pyfftw import numpy as np import pytest from numpy.testing import assert_ pmp = pytest.mark.parametrize shapes1D = ((10,), (127,)) shapes2D = ((128, 128), (128, 129), (1, 129), (129, 1)) shapes3D = ((32, 17, 39),) shapes = shapes1D+shapes2D+shapes3D len1D = range(1, 2048) def _l2error(a, b): return np.sqrt(np.sum(np.abs(a-b)**2)/np.sum(np.abs(a)**2)) def _assert_close(a, b, epsilon): err = _l2error(a, b) if (err >= epsilon): print("Error: {} > {}".format(err, epsilon)) assert_(err 1: _assert_close(a, pypocketfft.dct(pypocketfft.dct(c, inorm=inorm, type=type), inorm=2-inorm, type=itype), 2e-18) _assert_close(a, pypocketfft.dct(pypocketfft.dct(a, inorm=inorm, type=type), inorm=2-inorm, type=itype), 1.5e-15) _assert_close(b, pypocketfft.dct(pypocketfft.dct(b, inorm=inorm, type=type), inorm=2-inorm, type=itype), 6e-7) _assert_close(a, pypocketfft.dst(pypocketfft.dst(c, inorm=inorm, type=type), inorm=2-inorm, type=itype), 2e-18) _assert_close(a, pypocketfft.dst(pypocketfft.dst(a, inorm=inorm, type=type), inorm=2-inorm, type=itype), 1.5e-15) _assert_close(b, pypocketfft.dst(pypocketfft.dst(b, inorm=inorm, type=type), inorm=2-inorm, type=itype), 6e-7) # TEMPORARY: separate test for DCT/DST IV, since they are less accurate @pmp("len", len1D) @pmp("inorm", [0, 1, 2]) @pmp("type", [4]) def testdcst1D4(len, inorm, type): a = np.random.rand(len)-0.5 b = a.astype(np.float32) c = a.astype(np.float128) itp = (0, 1, 3, 2, 4) itype = itp[type] if type != 1 or len > 1: _assert_close(a, pypocketfft.dct(pypocketfft.dct(c, inorm=inorm, type=type), inorm=2-inorm, type=itype), 2e-16) _assert_close(a, pypocketfft.dct(pypocketfft.dct(a, inorm=inorm, type=type), inorm=2-inorm, type=itype), 1.5e-13) _assert_close(b, pypocketfft.dct(pypocketfft.dct(b, inorm=inorm, type=type), inorm=2-inorm, type=itype), 6e-5) _assert_close(a, pypocketfft.dst(pypocketfft.dst(c, inorm=inorm, type=type), inorm=2-inorm, type=itype), 2e-16) _assert_close(a, pypocketfft.dst(pypocketfft.dst(a, inorm=inorm, type=type), inorm=2-inorm, type=itype), 1.5e-13) _assert_close(b, pypocketfft.dst(pypocketfft.dst(b, inorm=inorm, type=type), inorm=2-inorm, type=itype), 6e-5)