def test_power1d_ordinary_freq(): p = [0] * 40 for i in range(40): pb = PowerBox(8001, dim=1, pk=lambda k: 1.0 * k**-3., boxlength=1.0) p[i], k = get_power(pb.delta_x(), pb.boxlength) assert np.allclose(np.mean(np.array(p), axis=0)[2000:], 1.0 * k[2000:]**-3., rtol=2)
def test_resolution(): var = [0] * 6 for i in range(6): pb = PowerBox(64 * 2**i, dim=2, pk=lambda k: 1.0 * k**-2., boxlength=1.0, angular_freq=True) var[i] = np.var(gaussian_filter(pb.delta_x(), sigma=2**i, mode='wrap')) print(var / var[0]) assert np.allclose(var / var[0], 1, atol=1e-2)
class TestDirect(object): def setup_method(self, test_method): self.pb = PowerBox(N, lambda k: k**-2., dim=1) def test_hermitian(self): ensure_hermitian(self.pb.delta_k()) def test_reality_elementwise(self): ensure_reality_elementwise(self.pb.delta_x()) def test_reality(self): ensure_reality(self.pb.delta_x())
def test_k_zero_ignore(): pb = PowerBox(50, dim=2, pk=lambda k: 1.0 * k**-2., boxlength=1.0, b=1) dx = pb.delta_x() p1, k1 = get_power(dx, pb.boxlength, bin_ave=False) p0, k0 = get_power(dx, pb.boxlength, ignore_zero_mode=True, bin_ave=False) assert np.all(k1 == k0) assert np.all(p1[1:] == p0[1:]) assert p1[0] != p0[0]
def test_ln_vs_straight_standard_freq(): # Set up two boxes with exactly the same parameters pb = PowerBox(128,lambda u : 12.*u**-2., dim=3,seed=1234,boxlength=1200.,a=0,b=2*np.pi) ln_pb = LogNormalPowerBox(128,lambda u : 12.*u**-2., dim=3,seed=1234,boxlength=1200.,a=0,b=2*np.pi) pk = get_power(pb.delta_x(),pb.boxlength,a=0,b=2*np.pi)[0] ln_pk = get_power(ln_pb.delta_x(), pb.boxlength,a=0,b=2*np.pi)[0] pk = pk[1:-1] ln_pk = ln_pk[1:-1] print(np.mean(np.abs((pk-ln_pk)/pk)), np.abs((pk-ln_pk)/pk)) assert np.mean(np.abs((pk-ln_pk)/pk)) < 2e-1 # 10% agreement
def test_power2d(): p = [0] * 5 for i in range(5): pb = PowerBox(200, dim=2, pk=lambda k: 1.0 * k**-2., boxlength=1.0, b=1) p[i], k = get_power(pb.delta_x(), pb.boxlength, b=1) assert np.allclose(np.mean(np.array(p), axis=0)[100:], 1.0 * k[100:]**-2., rtol=2)
def test_power1d_halfN(): p = [0] * 40 for i in range(40): pb = PowerBox(4001, dim=1, pk=lambda k: 1.0 * k**-3., boxlength=1.0, b=1) p[i], k = get_power(pb.delta_x(), pb.boxlength, b=1) assert np.allclose(np.mean(np.array(p), axis=0)[1000:], 1.0 * k[1000:]**-3., rtol=2)
def test_k_weights(): pb = PowerBox(50, dim=2, pk=lambda k: 1.0 * k**-2., boxlength=1.0, b=1) dx = pb.delta_x() k_weights = np.ones_like(dx) k_weights[:, 25] = 0 p1, k1 = get_power(dx, pb.boxlength, bin_ave=False) p0, k0 = get_power(dx, pb.boxlength, bin_ave=False, k_weights=k_weights) assert np.all(k1 == k0) assert not np.allclose(p1, p0)
def test_discrete_power_gaussian(): pb = PowerBox(N=512, dim=2, boxlength=100., pk=lambda u: 0.1 * u**-1.5, ensure_physical=True) sample = pb.create_discrete_sample(nbar=1000.) power, bins = get_power(sample, pb.boxlength, N=pb.N) res = np.mean(np.abs(power[50:-50] / (0.1 * bins[50:-50]**-1.5) - 1)) print(res) assert res < 1e-1
def _powerbox(self): if self.params['use_lognormal']: return LogNormalPowerBox(N=self.ncells, pk=self.params['power_spectrum'], dim=2, boxlength=np.max(self.sky_size).value,a=0,b=2*np.pi) else: return PowerBox(N=self.ncells, pk=self.params['power_spectrum'], dim=2, boxlength=np.max(self.sky_size).value,a=0,b=2*np.pi)
class TestDirectEven(TestDirect): def setup_method(self, test_method): self.pb = PowerBox(N - 1, lambda k: k**-2., dim=2) def test_reality_elementwise(self): return True ## It won't be element-wise correct for even case. def test_reality(self): ensure_reality(self.pb.delta_x())
def powerbox(self): if self.use_lognormal: return LogNormalPowerBox(N=self.ncells, pk=self.point_source_power_spec, dim=2, boxlength=np.max(self.sky_size.value), a=self.a, b=self.b) else: return PowerBox(N=self.ncells, pk=self.point_source_power_spec, dim=2, boxlength=np.max(self.sky_size).value, a=self.a, b=self.b)
def setup_method(self, test_method): self.pb = PowerBox(N - 1, lambda k: k**-2., dim=2)
def test_power3d(): pb = PowerBox(50, dim=2, pk=lambda k: 1.0 * k**-2., boxlength=1.0, b=1) p, k = get_power(pb.delta_x(), pb.boxlength, b=1) print(p / (1.0 * k**-2.)) assert np.allclose(p, 1.0 * k**-2., rtol=2)