Skip to content

Commit 655bafc

Browse files
authored
Merge pull request #217 from bashtage/sfc
ENH: Add SFC generator with Weyl sequence
2 parents 58639a4 + c916440 commit 655bafc

38 files changed

+2525
-66
lines changed

doc/source/bit_generators/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ These RNGs will be included in future releases.
2929
PCG64 <pcg64>
3030
Philox <philox>
3131
RDRAND <rdrand>
32+
SFC64 <sfc>
3233
SFMT <sfmt>
3334
SPECK128 <speck128>
3435
ThreeFry <threefry>

doc/source/bit_generators/lxm.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@ Seeding and State
1616
~LXM.seed
1717
~LXM.state
1818

19+
Parallel generation
20+
===================
21+
.. autosummary::
22+
:toctree: generated/
23+
24+
~LXM.jump
25+
~LXM.jumped
26+
1927
Extending
2028
=========
2129
.. autosummary::

doc/source/bit_generators/sfc.rst

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
SFC64 Generator
2+
---------------
3+
4+
.. module:: randomgen.sfc
5+
6+
.. currentmodule:: randomgen.sfc
7+
8+
.. autoclass:: SFC64
9+
10+
Seeding and State
11+
=================
12+
13+
.. autosummary::
14+
:toctree: generated/
15+
16+
~SFC64.seed
17+
~SFC64.state
18+
19+
Extending
20+
=========
21+
.. autosummary::
22+
:toctree: generated/
23+
24+
~SFC64.cffi
25+
~SFC64.ctypes
26+
27+
Testing
28+
=======
29+
.. autosummary::
30+
:toctree: generated/
31+
32+
~SFC64.random_raw

doc/source/performance.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Performance
66
Recommendation
77
**************
88
The recommended generator for single use is
9-
:class:`~randomgen.pcg64.PCG64` with the keyword argument ``variant="cm-dxsm"`.
9+
:class:`~randomgen.pcg64.PCG64` with the keyword argument ``variant="cm-dxsm"``.
1010
An excellent alternative is :class:`~randomgen.xoshiro256.Xoshiro256`
1111
where the `jump` method is used to advance the state. For very large scale
1212
applications -- requiring 1,000+ independent streams,

randomgen/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from randomgen.philox import Philox
1515
from randomgen.rdrand import RDRAND
1616
from randomgen.seed_sequence import SeedlessSeedSequence, SeedSequence
17+
from randomgen.sfc import SFC64
1718
from randomgen.sfmt import SFMT
1819
from randomgen.speck128 import SPECK128
1920
from randomgen.threefry import ThreeFry
@@ -39,6 +40,7 @@
3940
"Philox",
4041
"RDRAND",
4142
"RandomState",
43+
"SFC64",
4244
"SFMT",
4345
"SPECK128",
4446
"ThreeFry",

randomgen/_pickle.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from randomgen.pcg64 import PCG64
1515
from randomgen.philox import Philox
1616
from randomgen.rdrand import RDRAND
17+
from randomgen.sfc import SFC64
1718
from randomgen.sfmt import SFMT
1819
from randomgen.speck128 import SPECK128
1920
from randomgen.threefry import ThreeFry
@@ -40,6 +41,7 @@
4041
"Xoshiro256": Xoshiro256,
4142
"Xoshiro512": Xoshiro512,
4243
"SPECK128": SPECK128,
44+
"SFC64": SFC64,
4345
"SFMT": SFMT,
4446
"RDRAND": RDRAND,
4547
}

randomgen/aes.pyx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ cdef class AESCounter(BitGenerator):
274274
for i in range(16 * 4):
275275
state[i] = self.rng_state.state[i]
276276
offset = self.rng_state.offset
277-
return {"bit_generator": self.__class__.__name__,
277+
return {"bit_generator": type(self).__name__,
278278
"s": {"state": state, "seed": seed, "counter": counter,
279279
"offset": offset},
280280
"has_uint32": self.rng_state.has_uint32,
@@ -287,9 +287,9 @@ cdef class AESCounter(BitGenerator):
287287
if not isinstance(value, dict):
288288
raise TypeError("state must be a dict")
289289
bitgen = value.get("bit_generator", "")
290-
if bitgen != self.__class__.__name__:
290+
if bitgen != type(self).__name__:
291291
raise ValueError("state must be for a {0} "
292-
"PRNG".format(self.__class__.__name__))
292+
"PRNG".format(type(self).__name__))
293293
state =value["s"]["state"]
294294
for i in range(16 * 4):
295295
self.rng_state.state[i] = state[i]

randomgen/chacha.pyx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ cdef class ChaCha(BitGenerator):
274274
for i in range(2):
275275
ctr[i] = self.rng_state.ctr[i]
276276

277-
return {"bit_generator": self.__class__.__name__,
277+
return {"bit_generator": type(self).__name__,
278278
"state": {"block": block, "keysetup": keysetup, "ctr": ctr,
279279
"rounds": self.rng_state.rounds}}
280280

@@ -283,9 +283,9 @@ cdef class ChaCha(BitGenerator):
283283
if not isinstance(value, dict):
284284
raise TypeError("state must be a dict")
285285
bitgen = value.get("bit_generator", "")
286-
if bitgen != self.__class__.__name__:
286+
if bitgen != type(self).__name__:
287287
raise ValueError("state must be for a {0} "
288-
"PRNG".format(self.__class__.__name__))
288+
"PRNG".format(type(self).__name__))
289289

290290
state = value["state"]
291291
block = state["block"]

randomgen/common.pyx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ cdef class BitGenerator:
9696
pass
9797
if isinstance(seed, ISEED_SEQUENCES):
9898
if self.mode == "legacy":
99-
bg = self.__class__.__name__
99+
bg = type(self).__name__
100100
raise RuntimeError("{bg} was created using mode=\"legacy\". "
101101
"This is immutable and SeedSequences cannot"
102102
" be used".format(bg=bg))

randomgen/dsfmt.pyx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ cdef class DSFMT(BitGenerator):
287287
buffered_uniforms = np.empty(DSFMT_N64, dtype=np.double)
288288
for i in range(DSFMT_N64):
289289
buffered_uniforms[i] = self.rng_state.buffered_uniforms[i]
290-
return {"bit_generator": self.__class__.__name__,
290+
return {"bit_generator": type(self).__name__,
291291
"state": {"state": np.asarray(state),
292292
"idx": self.rng_state.state.idx},
293293
"buffer_loc": self.rng_state.buffer_loc,
@@ -299,9 +299,9 @@ cdef class DSFMT(BitGenerator):
299299
if not isinstance(value, dict):
300300
raise TypeError("state must be a dict")
301301
bitgen = value.get("bit_generator", "")
302-
if bitgen != self.__class__.__name__:
302+
if bitgen != type(self).__name__:
303303
raise ValueError("state must be for a {0} "
304-
"PRNG".format(self.__class__.__name__))
304+
"PRNG".format(type(self).__name__))
305305
state = check_state_array(value["state"]["state"], 2*DSFMT_N_PLUS_1,
306306
64, "state")
307307
for i in range(DSFMT_N_PLUS_1):

0 commit comments

Comments
 (0)