| import pickle |
| from functools import partial |
|
|
| import numpy as np |
| import pytest |
| from numpy.testing import assert_equal, assert_, assert_array_equal |
| from numpy.random import (Generator, MT19937, PCG64, PCG64DXSM, Philox, SFC64) |
|
|
| @pytest.fixture(scope='module', |
| params=(np.bool, np.int8, np.int16, np.int32, np.int64, |
| np.uint8, np.uint16, np.uint32, np.uint64)) |
| def dtype(request): |
| return request.param |
|
|
|
|
| def params_0(f): |
| val = f() |
| assert_(np.isscalar(val)) |
| val = f(10) |
| assert_(val.shape == (10,)) |
| val = f((10, 10)) |
| assert_(val.shape == (10, 10)) |
| val = f((10, 10, 10)) |
| assert_(val.shape == (10, 10, 10)) |
| val = f(size=(5, 5)) |
| assert_(val.shape == (5, 5)) |
|
|
|
|
| def params_1(f, bounded=False): |
| a = 5.0 |
| b = np.arange(2.0, 12.0) |
| c = np.arange(2.0, 102.0).reshape((10, 10)) |
| d = np.arange(2.0, 1002.0).reshape((10, 10, 10)) |
| e = np.array([2.0, 3.0]) |
| g = np.arange(2.0, 12.0).reshape((1, 10, 1)) |
| if bounded: |
| a = 0.5 |
| b = b / (1.5 * b.max()) |
| c = c / (1.5 * c.max()) |
| d = d / (1.5 * d.max()) |
| e = e / (1.5 * e.max()) |
| g = g / (1.5 * g.max()) |
|
|
| |
| f(a) |
| |
| f(a, size=(10, 10)) |
| |
| f(b) |
| |
| f(c) |
| |
| f(d) |
| |
| f(b, size=10) |
| |
| f(e, size=(10, 2)) |
| |
| f(g, size=(10, 10, 10)) |
|
|
|
|
| def comp_state(state1, state2): |
| identical = True |
| if isinstance(state1, dict): |
| for key in state1: |
| identical &= comp_state(state1[key], state2[key]) |
| elif type(state1) != type(state2): |
| identical &= type(state1) == type(state2) |
| else: |
| if (isinstance(state1, (list, tuple, np.ndarray)) and isinstance( |
| state2, (list, tuple, np.ndarray))): |
| for s1, s2 in zip(state1, state2): |
| identical &= comp_state(s1, s2) |
| else: |
| identical &= state1 == state2 |
| return identical |
|
|
|
|
| def warmup(rg, n=None): |
| if n is None: |
| n = 11 + np.random.randint(0, 20) |
| rg.standard_normal(n) |
| rg.standard_normal(n) |
| rg.standard_normal(n, dtype=np.float32) |
| rg.standard_normal(n, dtype=np.float32) |
| rg.integers(0, 2 ** 24, n, dtype=np.uint64) |
| rg.integers(0, 2 ** 48, n, dtype=np.uint64) |
| rg.standard_gamma(11.0, n) |
| rg.standard_gamma(11.0, n, dtype=np.float32) |
| rg.random(n, dtype=np.float64) |
| rg.random(n, dtype=np.float32) |
|
|
|
|
| class RNG: |
| @classmethod |
| def setup_class(cls): |
| |
| cls.bit_generator = PCG64 |
| cls.advance = None |
| cls.seed = [12345] |
| cls.rg = Generator(cls.bit_generator(*cls.seed)) |
| cls.initial_state = cls.rg.bit_generator.state |
| cls.seed_vector_bits = 64 |
| cls._extra_setup() |
|
|
| @classmethod |
| def _extra_setup(cls): |
| cls.vec_1d = np.arange(2.0, 102.0) |
| cls.vec_2d = np.arange(2.0, 102.0)[None, :] |
| cls.mat = np.arange(2.0, 102.0, 0.01).reshape((100, 100)) |
| cls.seed_error = TypeError |
|
|
| def _reset_state(self): |
| self.rg.bit_generator.state = self.initial_state |
|
|
| def test_init(self): |
| rg = Generator(self.bit_generator()) |
| state = rg.bit_generator.state |
| rg.standard_normal(1) |
| rg.standard_normal(1) |
| rg.bit_generator.state = state |
| new_state = rg.bit_generator.state |
| assert_(comp_state(state, new_state)) |
|
|
| def test_advance(self): |
| state = self.rg.bit_generator.state |
| if hasattr(self.rg.bit_generator, 'advance'): |
| self.rg.bit_generator.advance(self.advance) |
| assert_(not comp_state(state, self.rg.bit_generator.state)) |
| else: |
| bitgen_name = self.rg.bit_generator.__class__.__name__ |
| pytest.skip(f'Advance is not supported by {bitgen_name}') |
|
|
| def test_jump(self): |
| state = self.rg.bit_generator.state |
| if hasattr(self.rg.bit_generator, 'jumped'): |
| bit_gen2 = self.rg.bit_generator.jumped() |
| jumped_state = bit_gen2.state |
| assert_(not comp_state(state, jumped_state)) |
| self.rg.random(2 * 3 * 5 * 7 * 11 * 13 * 17) |
| self.rg.bit_generator.state = state |
| bit_gen3 = self.rg.bit_generator.jumped() |
| rejumped_state = bit_gen3.state |
| assert_(comp_state(jumped_state, rejumped_state)) |
| else: |
| bitgen_name = self.rg.bit_generator.__class__.__name__ |
| if bitgen_name not in ('SFC64',): |
| raise AttributeError(f'no "jumped" in {bitgen_name}') |
| pytest.skip(f'Jump is not supported by {bitgen_name}') |
|
|
| def test_uniform(self): |
| r = self.rg.uniform(-1.0, 0.0, size=10) |
| assert_(len(r) == 10) |
| assert_((r > -1).all()) |
| assert_((r <= 0).all()) |
|
|
| def test_uniform_array(self): |
| r = self.rg.uniform(np.array([-1.0] * 10), 0.0, size=10) |
| assert_(len(r) == 10) |
| assert_((r > -1).all()) |
| assert_((r <= 0).all()) |
| r = self.rg.uniform(np.array([-1.0] * 10), |
| np.array([0.0] * 10), size=10) |
| assert_(len(r) == 10) |
| assert_((r > -1).all()) |
| assert_((r <= 0).all()) |
| r = self.rg.uniform(-1.0, np.array([0.0] * 10), size=10) |
| assert_(len(r) == 10) |
| assert_((r > -1).all()) |
| assert_((r <= 0).all()) |
|
|
| def test_random(self): |
| assert_(len(self.rg.random(10)) == 10) |
| params_0(self.rg.random) |
|
|
| def test_standard_normal_zig(self): |
| assert_(len(self.rg.standard_normal(10)) == 10) |
|
|
| def test_standard_normal(self): |
| assert_(len(self.rg.standard_normal(10)) == 10) |
| params_0(self.rg.standard_normal) |
|
|
| def test_standard_gamma(self): |
| assert_(len(self.rg.standard_gamma(10, 10)) == 10) |
| assert_(len(self.rg.standard_gamma(np.array([10] * 10), 10)) == 10) |
| params_1(self.rg.standard_gamma) |
|
|
| def test_standard_exponential(self): |
| assert_(len(self.rg.standard_exponential(10)) == 10) |
| params_0(self.rg.standard_exponential) |
|
|
| def test_standard_exponential_float(self): |
| randoms = self.rg.standard_exponential(10, dtype='float32') |
| assert_(len(randoms) == 10) |
| assert randoms.dtype == np.float32 |
| params_0(partial(self.rg.standard_exponential, dtype='float32')) |
|
|
| def test_standard_exponential_float_log(self): |
| randoms = self.rg.standard_exponential(10, dtype='float32', |
| method='inv') |
| assert_(len(randoms) == 10) |
| assert randoms.dtype == np.float32 |
| params_0(partial(self.rg.standard_exponential, dtype='float32', |
| method='inv')) |
|
|
| def test_standard_cauchy(self): |
| assert_(len(self.rg.standard_cauchy(10)) == 10) |
| params_0(self.rg.standard_cauchy) |
|
|
| def test_standard_t(self): |
| assert_(len(self.rg.standard_t(10, 10)) == 10) |
| params_1(self.rg.standard_t) |
|
|
| def test_binomial(self): |
| assert_(self.rg.binomial(10, .5) >= 0) |
| assert_(self.rg.binomial(1000, .5) >= 0) |
|
|
| def test_reset_state(self): |
| state = self.rg.bit_generator.state |
| int_1 = self.rg.integers(2**31) |
| self.rg.bit_generator.state = state |
| int_2 = self.rg.integers(2**31) |
| assert_(int_1 == int_2) |
|
|
| def test_entropy_init(self): |
| rg = Generator(self.bit_generator()) |
| rg2 = Generator(self.bit_generator()) |
| assert_(not comp_state(rg.bit_generator.state, |
| rg2.bit_generator.state)) |
|
|
| def test_seed(self): |
| rg = Generator(self.bit_generator(*self.seed)) |
| rg2 = Generator(self.bit_generator(*self.seed)) |
| rg.random() |
| rg2.random() |
| assert_(comp_state(rg.bit_generator.state, rg2.bit_generator.state)) |
|
|
| def test_reset_state_gauss(self): |
| rg = Generator(self.bit_generator(*self.seed)) |
| rg.standard_normal() |
| state = rg.bit_generator.state |
| n1 = rg.standard_normal(size=10) |
| rg2 = Generator(self.bit_generator()) |
| rg2.bit_generator.state = state |
| n2 = rg2.standard_normal(size=10) |
| assert_array_equal(n1, n2) |
|
|
| def test_reset_state_uint32(self): |
| rg = Generator(self.bit_generator(*self.seed)) |
| rg.integers(0, 2 ** 24, 120, dtype=np.uint32) |
| state = rg.bit_generator.state |
| n1 = rg.integers(0, 2 ** 24, 10, dtype=np.uint32) |
| rg2 = Generator(self.bit_generator()) |
| rg2.bit_generator.state = state |
| n2 = rg2.integers(0, 2 ** 24, 10, dtype=np.uint32) |
| assert_array_equal(n1, n2) |
|
|
| def test_reset_state_float(self): |
| rg = Generator(self.bit_generator(*self.seed)) |
| rg.random(dtype='float32') |
| state = rg.bit_generator.state |
| n1 = rg.random(size=10, dtype='float32') |
| rg2 = Generator(self.bit_generator()) |
| rg2.bit_generator.state = state |
| n2 = rg2.random(size=10, dtype='float32') |
| assert_((n1 == n2).all()) |
|
|
| def test_shuffle(self): |
| original = np.arange(200, 0, -1) |
| permuted = self.rg.permutation(original) |
| assert_((original != permuted).any()) |
|
|
| def test_permutation(self): |
| original = np.arange(200, 0, -1) |
| permuted = self.rg.permutation(original) |
| assert_((original != permuted).any()) |
|
|
| def test_beta(self): |
| vals = self.rg.beta(2.0, 2.0, 10) |
| assert_(len(vals) == 10) |
| vals = self.rg.beta(np.array([2.0] * 10), 2.0) |
| assert_(len(vals) == 10) |
| vals = self.rg.beta(2.0, np.array([2.0] * 10)) |
| assert_(len(vals) == 10) |
| vals = self.rg.beta(np.array([2.0] * 10), np.array([2.0] * 10)) |
| assert_(len(vals) == 10) |
| vals = self.rg.beta(np.array([2.0] * 10), np.array([[2.0]] * 10)) |
| assert_(vals.shape == (10, 10)) |
|
|
| def test_bytes(self): |
| vals = self.rg.bytes(10) |
| assert_(len(vals) == 10) |
|
|
| def test_chisquare(self): |
| vals = self.rg.chisquare(2.0, 10) |
| assert_(len(vals) == 10) |
| params_1(self.rg.chisquare) |
|
|
| def test_exponential(self): |
| vals = self.rg.exponential(2.0, 10) |
| assert_(len(vals) == 10) |
| params_1(self.rg.exponential) |
|
|
| def test_f(self): |
| vals = self.rg.f(3, 1000, 10) |
| assert_(len(vals) == 10) |
|
|
| def test_gamma(self): |
| vals = self.rg.gamma(3, 2, 10) |
| assert_(len(vals) == 10) |
|
|
| def test_geometric(self): |
| vals = self.rg.geometric(0.5, 10) |
| assert_(len(vals) == 10) |
| params_1(self.rg.exponential, bounded=True) |
|
|
| def test_gumbel(self): |
| vals = self.rg.gumbel(2.0, 2.0, 10) |
| assert_(len(vals) == 10) |
|
|
| def test_laplace(self): |
| vals = self.rg.laplace(2.0, 2.0, 10) |
| assert_(len(vals) == 10) |
|
|
| def test_logitic(self): |
| vals = self.rg.logistic(2.0, 2.0, 10) |
| assert_(len(vals) == 10) |
|
|
| def test_logseries(self): |
| vals = self.rg.logseries(0.5, 10) |
| assert_(len(vals) == 10) |
|
|
| def test_negative_binomial(self): |
| vals = self.rg.negative_binomial(10, 0.2, 10) |
| assert_(len(vals) == 10) |
|
|
| def test_noncentral_chisquare(self): |
| vals = self.rg.noncentral_chisquare(10, 2, 10) |
| assert_(len(vals) == 10) |
|
|
| def test_noncentral_f(self): |
| vals = self.rg.noncentral_f(3, 1000, 2, 10) |
| assert_(len(vals) == 10) |
| vals = self.rg.noncentral_f(np.array([3] * 10), 1000, 2) |
| assert_(len(vals) == 10) |
| vals = self.rg.noncentral_f(3, np.array([1000] * 10), 2) |
| assert_(len(vals) == 10) |
| vals = self.rg.noncentral_f(3, 1000, np.array([2] * 10)) |
| assert_(len(vals) == 10) |
|
|
| def test_normal(self): |
| vals = self.rg.normal(10, 0.2, 10) |
| assert_(len(vals) == 10) |
|
|
| def test_pareto(self): |
| vals = self.rg.pareto(3.0, 10) |
| assert_(len(vals) == 10) |
|
|
| def test_poisson(self): |
| vals = self.rg.poisson(10, 10) |
| assert_(len(vals) == 10) |
| vals = self.rg.poisson(np.array([10] * 10)) |
| assert_(len(vals) == 10) |
| params_1(self.rg.poisson) |
|
|
| def test_power(self): |
| vals = self.rg.power(0.2, 10) |
| assert_(len(vals) == 10) |
|
|
| def test_integers(self): |
| vals = self.rg.integers(10, 20, 10) |
| assert_(len(vals) == 10) |
|
|
| def test_rayleigh(self): |
| vals = self.rg.rayleigh(0.2, 10) |
| assert_(len(vals) == 10) |
| params_1(self.rg.rayleigh, bounded=True) |
|
|
| def test_vonmises(self): |
| vals = self.rg.vonmises(10, 0.2, 10) |
| assert_(len(vals) == 10) |
|
|
| def test_wald(self): |
| vals = self.rg.wald(1.0, 1.0, 10) |
| assert_(len(vals) == 10) |
|
|
| def test_weibull(self): |
| vals = self.rg.weibull(1.0, 10) |
| assert_(len(vals) == 10) |
|
|
| def test_zipf(self): |
| vals = self.rg.zipf(10, 10) |
| assert_(len(vals) == 10) |
| vals = self.rg.zipf(self.vec_1d) |
| assert_(len(vals) == 100) |
| vals = self.rg.zipf(self.vec_2d) |
| assert_(vals.shape == (1, 100)) |
| vals = self.rg.zipf(self.mat) |
| assert_(vals.shape == (100, 100)) |
|
|
| def test_hypergeometric(self): |
| vals = self.rg.hypergeometric(25, 25, 20) |
| assert_(np.isscalar(vals)) |
| vals = self.rg.hypergeometric(np.array([25] * 10), 25, 20) |
| assert_(vals.shape == (10,)) |
|
|
| def test_triangular(self): |
| vals = self.rg.triangular(-5, 0, 5) |
| assert_(np.isscalar(vals)) |
| vals = self.rg.triangular(-5, np.array([0] * 10), 5) |
| assert_(vals.shape == (10,)) |
|
|
| def test_multivariate_normal(self): |
| mean = [0, 0] |
| cov = [[1, 0], [0, 100]] |
| x = self.rg.multivariate_normal(mean, cov, 5000) |
| assert_(x.shape == (5000, 2)) |
| x_zig = self.rg.multivariate_normal(mean, cov, 5000) |
| assert_(x.shape == (5000, 2)) |
| x_inv = self.rg.multivariate_normal(mean, cov, 5000) |
| assert_(x.shape == (5000, 2)) |
| assert_((x_zig != x_inv).any()) |
|
|
| def test_multinomial(self): |
| vals = self.rg.multinomial(100, [1.0 / 3, 2.0 / 3]) |
| assert_(vals.shape == (2,)) |
| vals = self.rg.multinomial(100, [1.0 / 3, 2.0 / 3], size=10) |
| assert_(vals.shape == (10, 2)) |
|
|
| def test_dirichlet(self): |
| s = self.rg.dirichlet((10, 5, 3), 20) |
| assert_(s.shape == (20, 3)) |
|
|
| def test_pickle(self): |
| pick = pickle.dumps(self.rg) |
| unpick = pickle.loads(pick) |
| assert_(type(self.rg) == type(unpick)) |
| assert_(comp_state(self.rg.bit_generator.state, |
| unpick.bit_generator.state)) |
|
|
| pick = pickle.dumps(self.rg) |
| unpick = pickle.loads(pick) |
| assert_(type(self.rg) == type(unpick)) |
| assert_(comp_state(self.rg.bit_generator.state, |
| unpick.bit_generator.state)) |
|
|
| def test_seed_array(self): |
| if self.seed_vector_bits is None: |
| bitgen_name = self.bit_generator.__name__ |
| pytest.skip(f'Vector seeding is not supported by {bitgen_name}') |
|
|
| if self.seed_vector_bits == 32: |
| dtype = np.uint32 |
| else: |
| dtype = np.uint64 |
| seed = np.array([1], dtype=dtype) |
| bg = self.bit_generator(seed) |
| state1 = bg.state |
| bg = self.bit_generator(1) |
| state2 = bg.state |
| assert_(comp_state(state1, state2)) |
|
|
| seed = np.arange(4, dtype=dtype) |
| bg = self.bit_generator(seed) |
| state1 = bg.state |
| bg = self.bit_generator(seed[0]) |
| state2 = bg.state |
| assert_(not comp_state(state1, state2)) |
|
|
| seed = np.arange(1500, dtype=dtype) |
| bg = self.bit_generator(seed) |
| state1 = bg.state |
| bg = self.bit_generator(seed[0]) |
| state2 = bg.state |
| assert_(not comp_state(state1, state2)) |
|
|
| seed = 2 ** np.mod(np.arange(1500, dtype=dtype), |
| self.seed_vector_bits - 1) + 1 |
| bg = self.bit_generator(seed) |
| state1 = bg.state |
| bg = self.bit_generator(seed[0]) |
| state2 = bg.state |
| assert_(not comp_state(state1, state2)) |
|
|
| def test_uniform_float(self): |
| rg = Generator(self.bit_generator(12345)) |
| warmup(rg) |
| state = rg.bit_generator.state |
| r1 = rg.random(11, dtype=np.float32) |
| rg2 = Generator(self.bit_generator()) |
| warmup(rg2) |
| rg2.bit_generator.state = state |
| r2 = rg2.random(11, dtype=np.float32) |
| assert_array_equal(r1, r2) |
| assert_equal(r1.dtype, np.float32) |
| assert_(comp_state(rg.bit_generator.state, rg2.bit_generator.state)) |
|
|
| def test_gamma_floats(self): |
| rg = Generator(self.bit_generator()) |
| warmup(rg) |
| state = rg.bit_generator.state |
| r1 = rg.standard_gamma(4.0, 11, dtype=np.float32) |
| rg2 = Generator(self.bit_generator()) |
| warmup(rg2) |
| rg2.bit_generator.state = state |
| r2 = rg2.standard_gamma(4.0, 11, dtype=np.float32) |
| assert_array_equal(r1, r2) |
| assert_equal(r1.dtype, np.float32) |
| assert_(comp_state(rg.bit_generator.state, rg2.bit_generator.state)) |
|
|
| def test_normal_floats(self): |
| rg = Generator(self.bit_generator()) |
| warmup(rg) |
| state = rg.bit_generator.state |
| r1 = rg.standard_normal(11, dtype=np.float32) |
| rg2 = Generator(self.bit_generator()) |
| warmup(rg2) |
| rg2.bit_generator.state = state |
| r2 = rg2.standard_normal(11, dtype=np.float32) |
| assert_array_equal(r1, r2) |
| assert_equal(r1.dtype, np.float32) |
| assert_(comp_state(rg.bit_generator.state, rg2.bit_generator.state)) |
|
|
| def test_normal_zig_floats(self): |
| rg = Generator(self.bit_generator()) |
| warmup(rg) |
| state = rg.bit_generator.state |
| r1 = rg.standard_normal(11, dtype=np.float32) |
| rg2 = Generator(self.bit_generator()) |
| warmup(rg2) |
| rg2.bit_generator.state = state |
| r2 = rg2.standard_normal(11, dtype=np.float32) |
| assert_array_equal(r1, r2) |
| assert_equal(r1.dtype, np.float32) |
| assert_(comp_state(rg.bit_generator.state, rg2.bit_generator.state)) |
|
|
| def test_output_fill(self): |
| rg = self.rg |
| state = rg.bit_generator.state |
| size = (31, 7, 97) |
| existing = np.empty(size) |
| rg.bit_generator.state = state |
| rg.standard_normal(out=existing) |
| rg.bit_generator.state = state |
| direct = rg.standard_normal(size=size) |
| assert_equal(direct, existing) |
|
|
| sized = np.empty(size) |
| rg.bit_generator.state = state |
| rg.standard_normal(out=sized, size=sized.shape) |
|
|
| existing = np.empty(size, dtype=np.float32) |
| rg.bit_generator.state = state |
| rg.standard_normal(out=existing, dtype=np.float32) |
| rg.bit_generator.state = state |
| direct = rg.standard_normal(size=size, dtype=np.float32) |
| assert_equal(direct, existing) |
|
|
| def test_output_filling_uniform(self): |
| rg = self.rg |
| state = rg.bit_generator.state |
| size = (31, 7, 97) |
| existing = np.empty(size) |
| rg.bit_generator.state = state |
| rg.random(out=existing) |
| rg.bit_generator.state = state |
| direct = rg.random(size=size) |
| assert_equal(direct, existing) |
|
|
| existing = np.empty(size, dtype=np.float32) |
| rg.bit_generator.state = state |
| rg.random(out=existing, dtype=np.float32) |
| rg.bit_generator.state = state |
| direct = rg.random(size=size, dtype=np.float32) |
| assert_equal(direct, existing) |
|
|
| def test_output_filling_exponential(self): |
| rg = self.rg |
| state = rg.bit_generator.state |
| size = (31, 7, 97) |
| existing = np.empty(size) |
| rg.bit_generator.state = state |
| rg.standard_exponential(out=existing) |
| rg.bit_generator.state = state |
| direct = rg.standard_exponential(size=size) |
| assert_equal(direct, existing) |
|
|
| existing = np.empty(size, dtype=np.float32) |
| rg.bit_generator.state = state |
| rg.standard_exponential(out=existing, dtype=np.float32) |
| rg.bit_generator.state = state |
| direct = rg.standard_exponential(size=size, dtype=np.float32) |
| assert_equal(direct, existing) |
|
|
| def test_output_filling_gamma(self): |
| rg = self.rg |
| state = rg.bit_generator.state |
| size = (31, 7, 97) |
| existing = np.zeros(size) |
| rg.bit_generator.state = state |
| rg.standard_gamma(1.0, out=existing) |
| rg.bit_generator.state = state |
| direct = rg.standard_gamma(1.0, size=size) |
| assert_equal(direct, existing) |
|
|
| existing = np.zeros(size, dtype=np.float32) |
| rg.bit_generator.state = state |
| rg.standard_gamma(1.0, out=existing, dtype=np.float32) |
| rg.bit_generator.state = state |
| direct = rg.standard_gamma(1.0, size=size, dtype=np.float32) |
| assert_equal(direct, existing) |
|
|
| def test_output_filling_gamma_broadcast(self): |
| rg = self.rg |
| state = rg.bit_generator.state |
| size = (31, 7, 97) |
| mu = np.arange(97.0) + 1.0 |
| existing = np.zeros(size) |
| rg.bit_generator.state = state |
| rg.standard_gamma(mu, out=existing) |
| rg.bit_generator.state = state |
| direct = rg.standard_gamma(mu, size=size) |
| assert_equal(direct, existing) |
|
|
| existing = np.zeros(size, dtype=np.float32) |
| rg.bit_generator.state = state |
| rg.standard_gamma(mu, out=existing, dtype=np.float32) |
| rg.bit_generator.state = state |
| direct = rg.standard_gamma(mu, size=size, dtype=np.float32) |
| assert_equal(direct, existing) |
|
|
| def test_output_fill_error(self): |
| rg = self.rg |
| size = (31, 7, 97) |
| existing = np.empty(size) |
| with pytest.raises(TypeError): |
| rg.standard_normal(out=existing, dtype=np.float32) |
| with pytest.raises(ValueError): |
| rg.standard_normal(out=existing[::3]) |
| existing = np.empty(size, dtype=np.float32) |
| with pytest.raises(TypeError): |
| rg.standard_normal(out=existing, dtype=np.float64) |
|
|
| existing = np.zeros(size, dtype=np.float32) |
| with pytest.raises(TypeError): |
| rg.standard_gamma(1.0, out=existing, dtype=np.float64) |
| with pytest.raises(ValueError): |
| rg.standard_gamma(1.0, out=existing[::3], dtype=np.float32) |
| existing = np.zeros(size, dtype=np.float64) |
| with pytest.raises(TypeError): |
| rg.standard_gamma(1.0, out=existing, dtype=np.float32) |
| with pytest.raises(ValueError): |
| rg.standard_gamma(1.0, out=existing[::3]) |
|
|
| def test_integers_broadcast(self, dtype): |
| if dtype == np.bool: |
| upper = 2 |
| lower = 0 |
| else: |
| info = np.iinfo(dtype) |
| upper = int(info.max) + 1 |
| lower = info.min |
| self._reset_state() |
| a = self.rg.integers(lower, [upper] * 10, dtype=dtype) |
| self._reset_state() |
| b = self.rg.integers([lower] * 10, upper, dtype=dtype) |
| assert_equal(a, b) |
| self._reset_state() |
| c = self.rg.integers(lower, upper, size=10, dtype=dtype) |
| assert_equal(a, c) |
| self._reset_state() |
| d = self.rg.integers(np.array( |
| [lower] * 10), np.array([upper], dtype=object), size=10, |
| dtype=dtype) |
| assert_equal(a, d) |
| self._reset_state() |
| e = self.rg.integers( |
| np.array([lower] * 10), np.array([upper] * 10), size=10, |
| dtype=dtype) |
| assert_equal(a, e) |
|
|
| self._reset_state() |
| a = self.rg.integers(0, upper, size=10, dtype=dtype) |
| self._reset_state() |
| b = self.rg.integers([upper] * 10, dtype=dtype) |
| assert_equal(a, b) |
|
|
| def test_integers_numpy(self, dtype): |
| high = np.array([1]) |
| low = np.array([0]) |
|
|
| out = self.rg.integers(low, high, dtype=dtype) |
| assert out.shape == (1,) |
|
|
| out = self.rg.integers(low[0], high, dtype=dtype) |
| assert out.shape == (1,) |
|
|
| out = self.rg.integers(low, high[0], dtype=dtype) |
| assert out.shape == (1,) |
|
|
| def test_integers_broadcast_errors(self, dtype): |
| if dtype == np.bool: |
| upper = 2 |
| lower = 0 |
| else: |
| info = np.iinfo(dtype) |
| upper = int(info.max) + 1 |
| lower = info.min |
| with pytest.raises(ValueError): |
| self.rg.integers(lower, [upper + 1] * 10, dtype=dtype) |
| with pytest.raises(ValueError): |
| self.rg.integers(lower - 1, [upper] * 10, dtype=dtype) |
| with pytest.raises(ValueError): |
| self.rg.integers([lower - 1], [upper] * 10, dtype=dtype) |
| with pytest.raises(ValueError): |
| self.rg.integers([0], [0], dtype=dtype) |
|
|
|
|
| class TestMT19937(RNG): |
| @classmethod |
| def setup_class(cls): |
| cls.bit_generator = MT19937 |
| cls.advance = None |
| cls.seed = [2 ** 21 + 2 ** 16 + 2 ** 5 + 1] |
| cls.rg = Generator(cls.bit_generator(*cls.seed)) |
| cls.initial_state = cls.rg.bit_generator.state |
| cls.seed_vector_bits = 32 |
| cls._extra_setup() |
| cls.seed_error = ValueError |
|
|
| def test_numpy_state(self): |
| nprg = np.random.RandomState() |
| nprg.standard_normal(99) |
| state = nprg.get_state() |
| self.rg.bit_generator.state = state |
| state2 = self.rg.bit_generator.state |
| assert_((state[1] == state2['state']['key']).all()) |
| assert_(state[2] == state2['state']['pos']) |
|
|
|
|
| class TestPhilox(RNG): |
| @classmethod |
| def setup_class(cls): |
| cls.bit_generator = Philox |
| cls.advance = 2**63 + 2**31 + 2**15 + 1 |
| cls.seed = [12345] |
| cls.rg = Generator(cls.bit_generator(*cls.seed)) |
| cls.initial_state = cls.rg.bit_generator.state |
| cls.seed_vector_bits = 64 |
| cls._extra_setup() |
|
|
|
|
| class TestSFC64(RNG): |
| @classmethod |
| def setup_class(cls): |
| cls.bit_generator = SFC64 |
| cls.advance = None |
| cls.seed = [12345] |
| cls.rg = Generator(cls.bit_generator(*cls.seed)) |
| cls.initial_state = cls.rg.bit_generator.state |
| cls.seed_vector_bits = 192 |
| cls._extra_setup() |
|
|
|
|
| class TestPCG64(RNG): |
| @classmethod |
| def setup_class(cls): |
| cls.bit_generator = PCG64 |
| cls.advance = 2**63 + 2**31 + 2**15 + 1 |
| cls.seed = [12345] |
| cls.rg = Generator(cls.bit_generator(*cls.seed)) |
| cls.initial_state = cls.rg.bit_generator.state |
| cls.seed_vector_bits = 64 |
| cls._extra_setup() |
|
|
|
|
| class TestPCG64DXSM(RNG): |
| @classmethod |
| def setup_class(cls): |
| cls.bit_generator = PCG64DXSM |
| cls.advance = 2**63 + 2**31 + 2**15 + 1 |
| cls.seed = [12345] |
| cls.rg = Generator(cls.bit_generator(*cls.seed)) |
| cls.initial_state = cls.rg.bit_generator.state |
| cls.seed_vector_bits = 64 |
| cls._extra_setup() |
|
|
|
|
| class TestDefaultRNG(RNG): |
| @classmethod |
| def setup_class(cls): |
| |
| |
| cls.bit_generator = PCG64 |
| cls.advance = 2**63 + 2**31 + 2**15 + 1 |
| cls.seed = [12345] |
| cls.rg = np.random.default_rng(*cls.seed) |
| cls.initial_state = cls.rg.bit_generator.state |
| cls.seed_vector_bits = 64 |
| cls._extra_setup() |
|
|
| def test_default_is_pcg64(self): |
| |
| |
| assert_(isinstance(self.rg.bit_generator, PCG64)) |
|
|
| def test_seed(self): |
| np.random.default_rng() |
| np.random.default_rng(None) |
| np.random.default_rng(12345) |
| np.random.default_rng(0) |
| np.random.default_rng(43660444402423911716352051725018508569) |
| np.random.default_rng([43660444402423911716352051725018508569, |
| 279705150948142787361475340226491943209]) |
| with pytest.raises(ValueError): |
| np.random.default_rng(-1) |
| with pytest.raises(ValueError): |
| np.random.default_rng([12345, -1]) |
|
|