-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 8ee02b7
Showing
28 changed files
with
6,306 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
cdef class RandomState: | ||
""" | ||
RandomState(seed=None) | ||
|
||
Container for the Mersenne Twister pseudo-random number generator. | ||
|
||
`RandomState` exposes a number of methods for generating random numbers | ||
drawn from a variety of probability distributions. In addition to the | ||
distribution-specific arguments, each method takes a keyword argument | ||
`size` that defaults to ``None``. If `size` is ``None``, then a single | ||
value is generated and returned. If `size` is an integer, then a 1-D | ||
array filled with generated values is returned. If `size` is a tuple, | ||
then an array with that shape is filled and returned. | ||
|
||
*Compatibility Guarantee* | ||
A fixed seed and a fixed series of calls to 'RandomState' methods using | ||
the same parameters will always produce the same results up to roundoff | ||
error except when the values were incorrect. Incorrect values will be | ||
fixed and the NumPy version in which the fix was made will be noted in | ||
the relevant docstring. Extension of existing parameter ranges and the | ||
addition of new parameters is allowed as long the previous behavior | ||
remains unchanged. | ||
|
||
Parameters | ||
---------- | ||
seed : {None, int, array_like}, optional | ||
Random seed used to initialize the pseudo-random number generator. Can | ||
be any integer between 0 and 2**32 - 1 inclusive, an array (or other | ||
sequence) of such integers, or ``None`` (the default). If `seed` is | ||
``None``, then `RandomState` will try to read data from | ||
``/dev/urandom`` (or the Windows analogue) if available or seed from | ||
the clock otherwise. | ||
|
||
Notes | ||
----- | ||
The Python stdlib module "random" also contains a Mersenne Twister | ||
pseudo-random number generator with a number of methods that are similar | ||
to the ones available in `RandomState`. `RandomState`, besides being | ||
NumPy-aware, has the advantage that it provides a much larger number | ||
of probability distributions to choose from. | ||
|
||
""" | ||
cdef rk_state *internal_state | ||
cdef object lock | ||
cdef object state_address | ||
poisson_lam_max = np.iinfo('l').max - np.sqrt(np.iinfo('l').max)*10 | ||
|
||
|
||
cdef rk_state *internal_state | ||
cdef object lock | ||
cdef object state_address | ||
poisson_lam_max = np.iinfo('l').max - np.sqrt(np.iinfo('l').max)*10 | ||
|
||
def __init__(self, seed=None): | ||
self.internal_state = <rk_state*>PyMem_Malloc(sizeof(rk_state)) | ||
self.state_address = PyCapsule_New(self.internal_state, NULL, NULL) | ||
self.lock = Lock() | ||
self.seed(seed) | ||
|
||
def __dealloc__(self): | ||
if self.internal_state != NULL: | ||
PyMem_Free(self.internal_state) | ||
self.internal_state = NULL | ||
|
||
|
||
def seed(self, seed=None): | ||
""" | ||
seed(seed=None) | ||
|
||
Seed the generator. | ||
|
||
This method is called when `RandomState` is initialized. It can be | ||
called again to re-seed the generator. For details, see `RandomState`. | ||
|
||
Parameters | ||
---------- | ||
seed : int or array_like, optional | ||
Seed for `RandomState`. | ||
Must be convertible to 32 bit unsigned integers. | ||
|
||
See Also | ||
-------- | ||
RandomState | ||
|
||
""" | ||
cdef rk_error errcode | ||
cdef ndarray obj "arrayObject_obj" | ||
try: | ||
if seed is None: | ||
with self.lock: | ||
errcode = rk_randomseed(self.internal_state) | ||
else: | ||
idx = operator.index(seed) | ||
if idx > int(2**32 - 1) or idx < 0: | ||
raise ValueError("Seed must be between 0 and 2**32 - 1") | ||
with self.lock: | ||
rk_seed(idx, self.internal_state) | ||
except TypeError: | ||
obj = np.asarray(seed).astype(np.int64, casting='safe') | ||
if ((obj > int(2**32 - 1)) | (obj < 0)).any(): | ||
raise ValueError("Seed must be between 0 and 2**32 - 1") | ||
obj = obj.astype(L', casting='unsafe') | ||
with self.lock: | ||
init_by_array(self.internal_state, <unsigned long *>PyArray_DATA(obj), | ||
PyArray_DIM(obj, 0)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,252 @@ | ||
/* const.c | ||
* | ||
* Globally declared constants | ||
* | ||
* | ||
* | ||
* SYNOPSIS: | ||
* | ||
* extern double nameofconstant; | ||
* | ||
* | ||
* | ||
* | ||
* DESCRIPTION: | ||
* | ||
* This file contains a number of mathematical constants and | ||
* also some needed size parameters of the computer arithmetic. | ||
* The values are supplied as arrays of hexadecimal integers | ||
* for IEEE arithmetic; arrays of octal constants for DEC | ||
* arithmetic; and in a normal decimal scientific notation for | ||
* other machines. The particular notation used is determined | ||
* by a symbol (DEC, IBMPC, or UNK) defined in the include file | ||
* mconf.h. | ||
* | ||
* The default size parameters are as follows. | ||
* | ||
* For DEC and UNK modes: | ||
* MACHEP = 1.38777878078144567553E-17 2**-56 | ||
* MAXLOG = 8.8029691931113054295988E1 log(2**127) | ||
* MINLOG = -8.872283911167299960540E1 log(2**-128) | ||
* MAXNUM = 1.701411834604692317316873e38 2**127 | ||
* | ||
* For IEEE arithmetic (IBMPC): | ||
* MACHEP = 1.11022302462515654042E-16 2**-53 | ||
* MAXLOG = 7.09782712893383996843E2 log(2**1024) | ||
* MINLOG = -7.08396418532264106224E2 log(2**-1022) | ||
* MAXNUM = 1.7976931348623158E308 2**1024 | ||
* | ||
* The global symbols for mathematical constants are | ||
* PI = 3.14159265358979323846 pi | ||
* PIO2 = 1.57079632679489661923 pi/2 | ||
* PIO4 = 7.85398163397448309616E-1 pi/4 | ||
* SQRT2 = 1.41421356237309504880 sqrt(2) | ||
* SQRTH = 7.07106781186547524401E-1 sqrt(2)/2 | ||
* LOG2E = 1.4426950408889634073599 1/log(2) | ||
* SQ2OPI = 7.9788456080286535587989E-1 sqrt( 2/pi ) | ||
* LOGE2 = 6.93147180559945309417E-1 log(2) | ||
* LOGSQ2 = 3.46573590279972654709E-1 log(2)/2 | ||
* THPIO4 = 2.35619449019234492885 3*pi/4 | ||
* TWOOPI = 6.36619772367581343075535E-1 2/pi | ||
* | ||
* These lists are subject to change. | ||
*/ | ||
|
||
/* const.c */ | ||
|
||
/* | ||
Cephes Math Library Release 2.3: March, 1995 | ||
Copyright 1984, 1995 by Stephen L. Moshier | ||
*/ | ||
|
||
#include "mconf.h" | ||
|
||
#ifdef UNK | ||
#if 1 | ||
double MACHEP = 1.11022302462515654042E-16; /* 2**-53 */ | ||
#else | ||
double MACHEP = 1.38777878078144567553E-17; /* 2**-56 */ | ||
#endif | ||
double UFLOWTHRESH = 2.22507385850720138309E-308; /* 2**-1022 */ | ||
#ifdef DENORMAL | ||
double MAXLOG = 7.09782712893383996732E2; /* log(MAXNUM) */ | ||
/* double MINLOG = -7.44440071921381262314E2; */ /* log(2**-1074) */ | ||
double MINLOG = -7.451332191019412076235E2; /* log(2**-1075) */ | ||
#else | ||
double MAXLOG = 7.08396418532264106224E2; /* log 2**1022 */ | ||
double MINLOG = -7.08396418532264106224E2; /* log 2**-1022 */ | ||
#endif | ||
double MAXNUM = 1.79769313486231570815E308; /* 2**1024*(1-MACHEP) */ | ||
double PI = 3.14159265358979323846; /* pi */ | ||
double PIO2 = 1.57079632679489661923; /* pi/2 */ | ||
double PIO4 = 7.85398163397448309616E-1; /* pi/4 */ | ||
double SQRT2 = 1.41421356237309504880; /* sqrt(2) */ | ||
double SQRTH = 7.07106781186547524401E-1; /* sqrt(2)/2 */ | ||
double LOG2E = 1.4426950408889634073599; /* 1/log(2) */ | ||
double SQ2OPI = 7.9788456080286535587989E-1; /* sqrt( 2/pi ) */ | ||
double LOGE2 = 6.93147180559945309417E-1; /* log(2) */ | ||
double LOGSQ2 = 3.46573590279972654709E-1; /* log(2)/2 */ | ||
double THPIO4 = 2.35619449019234492885; /* 3*pi/4 */ | ||
double TWOOPI = 6.36619772367581343075535E-1; /* 2/pi */ | ||
#ifdef INFINITIES | ||
double INFINITY = 1.0/0.0; /* 99e999; */ | ||
#else | ||
double INFINITY = 1.79769313486231570815E308; /* 2**1024*(1-MACHEP) */ | ||
#endif | ||
#ifdef NANS | ||
double NAN = 1.0/0.0 - 1.0/0.0; | ||
#else | ||
double NAN = 0.0; | ||
#endif | ||
#ifdef MINUSZERO | ||
double NEGZERO = -0.0; | ||
#else | ||
double NEGZERO = 0.0; | ||
#endif | ||
#endif | ||
|
||
#ifdef IBMPC | ||
/* 2**-53 = 1.11022302462515654042E-16 */ | ||
unsigned short MACHEP[4] = {0x0000,0x0000,0x0000,0x3ca0}; | ||
unsigned short UFLOWTHRESH[4] = {0x0000,0x0000,0x0000,0x0010}; | ||
#ifdef DENORMAL | ||
/* log(MAXNUM) = 7.09782712893383996732224E2 */ | ||
unsigned short MAXLOG[4] = {0x39ef,0xfefa,0x2e42,0x4086}; | ||
/* log(2**-1074) = - -7.44440071921381262314E2 */ | ||
/*unsigned short MINLOG[4] = {0x71c3,0x446d,0x4385,0xc087};*/ | ||
unsigned short MINLOG[4] = {0x3052,0xd52d,0x4910,0xc087}; | ||
#else | ||
/* log(2**1022) = 7.08396418532264106224E2 */ | ||
unsigned short MAXLOG[4] = {0xbcd2,0xdd7a,0x232b,0x4086}; | ||
/* log(2**-1022) = - 7.08396418532264106224E2 */ | ||
unsigned short MINLOG[4] = {0xbcd2,0xdd7a,0x232b,0xc086}; | ||
#endif | ||
/* 2**1024*(1-MACHEP) = 1.7976931348623158E308 */ | ||
unsigned short MAXNUM[4] = {0xffff,0xffff,0xffff,0x7fef}; | ||
unsigned short PI[4] = {0x2d18,0x5444,0x21fb,0x4009}; | ||
unsigned short PIO2[4] = {0x2d18,0x5444,0x21fb,0x3ff9}; | ||
unsigned short PIO4[4] = {0x2d18,0x5444,0x21fb,0x3fe9}; | ||
unsigned short SQRT2[4] = {0x3bcd,0x667f,0xa09e,0x3ff6}; | ||
unsigned short SQRTH[4] = {0x3bcd,0x667f,0xa09e,0x3fe6}; | ||
unsigned short LOG2E[4] = {0x82fe,0x652b,0x1547,0x3ff7}; | ||
unsigned short SQ2OPI[4] = {0x3651,0x33d4,0x8845,0x3fe9}; | ||
unsigned short LOGE2[4] = {0x39ef,0xfefa,0x2e42,0x3fe6}; | ||
unsigned short LOGSQ2[4] = {0x39ef,0xfefa,0x2e42,0x3fd6}; | ||
unsigned short THPIO4[4] = {0x21d2,0x7f33,0xd97c,0x4002}; | ||
unsigned short TWOOPI[4] = {0xc883,0x6dc9,0x5f30,0x3fe4}; | ||
#ifdef INFINITIES | ||
unsigned short INFINITY[4] = {0x0000,0x0000,0x0000,0x7ff0}; | ||
#else | ||
unsigned short INFINITY[4] = {0xffff,0xffff,0xffff,0x7fef}; | ||
#endif | ||
#ifdef NANS | ||
unsigned short NAN[4] = {0x0000,0x0000,0x0000,0x7ffc}; | ||
#else | ||
unsigned short NAN[4] = {0x0000,0x0000,0x0000,0x0000}; | ||
#endif | ||
#ifdef MINUSZERO | ||
unsigned short NEGZERO[4] = {0x0000,0x0000,0x0000,0x8000}; | ||
#else | ||
unsigned short NEGZERO[4] = {0x0000,0x0000,0x0000,0x0000}; | ||
#endif | ||
#endif | ||
|
||
#ifdef MIEEE | ||
/* 2**-53 = 1.11022302462515654042E-16 */ | ||
unsigned short MACHEP[4] = {0x3ca0,0x0000,0x0000,0x0000}; | ||
unsigned short UFLOWTHRESH[4] = {0x0010,0x0000,0x0000,0x0000}; | ||
#ifdef DENORMAL | ||
/* log(2**1024) = 7.09782712893383996843E2 */ | ||
unsigned short MAXLOG[4] = {0x4086,0x2e42,0xfefa,0x39ef}; | ||
/* log(2**-1074) = - -7.44440071921381262314E2 */ | ||
/* unsigned short MINLOG[4] = {0xc087,0x4385,0x446d,0x71c3}; */ | ||
unsigned short MINLOG[4] = {0xc087,0x4910,0xd52d,0x3052}; | ||
#else | ||
/* log(2**1022) = 7.08396418532264106224E2 */ | ||
unsigned short MAXLOG[4] = {0x4086,0x232b,0xdd7a,0xbcd2}; | ||
/* log(2**-1022) = - 7.08396418532264106224E2 */ | ||
unsigned short MINLOG[4] = {0xc086,0x232b,0xdd7a,0xbcd2}; | ||
#endif | ||
/* 2**1024*(1-MACHEP) = 1.7976931348623158E308 */ | ||
unsigned short MAXNUM[4] = {0x7fef,0xffff,0xffff,0xffff}; | ||
unsigned short PI[4] = {0x4009,0x21fb,0x5444,0x2d18}; | ||
unsigned short PIO2[4] = {0x3ff9,0x21fb,0x5444,0x2d18}; | ||
unsigned short PIO4[4] = {0x3fe9,0x21fb,0x5444,0x2d18}; | ||
unsigned short SQRT2[4] = {0x3ff6,0xa09e,0x667f,0x3bcd}; | ||
unsigned short SQRTH[4] = {0x3fe6,0xa09e,0x667f,0x3bcd}; | ||
unsigned short LOG2E[4] = {0x3ff7,0x1547,0x652b,0x82fe}; | ||
unsigned short SQ2OPI[4] = {0x3fe9,0x8845,0x33d4,0x3651}; | ||
unsigned short LOGE2[4] = {0x3fe6,0x2e42,0xfefa,0x39ef}; | ||
unsigned short LOGSQ2[4] = {0x3fd6,0x2e42,0xfefa,0x39ef}; | ||
unsigned short THPIO4[4] = {0x4002,0xd97c,0x7f33,0x21d2}; | ||
unsigned short TWOOPI[4] = {0x3fe4,0x5f30,0x6dc9,0xc883}; | ||
#ifdef INFINITIES | ||
unsigned short INFINITY[4] = {0x7ff0,0x0000,0x0000,0x0000}; | ||
#else | ||
unsigned short INFINITY[4] = {0x7fef,0xffff,0xffff,0xffff}; | ||
#endif | ||
#ifdef NANS | ||
unsigned short NAN[4] = {0x7ff8,0x0000,0x0000,0x0000}; | ||
#else | ||
unsigned short NAN[4] = {0x0000,0x0000,0x0000,0x0000}; | ||
#endif | ||
#ifdef MINUSZERO | ||
unsigned short NEGZERO[4] = {0x8000,0x0000,0x0000,0x0000}; | ||
#else | ||
unsigned short NEGZERO[4] = {0x0000,0x0000,0x0000,0x0000}; | ||
#endif | ||
#endif | ||
|
||
#ifdef DEC | ||
/* 2**-56 = 1.38777878078144567553E-17 */ | ||
unsigned short MACHEP[4] = {0022200,0000000,0000000,0000000}; | ||
unsigned short UFLOWTHRESH[4] = {0x0080,0x0000,0x0000,0x0000}; | ||
/* log 2**127 = 88.029691931113054295988 */ | ||
unsigned short MAXLOG[4] = {041660,007463,0143742,025733,}; | ||
/* log 2**-128 = -88.72283911167299960540 */ | ||
unsigned short MINLOG[4] = {0141661,071027,0173721,0147572,}; | ||
/* 2**127 = 1.701411834604692317316873e38 */ | ||
unsigned short MAXNUM[4] = {077777,0177777,0177777,0177777,}; | ||
unsigned short PI[4] = {040511,007732,0121041,064302,}; | ||
unsigned short PIO2[4] = {040311,007732,0121041,064302,}; | ||
unsigned short PIO4[4] = {040111,007732,0121041,064302,}; | ||
unsigned short SQRT2[4] = {040265,002363,031771,0157145,}; | ||
unsigned short SQRTH[4] = {040065,002363,031771,0157144,}; | ||
unsigned short LOG2E[4] = {040270,0125073,024534,013761,}; | ||
unsigned short SQ2OPI[4] = {040114,041051,0117241,0131204,}; | ||
unsigned short LOGE2[4] = {040061,071027,0173721,0147572,}; | ||
unsigned short LOGSQ2[4] = {037661,071027,0173721,0147572,}; | ||
unsigned short THPIO4[4] = {040426,0145743,0174631,007222,}; | ||
unsigned short TWOOPI[4] = {040042,0174603,067116,042025,}; | ||
/* Approximate infinity by MAXNUM. */ | ||
unsigned short INFINITY[4] = {077777,0177777,0177777,0177777,}; | ||
unsigned short NAN[4] = {0000000,0000000,0000000,0000000}; | ||
#ifdef MINUSZERO | ||
unsigned short NEGZERO[4] = {0000000,0000000,0000000,0100000}; | ||
#else | ||
unsigned short NEGZERO[4] = {0000000,0000000,0000000,0000000}; | ||
#endif | ||
#endif | ||
|
||
#ifndef UNK | ||
extern unsigned short MACHEP[]; | ||
extern unsigned short UFLOWTHRESH[]; | ||
extern unsigned short MAXLOG[]; | ||
extern unsigned short UNDLOG[]; | ||
extern unsigned short MINLOG[]; | ||
extern unsigned short MAXNUM[]; | ||
extern unsigned short PI[]; | ||
extern unsigned short PIO2[]; | ||
extern unsigned short PIO4[]; | ||
extern unsigned short SQRT2[]; | ||
extern unsigned short SQRTH[]; | ||
extern unsigned short LOG2E[]; | ||
extern unsigned short SQ2OPI[]; | ||
extern unsigned short LOGE2[]; | ||
extern unsigned short LOGSQ2[]; | ||
extern unsigned short THPIO4[]; | ||
extern unsigned short TWOOPI[]; | ||
extern unsigned short INFINITY[]; | ||
extern unsigned short NAN[]; | ||
extern unsigned short NEGZERO[]; | ||
#endif |
Binary file not shown.
Oops, something went wrong.