8000 Merge pull request #13837 from mattip/seedsequence2 · rkern/numpy@34224c1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 34224c1

Browse files
authored
Merge pull request numpy#13837 from mattip/seedsequence2
MAINT, BUG: fixes from seedsequence
2 parents 60ede65 + 5c5965c commit 34224c1

File tree

4 files changed

+81
-82
lines changed

4 files changed

+81
-82
lines changed

doc/source/reference/random/bit_generators/index.rst

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,27 @@ setting the state, jumping or advancing the state, and for accessing
1212
low-level wrappers for consumption by code that can efficiently
1313
access the functions provided, e.g., `numba <https://numba.pydata.org>`_.
1414

15+
Supported BitGenerators
16+
=======================
17+
18+
The included BitGenerators are:
19+
20+
* MT19937 - The standard Python BitGenerator. Adds a `~mt19937.MT19937.jumped`
21+
function that returns a new generator with state as-if ``2**128`` draws have
22+
been made.
23+
* PCG-64 - Fast generator that support many parallel streams and
24+
can be advanced by an arbitrary amount. See the documentation for
25+
:meth:`~.PCG64.advance`. PCG-64 has a period of
26+
:math:`2^{128}`. See the `PCG author's page`_ for more details about
27+
this class of PRNG.
28+
* Philox - a counter-based generator capable of being advanced an
29+
arbitrary number of steps or generating independent streams. See the
30+
`Random123`_ page for more details about this class of bit generators.
31+
32+
.. _`PCG author's page`: http://www.pcg-random.org/
33+
.. _`Random123`: https://www.deshawresearch.com/resources_random123.html
34+
35+
1536
.. toctree::
1637
:maxdepth: 1
1738

@@ -33,8 +54,8 @@ generate BitGenerators that are correlated or overlap within a few samples.
3354

3455
NumPy uses a `SeedSequence` class to mix the seed in a reproducible way that
3556
introduces the necessary entropy to produce independent and largely non-
36-
overlapping streams. Small seeds may still be unable to reach all possible
37-
initialization states, which can cause biases among an ensemble of small-seed
57+
overlapping streams. Small seeds are unable to fill the complete range of
58+
initializaiton states, and lead to biases among an ensemble of small-seed
3859
runs. For many cases, that doesn't matter. If you just want to hold things in
3960
place while you debug something, biases aren't a concern. For actual
4061
simulations whose results you care about, let ``SeedSequence(None)`` do its

doc/source/reference/random/index.rst

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -159,28 +159,6 @@ one of two ways:
159159
* :ref:`independent-streams`
160160
* :ref:`jump-and-advance`
161161

162-
Supported BitGenerators
163-
-----------------------
164-
The included BitGenerators are:
165-
166-
* MT19937 - The standard Python BitGenerator. Adds a `~mt19937.MT19937.jumped`
167-
function that returns a new generator with state as-if ``2**128`` draws have
168-
been made.
169-
* PCG-64 - Fast generator that support many parallel streams and
170-
can be advanced by an arbitrary amount. See the documentation for
171-
:meth:`~.PCG64.advance`. PCG-64 has a period of
172-
:math:`2^{128}`. See the `PCG author's page`_ for more details about
173-
this class of PRNG.
174-
* Xorshiro256** and Xorshiro512** - The most recently introduced XOR,
175-
shift, and rotate generator. Supports ``jumped`` and so can be used in
176-
parallel applications. See the documentation for
177-
* ThreeFry and Philox - counter-based generators capable of being advanced an
178-
arbitrary number of steps or generating independent streams. See the
179-
`Random123`_ page for more details about this class of bit generators.
180-
181-
.. _`PCG author's page`: http://www.pcg-random.org/
182-
.. _`Random123`: https://www.deshawresearch.com/resources_random123.html
183-
184162
Concepts
185163
--------
186164
.. toctree::

doc/source/reference/random/performance.rst

Lines changed: 57 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -29,38 +29,38 @@ The column labeled MT19973 is used the same 32-bit generator as
2929
:class:`~generator.Generator`.
3030

3131
.. csv-table::
32-
:header: ,Xoshiro256**,Xoshiro512**,DSFMT,PCG64,MT19937,Philox,RandomState,ThreeFry
33-
:widths: 14,14,14,14,14,14,14,14,14
32+
:header: ,PCG64,MT19937,Philox,RandomState
33+
:widths: 14,14,14,14,14
3434

35-
32-bit Unsigned Ints,2.6,2.9,3.5,3.2,3.3,4.8,3.2,7.6
36-
64-bit Unsigned Ints,3.3,4.3,5.7,4.8,5.7,6.9,5.7,12.8
37-
Uniforms,3.4,4.0,3.2,5.0,7.3,8.0,7.3,12.8
38-
Normals,7.9,9.0,11.8,11.3,13.0,13.7,34.4,18.1
39-
Exponentials,4.7,5.2,7.4,6.7,7.9,8.6,40.3,14.7
40-
Gammas,29.1,27.5,28.5,30.6,34.2,35.1,58.1,47.6
41-
Binomials,22.7,23.1,21.1,25.7,27.7,28.4,25.9,32.1
42-
Laplaces,38.5,38.1,36.9,41.1,44.5,45.4,46.9,50.2
43-
Poissons,46.9,50.9,46.4,58.1,68.4,70.2,86.0,88.2
35+
32-bit Unsigned Ints,3.2,3.3,4.8,3.2
36+
64-bit Unsigned Ints,4.8,5.7,6.9,5.7
37+
Uniforms,5.0,7.3,8.0,7.3
38+
Normals,11.3,13.0,13.7,34.4
39+
Exponentials,6.7,7.9,8.6,40.3
40+
Gammas,30.6,34.2,35.1,58.1
41+
Binomials,25.7,27.7,28.4,25.9
42+
Laplaces,41.1,44.5,45.4,46.9
43+
Poissons,58.1,68.4,70.2,86.0
4444

4545

4646
The next table presents the performance in percentage relative to values
4747
generated by the legagy generator, `RandomState(MT19937())`. The overall
4848
performance was computed using a geometric mean.
4949

5050
.. csv-table::
51-
:header: ,Xoshiro256**,Xoshiro256**,DSFMT,PCG64,MT19937,Philox,ThreeFry
52-
:widths: 14,14,14,14,14,14,14,14
53-
54-
32-bit Unsigned Ints,124,113,93,100,99,67,43
55-
64-bit Unsigned Ints,174,133,100,118,100,83,44
56-
Uniforms,212,181,229,147,100,91,57
57-
Normals,438,382,291,304,264,252,190
58-
Exponentials,851,770,547,601,512,467,275
59-
Gammas,200,212,204,190,170,166,122
60-
Binomials,114,112,123,101,93,91,81
61-
Laplaces,122,123,127,114,105,103,93
62-
Poissons,183,169,185,148,126,123,98
63-
Overall,212,194,180,167,145,131,93
51+
:header: ,PCG64,MT19937,Philox
52+
:widths: 14,14,14,14
53+
54+
32-bit Unsigned Ints,100,99,67
55+
64-bit Unsigned Ints,118,100,83
56+
Uniforms,147,100,91
57+
Normals,304,264,252
58+
Exponentials,601,512,467
59+
Gammas,190,170,166
60+
Binomials,101,93,91
61+
Laplaces,114,105,103
62+
Poissons,148,126,123
63+
Overall,167,145,131
6464

6565
.. note::
6666

@@ -81,33 +81,33 @@ across tables.
8181
64-bit Linux
8282
~~~~~~~~~~~~
8383

84-
=================== ======= ========= ======= ======== ========== ============
85-
Distribution DSFMT MT19937 PCG64 Philox ThreeFry Xoshiro256
86-
=================== ======= ========= ======= ======== ========== ============
87-
32-bit Unsigned Int 99.3 100 113.9 72.1 48.3 117.1
88-
64-bit Unsigned Int 105.7 100 143.3 89.7 48.1 161.7
89-
Uniform 222.1 100 181.5 90.8 59.9 204.7
90-
Exponential 110.8 100 145.5 92.5 55.0 177.1
91-
Normal 113.2 100 121.4 98.3 71.9 162.0
92-
**Overall** 123.9 100 139.3 88.2 56.0 161.9
93-
=================== ======= ========= ======= ======== ========== ============
84+
=================== ========= ======= ========
85+
Distribution MT19937 PCG64 Philox
86+
=================== ========= ======= ========
87+
32-bit Unsigned Int 100 113.9 72.1
88+
64-bit Unsigned Int 100 143.3 89.7
89+
Uniform 100 181.5 90.8
90+
Exponential 100 145.5 92.5
91+
Normal 100 121.4 98.3
92+
**Overall** 100 139.3 88.2
93+
=================== ========= ======= ========
9494

9595

9696
64-bit Windows
9797
~~~~~~~~~~~~~~
9898
The performance on 64-bit Linux and 64-bit Windows is broadly similar.
9999

100100

101-
=================== ======= ========= ======= ======== ========== ============
102-
Distribution DSFMT MT19937 PCG64 Philox ThreeFry Xoshiro256
103-
=================== ======= ========= ======= ======== ========== ============
104-
32-bit Unsigned Int 122.8 100 134.9 44.1 72.3 133.1
105-
64-bit Unsigned Int 130.4 100 162.7 41.0 77.7 142.3
106-
Uniform 273.2 100 200.0 44.8 84.6 175.8
107-
Exponential 135.0 100 167.8 47.4 84.5 166.9
108-
Normal 115.3 100 135.6 60.3 93.6 169.6
109-
**Overall** 146.7 100 158.4 47.1 82.2 156.5
110-
=================== ======= ========= ======= ======== ========== ============
101+
=================== ========= ======= ========
102+
Distribution MT19937 PCG64 Philox
103+
=================== ========= ======= ========
104+
32-bit Unsigned Int 100 134.9 44.1
105+
64-bit Unsigned Int 100 162.7 41.0
106+
Uniform 100 200.0 44.8
107+
Exponential 100 167.8 47.4
108+
Normal 100 135.6 60.3
109+
**Overall** 100 158.4 47.1
110+
=================== ========= ======= ========
111111

112112
32-bit Windows
113113
~~~~~~~~~~~~~~
@@ -116,20 +116,20 @@ The performance of 64-bit generators on 32-bit Windows is much lower than on 64-
116116
operating systems due to register width. MT19937, the generator that has been
117117
in NumPy since 2005, operates on 32-bit integers.
118118

119-
=================== ======= ========= ======= ======== ========== ============
120-
Distribution DSFMT MT19937 PCG64 Philox ThreeFry Xoshiro256
121-
=================== ======= ========= ======= ======== ========== ============
122-
32-bit Unsigned Int 110.9 100 30.6 28.1 29.2 74.4
123-
64-bit Unsigned Int 104.7 100 24.2 23.7 22.7 72.7
124-
Uniform 247.0 100 26.7 28.4 27.8 78.8
125-
Exponential 110.1 100 32.1 32.6 30.5 89.6
126-
Normal 107.2 100 36.3 37.5 35.2 93.0
127-
**Overall** 127.6 100 29.7 29.7 28.8 81.3
128-
=================== ======= ========= ======= ======== ========== ============
119+
=================== ========= ======= ========
120+
Distribution MT19937 PCG64 Philox
121+
=================== ========= ======= ========
122+
32-bit Unsigned Int 100 30.6 28.1
123+
64-bit Unsigned Int 100 24.2 23.7
124+
Uniform 100 26.7 28.4
125+
Exponential 100 32.1 32.6
126+
Normal 100 36.3 37.5
127+
**Overall** 100 29.7 29.7
128+
=================== ========= ======= ========
129129

130130

131131
.. note::
132132

133-
Linux timings used Ubuntu 18.04 and GCC 7.4. Windows timings were made on Windows 10
134-
using Microsoft C/C++ Optimizing Compiler Version 19 (Visual Studio 2015). All timings
135-
were produced on a i5-3570 processor.
133+
Linux timings used Ubuntu 18.04 and GCC 7.4. Windows timings were made on
134+
Windows 10 using Microsoft C/C++ Optimizing Compiler Version 19 (Visual
135+
Studio 2015). All timings were produced on a i5-3570 processor.

numpy/random/src/pcg64/pcg64.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ static inline void pcg_setseq_128_srandom_r(pcg_state_setseq_128 *rng,
168168
pcg128_t initseq) {
169169
rng->state = PCG_128BIT_CONSTANT(0ULL, 0ULL);
170170
rng->inc.high = initseq.high << 1u;
171-
rng->inc.high |= initseq.low & 0x800000000000ULL;
171+
rng->inc.high |= initseq.low >> 63u;
172172
rng->inc.low = (initseq.low << 1u) | 1u;
173173
pcg_setseq_128_step_r(rng);
174174
rng->state = pcg128_add(rng->state, initstate);

0 commit comments

Comments
 (0)
0