Skip to content

Commit 95ee88f

Browse files
committed
ENH: remove convenience functions, require explicit call to gen.brng
1 parent a8027f7 commit 95ee88f

File tree

8 files changed

+285
-340
lines changed

8 files changed

+285
-340
lines changed

doc/source/reference/randomgen/generator.rst

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,12 @@ changed by passing an instantized basic RNG to ``RandomGenerator``.
1515
.. autoclass:: RandomGenerator
1616
:exclude-members:
1717

18-
Seed and State Manipulation
19-
===========================
18+
Accessing the RNG
19+
=================
2020
.. autosummary::
2121
:toctree: generated/
2222

23-
~RandomGenerator.seed
24-
~RandomGenerator.state
23+
~RandomGenerator.brng
2524

2625
Simple random data
2726
==================

doc/source/reference/randomgen/new-or-different.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ What's New or Different
6464

6565
.. ipython:: python
6666
67-
rg.seed(0)
67+
rg.brng.seed(0)
6868
rg.random_sample(3, dtype='d')
69-
rg.seed(0)
69+
rg.brng.seed(0)
7070
rg.random_sample(3, dtype='f')
7171
7272
* Optional ``out`` argument that allows existing arrays to be filled for

numpy/random/randomgen/generator.pyx

Lines changed: 7 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ cdef class RandomGenerator:
7272
>>> rg = MT19937().generator
7373
>>> rg.standard_normal()
7474
"""
75-
cdef public object _basicrng
75+
cdef public object brng
7676
cdef brng_t *_brng
7777
cdef binomial_t *_binomial
7878
cdef object lock
@@ -81,7 +81,7 @@ cdef class RandomGenerator:
8181
def __init__(self, brng=None):
8282
if brng is None:
8383
brng = Xoroshiro128()
84-
self._basicrng = brng
84+
self.brng = brng
8585

8686
capsule = brng.capsule
8787
cdef const char *name = "BasicRNG"
@@ -99,79 +99,21 @@ cdef class RandomGenerator:
9999

100100
def __str__(self):
101101
_str = self.__class__.__name__
102-
_str += '(' + self._basicrng.__class__.__name__ + ')'
102+
_str += '(' + self.brng.__class__.__name__ + ')'
103103
return _str
104104

105105
# Pickling support:
106106
def __getstate__(self):
107-
return self.state
107+
return self.brng.state
108108

109109
def __setstate__(self, state):
110-
self.state = state
110+
self.brng.state = state
111111

112112
def __reduce__(self):
113113
from ._pickle import __generator_ctor
114114
return (__generator_ctor,
115-
(self.state['brng'],),
116-
self.state)
117-
118-
def seed(self, *args, **kwargs):
119-
"""
120-
Reseed the basic RNG.
121-
122-
Parameters depend on the basic RNG used.
123-
124-
Notes
125-
-----
126-
Arguments are directly passed to the basic RNG. This is a convenience
127-
function.
128-
129-
The best method to access seed is to directly use a basic RNG instance.
130-
This example demonstrates this best practice.
131-
132-
>>> from numpy.random.randomgen import RandomGenerator, PCG64
133-
>>> brng = PCG64(1234567891011)
134-
>>> rg = brng.generator
135-
>>> brng.seed(1110987654321)
136-
137-
The method used to create the generator is not important.
138-
139-
>>> brng = PCG64(1234567891011)
140-
>>> rg = RandomGenerator(brng)
141-
>>> brng.seed(1110987654321)
142-
143-
These best practice examples are equivalent to
144-
145-
>>> rg = RandomGenerator(PCG64(1234567891011))
146-
>>> rg.seed(1110987654321)
147-
148-
"""
149-
# TODO: Should this remain
150-
self._basicrng.seed(*args, **kwargs)
151-
return self
152-
153-
@property
154-
def state(self):
155-
"""
156-
Get or set the Basic RNG's state
157-
158-
Returns
159-
-------
160-
state : dict
161-
Dictionary containing the information required to describe the
162-
state of the Basic RNG
163-
164-
Notes
165-
-----
166-
This is a trivial pass-through function. RandomGenerator does not
167-
directly contain or manipulate the basic RNG's state.
168-
169-
"""
170-
return self._basicrng.state
171-
172-
@state.setter
173-
def state(self, value):
174-
self._basicrng.state = value
115+
(self.brng.state['brng'],),
116+
self.brng.state)
175117

176118
def random_sample(self, size=None, dtype=np.float64, out=None):
177119
"""

numpy/random/randomgen/tests/test_against_numpy.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,12 @@ def setup_class(cls):
9898
cls.rg = RandomGenerator(cls.brng(*cls.seed))
9999
cls.rs = RandomState(cls.brng(*cls.seed))
100100
cls.nprs = cls.np.RandomState(*cls.seed)
101-
cls.initial_state = cls.rg.state
101+
cls.initial_state = cls.rg.brng.state
102102
cls._set_common_state()
103103

104104
@classmethod
105105
def _set_common_state(cls):
106-
state = cls.rg.state
106+
state = cls.rg.brng.state
107107
st = [[]] * 5
108108
st[0] = 'MT19937'
109109
st[1] = state['state']['key']
@@ -125,7 +125,7 @@ def _set_common_state_legacy(cls):
125125

126126
def _is_state_common(self):
127127
state = self.nprs.get_state()
128-
state2 = self.rg.state
128+
state2 = self.rg.brng.state
129129
assert (state[1] == state2['state']['key']).all()
130130
assert (state[2] == state2['state']['pos'])
131131

@@ -138,19 +138,19 @@ def _is_state_common_legacy(self):
138138
assert_allclose(state[4], state2['gauss'], atol=1e-10)
139139

140140
def test_common_seed(self):
141-
self.rg.seed(1234)
141+
self.rg.brng.seed(1234)
142142
self.nprs.seed(1234)
143143
self._is_state_common()
144-
self.rg.seed(23456)
144+
self.rg.brng.seed(23456)
145145
self.nprs.seed(23456)
146146
self._is_state_common()
147147

148148
def test_numpy_state(self):
149149
nprs = np.random.RandomState()
150150
nprs.standard_normal(99)
151151
state = nprs.get_state()
152-
self.rg.state = state
153-
state2 = self.rg.state
152+
self.rg.brng.state = state
153+
state2 = self.rg.brng.state
154154
assert (state[1] == state2['state']['key']).all()
155155
assert (state[2] == state2['state']['pos'])
156156

@@ -383,7 +383,7 @@ def test_scalar(self):
383383
assert_equal(s1.randint(1000), 419)
384384
assert_equal(s1.randint(1000), s.randint(1000))
385385

386-
self.rg.seed(4294967295)
386+
self.rg.brng.seed(4294967295)
387387
self.nprs.seed(4294967295)
388388
self._is_state_common()
389389

@@ -403,9 +403,10 @@ def test_array(self):
403403
def test_dir(self):
404404
nprs_d = set(dir(self.nprs))
405405
rs_d = dir(self.rg)
406-
excluded = {'get_state', 'set_state'}
406+
excluded = {'get_state', 'set_state', '_basicrng', 'seed', '__getstate__'}
407407
nprs_d.difference_update(excluded)
408-
assert (len(nprs_d.difference(rs_d)) == 0)
408+
d = nprs_d.difference(rs_d)
409+
assert (len(d) == 0)
409410

410411
npmod = dir(numpy.random)
411412
mod = dir(generator)

numpy/random/randomgen/tests/test_direct.py

Lines changed: 53 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -206,30 +206,30 @@ def test_uniform_float(self):
206206
def test_seed_float(self):
207207
# GH #82
208208
rs = RandomGenerator(self.brng(*self.data1['seed']))
209-
assert_raises(self.seed_error_type, rs.seed, np.pi)
210-
assert_raises(self.seed_error_type, rs.seed, -np.pi)
209+
assert_raises(self.seed_error_type, rs.brng.seed, np.pi)
210+
assert_raises(self.seed_error_type, rs.brng.seed, -np.pi)
211211

212212
def test_seed_float_array(self):
213213
# GH #82
214214
rs = RandomGenerator(self.brng(*self.data1['seed']))
215-
assert_raises(self.seed_error_type, rs.seed, np.array([np.pi]))
216-
assert_raises(self.seed_error_type, rs.seed, np.array([-np.pi]))
217-
assert_raises(ValueError, rs.seed, np.array([np.pi, -np.pi]))
218-
assert_raises(TypeError, rs.seed, np.array([0, np.pi]))
219-
assert_raises(TypeError, rs.seed, [np.pi])
220-
assert_raises(TypeError, rs.seed, [0, np.pi])
215+
assert_raises(self.seed_error_type, rs.brng.seed, np.array([np.pi]))
216+
assert_raises(self.seed_error_type, rs.brng.seed, np.array([-np.pi]))
217+
assert_raises(ValueError, rs.brng.seed, np.array([np.pi, -np.pi]))
218+
assert_raises(TypeError, rs.brng.seed, np.array([0, np.pi]))
219+
assert_raises(TypeError, rs.brng.seed, [np.pi])
220+
assert_raises(TypeError, rs.brng.seed, [0, np.pi])
221221

222222
def test_seed_out_of_range(self):
223223
# GH #82
224224
rs = RandomGenerator(self.brng(*self.data1['seed']))
225-
assert_raises(ValueError, rs.seed, 2 ** (2 * self.bits + 1))
226-
assert_raises(ValueError, rs.seed, -1)
225+
assert_raises(ValueError, rs.brng.seed, 2 ** (2 * self.bits + 1))
226+
assert_raises(ValueError, rs.brng.seed, -1)
227227

228228
def test_seed_out_of_range_array(self):
229229
# GH #82
230230
rs = RandomGenerator(self.brng(*self.data1['seed']))
231-
assert_raises(ValueError, rs.seed, [2 ** (2 * self.bits + 1)])
232-
assert_raises(ValueError, rs.seed, [-1])
231+
assert_raises(ValueError, rs.brng.seed, [2 ** (2 * self.bits + 1)])
232+
assert_raises(ValueError, rs.brng.seed, [-1])
233233

234234
def test_repr(self):
235235
rs = RandomGenerator(self.brng(*self.data1['seed']))
@@ -412,18 +412,18 @@ def setup_class(cls):
412412

413413
def test_seed_float_array(self):
414414
rs = RandomGenerator(self.brng(*self.data1['seed']))
415-
assert_raises(self.seed_error_type, rs.seed, np.array([np.pi]))
416-
assert_raises(self.seed_error_type, rs.seed, np.array([-np.pi]))
417-
assert_raises(self.seed_error_type, rs.seed, np.array([np.pi, -np.pi]))
418-
assert_raises(self.seed_error_type, rs.seed, np.array([0, np.pi]))
419-
assert_raises(self.seed_error_type, rs.seed, [np.pi])
420-
assert_raises(self.seed_error_type, rs.seed, [0, np.pi])
415+
assert_raises(self.seed_error_type, rs.brng.seed, np.array([np.pi]))
416+
assert_raises(self.seed_error_type, rs.brng.seed, np.array([-np.pi]))
417+
assert_raises(self.seed_error_type, rs.brng.seed, np.array([np.pi, -np.pi]))
418+
assert_raises(self.seed_error_type, rs.brng.seed, np.array([0, np.pi]))
419+
assert_raises(self.seed_error_type, rs.brng.seed, [np.pi])
420+
assert_raises(self.seed_error_type, rs.brng.seed, [0, np.pi])
421421

422422
def test_seed_out_of_range_array(self):
423423
rs = RandomGenerator(self.brng(*self.data1['seed']))
424-
assert_raises(self.seed_error_type, rs.seed,
424+
assert_raises(self.seed_error_type, rs.brng.seed,
425425
[2 ** (2 * self.bits + 1)])
426-
assert_raises(self.seed_error_type, rs.seed, [-1])
426+
assert_raises(self.seed_error_type, rs.brng.seed, [-1])
427427

428428

429429
class TestPhilox(Base):
@@ -464,43 +464,45 @@ def setup_class(cls):
464464
def test_seed_out_of_range(self):
465465
# GH #82
466466
rs = RandomGenerator(self.brng(*self.data1['seed']))
467-
assert_raises(ValueError, rs.seed, 2 ** (self.bits + 1))
468-
assert_raises(ValueError, rs.seed, -1)
469-
assert_raises(ValueError, rs.seed, 2 ** (2 * self.bits + 1))
467+
assert_raises(ValueError, rs.brng.seed, 2 ** (self.bits + 1))
468+
assert_raises(ValueError, rs.brng.seed, -1)
469+
assert_raises(ValueError, rs.brng.seed, 2 ** (2 * self.bits + 1))
470470

471471
def test_seed_out_of_range_array(self):
472472
# GH #82
473473
rs = RandomGenerator(self.brng(*self.data1['seed']))
474-
assert_raises(ValueError, rs.seed, [2 ** (self.bits + 1)])
475-
assert_raises(ValueError, rs.seed, [-1])
476-
assert_raises(TypeError, rs.seed, [2 ** (2 * self.bits + 1)])
474+
assert_raises(ValueError, rs.brng.seed, [2 ** (self.bits + 1)])
475+
assert_raises(ValueError, rs.brng.seed, [-1])
476+
assert_raises(TypeError, rs.brng.seed, [2 ** (2 * self.bits + 1)])
477477

478478
def test_seed_float(self):
479479
# GH #82
480480
rs = RandomGenerator(self.brng(*self.data1['seed']))
481-
assert_raises(TypeError, rs.seed, np.pi)
482-
assert_raises(TypeError, rs.seed, -np.pi)
481+
assert_raises(TypeError, rs.brng.seed, np.pi)
482+
assert_raises(TypeError, rs.brng.seed, -np.pi)
483483

484484
def test_seed_float_array(self):
485485
# GH #82
486486
rs = RandomGenerator(self.brng(*self.data1['seed']))
487-
assert_raises(TypeError, rs.seed, np.array([np.pi]))
488-
assert_raises(TypeError, rs.seed, np.array([-np.pi]))
489-
assert_raises(TypeError, rs.seed, np.array([np.pi, -np.pi]))
490-
assert_raises(TypeError, rs.seed, np.array([0, np.pi]))
491-
assert_raises(TypeError, rs.seed, [np.pi])
492-
assert_raises(TypeError, rs.seed, [0, np.pi])
487+
brng = rs.brng
488+
assert_raises(TypeError, brng.seed, np.array([np.pi]))
489+
assert_raises(TypeError, brng.seed, np.array([-np.pi]))
490+
assert_raises(TypeError, brng.seed, np.array([np.pi, -np.pi]))
491+
assert_raises(TypeError, brng.seed, np.array([0, np.pi]))
492+
assert_raises(TypeError, brng.seed, [np.pi])
493+
assert_raises(TypeError, brng.seed, [0, np.pi])
493494

494495
def test_state_tuple(self):
495496
rs = RandomGenerator(self.brng(*self.data1['seed']))
496-
state = rs.state
497+
brng = rs.brng
498+
state = brng.state
497499
desired = rs.randint(2 ** 16)
498500
tup = (state['brng'], state['state']['key'], state['state']['pos'])
499-
rs.state = tup
501+
brng.state = tup
500502
actual = rs.randint(2 ** 16)
501503
assert_equal(actual, desired)
502504
tup = tup + (0, 0.0)
503-
rs.state = tup
505+
brng.state = tup
504506
actual = rs.randint(2 ** 16)
505507
assert_equal(actual, desired)
506508

@@ -542,25 +544,25 @@ def test_gauss_inv(self):
542544
def test_seed_out_of_range_array(self):
543545
# GH #82
544546
rs = RandomGenerator(self.brng(*self.data1['seed']))
545-
assert_raises(ValueError, rs.seed, [2 ** (self.bits + 1)])
546-
assert_raises(ValueError, rs.seed, [-1])
547-
assert_raises(TypeError, rs.seed, [2 ** (2 * self.bits + 1)])
547+
assert_raises(ValueError, rs.brng.seed, [2 ** (self.bits + 1)])
548+
assert_raises(ValueError, rs.brng.seed, [-1])
549+
assert_raises(TypeError, rs.brng.seed, [2 ** (2 * self.bits + 1)])
548550

549551
def test_seed_float(self):
550552
# GH #82
551553
rs = RandomGenerator(self.brng(*self.data1['seed']))
552-
assert_raises(TypeError, rs.seed, np.pi)
553-
assert_raises(TypeError, rs.seed, -np.pi)
554+
assert_raises(TypeError, rs.brng.seed, np.pi)
555+
assert_raises(TypeError, rs.brng.seed, -np.pi)
554556

555557
def test_seed_float_array(self):
556558
# GH #82
557559
rs = RandomGenerator(self.brng(*self.data1['seed']))
558-
assert_raises(TypeError, rs.seed, np.array([np.pi]))
559-
assert_raises(TypeError, rs.seed, np.array([-np.pi]))
560-
assert_raises(TypeError, rs.seed, np.array([np.pi, -np.pi]))
561-
assert_raises(TypeError, rs.seed, np.array([0, np.pi]))
562-
assert_raises(TypeError, rs.seed, [np.pi])
563-
assert_raises(TypeError, rs.seed, [0, np.pi])
560+
assert_raises(TypeError, rs.brng.seed, np.array([np.pi]))
561+
assert_raises(TypeError, rs.brng.seed, np.array([-np.pi]))
562+
assert_raises(TypeError, rs.brng.seed, np.array([np.pi, -np.pi]))
563+
assert_raises(TypeError, rs.brng.seed, np.array([0, np.pi]))
564+
assert_raises(TypeError, rs.brng.seed, [np.pi])
565+
assert_raises(TypeError, rs.brng.seed, [0, np.pi])
564566

565567
def test_uniform_float(self):
566568
rs = RandomGenerator(self.brng(*self.data1['seed']))
@@ -578,9 +580,9 @@ def test_uniform_float(self):
578580
def test_buffer_reset(self):
579581
rs = RandomGenerator(self.brng(*self.data1['seed']))
580582
rs.random_sample(1)
581-
assert rs.state['buffer_loc'] != 382
582-
rs.seed(*self.data1['seed'])
583-
assert rs.state['buffer_loc'] == 382
583+
assert rs.brng.state['buffer_loc'] != 382
584+
rs.brng.seed(*self.data1['seed'])
585+
assert rs.brng.state['buffer_loc'] == 382
584586

585587

586588
class TestThreeFry32(Base):

0 commit comments

Comments
 (0)