820 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			820 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								import pickle
							 | 
						||
| 
								 | 
							
								from functools import partial
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import pytest
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import numpy as np
							 | 
						||
| 
								 | 
							
								from numpy.random import MT19937, PCG64, PCG64DXSM, SFC64, Generator, Philox
							 | 
						||
| 
								 | 
							
								from numpy.testing import assert_, assert_array_equal, assert_equal
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@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())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Scalar
							 | 
						||
| 
								 | 
							
								    f(a)
							 | 
						||
| 
								 | 
							
								    # Scalar - size
							 | 
						||
| 
								 | 
							
								    f(a, size=(10, 10))
							 | 
						||
| 
								 | 
							
								    # 1d
							 | 
						||
| 
								 | 
							
								    f(b)
							 | 
						||
| 
								 | 
							
								    # 2d
							 | 
						||
| 
								 | 
							
								    f(c)
							 | 
						||
| 
								 | 
							
								    # 3d
							 | 
						||
| 
								 | 
							
								    f(d)
							 | 
						||
| 
								 | 
							
								    # 1d size
							 | 
						||
| 
								 | 
							
								    f(b, size=10)
							 | 
						||
| 
								 | 
							
								    # 2d - size - broadcast
							 | 
						||
| 
								 | 
							
								    f(e, size=(10, 2))
							 | 
						||
| 
								 | 
							
								    # 3d - size
							 | 
						||
| 
								 | 
							
								    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)
							 | 
						||
| 
								 | 
							
								    elif (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):
							 | 
						||
| 
								 | 
							
								        # Overridden in test classes. Place holder to silence IDE noise
							 | 
						||
| 
								 | 
							
								        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]]  # diagonal covariance
							 | 
						||
| 
								 | 
							
								        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):
							 | 
						||
| 
								 | 
							
								        # This will duplicate some tests that directly instantiate a fresh
							 | 
						||
| 
								 | 
							
								        # Generator(), but that's okay.
							 | 
						||
| 
								 | 
							
								        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):
							 | 
						||
| 
								 | 
							
								        # In order to change the default BitGenerator, we'll go through
							 | 
						||
| 
								 | 
							
								        # a deprecation cycle to move to a different function.
							 | 
						||
| 
								 | 
							
								        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])
							 |