144
163
cdef flatiter itera
145
164
cdef broadcast multi
150
oa_data = <double *>oa.data
155
return func(state, oa_data[0])
157
array = <ndarray>PyArray_SimpleNew(oa.nd, oa.dimensions, NPY_DOUBLE)
158
length = PyArray_SIZE(array)
159
array_data = <double *>array.data
160
itera = <flatiter>PyArray_IterNew(<object>oa)
161
for i from 0 <= i < length:
162
array_data[i] = func(state, (<double *>(itera.dataptr))[0])
163
PyArray_ITER_NEXT(itera)
167
array = <ndarray>PyArray_SimpleNew(oa.nd, oa.dimensions, NPY_DOUBLE)
168
length = PyArray_SIZE(array)
169
array_data = <double *>array.data
170
itera = <flatiter>PyArray_IterNew(<object>oa)
171
for i from 0 <= i < length:
172
array_data[i] = func(state, (<double *>(itera.dataptr))[0])
173
PyArray_ITER_NEXT(itera)
165
175
array = <ndarray>_sp.empty(size, _sp.float64)
166
176
array_data = <double *>array.data
168
length = PyArray_SIZE(array)
169
for i from 0 <= i < length:
170
array_data[i] = func(state, oa_data[0])
172
multi = <broadcast>PyArray_MultiIterNew(2, <void *>array,
174
if (multi.size != PyArray_SIZE(array)):
175
raise ValueError("size is not compatible with inputs")
176
for i from 0 <= i < multi.size:
177
oa_data = <double *>PyArray_MultiIter_DATA(multi, 1)
178
array_data[i] = func(state, oa_data[0])
179
PyArray_MultiIter_NEXTi(multi, 1)
177
multi = <broadcast>PyArray_MultiIterNew(2, <void *>array,
179
if (multi.size != PyArray_SIZE(array)):
180
raise ValueError("size is not compatible with inputs")
181
for i from 0 <= i < multi.size:
182
oa_data = <double *>PyArray_MultiIter_DATA(multi, 1)
183
array_data[i] = func(state, oa_data[0])
184
PyArray_MultiIter_NEXTi(multi, 1)
187
cdef object cont2_array_sc(rk_state *state, rk_cont2 func, object size, double a,
189
cdef double *array_data
190
cdef ndarray array "arrayObject"
195
return func(state, a, b)
197
array = <ndarray>_sp.empty(size, _sp.float64)
198
length = PyArray_SIZE(array)
199
array_data = <double *>array.data
200
for i from 0 <= i < length:
201
array_data[i] = func(state, a, b)
182
205
cdef object cont2_array(rk_state *state, rk_cont2 func, object size,
183
206
ndarray oa, ndarray ob):
184
207
cdef double *array_data
188
211
cdef npy_intp length
190
213
cdef broadcast multi
194
if oa.nd == 0 and ob.nd == 0:
195
oa_data = <double *>oa.data
196
ob_data = <double *>ob.data
201
return func(state, oa_data[0], ob_data[0])
203
multi = <broadcast> PyArray_MultiIterNew(2, <void *>oa, <void *>ob)
204
array = <ndarray> PyArray_SimpleNew(multi.nd, multi.dimensions, NPY_DOUBLE)
205
array_data = <double *>array.data
206
for i from 0 <= i < multi.size:
207
oa_data = <double *>PyArray_MultiIter_DATA(multi, 0)
208
ob_data = <double *>PyArray_MultiIter_DATA(multi, 1)
209
array_data[i] = func(state, oa_data[0], ob_data[0])
210
PyArray_MultiIter_NEXT(multi)
216
multi = <broadcast> PyArray_MultiIterNew(2, <void *>oa, <void *>ob)
217
array = <ndarray> PyArray_SimpleNew(multi.nd, multi.dimensions, NPY_DOUBLE)
218
array_data = <double *>array.data
219
for i from 0 <= i < multi.size:
220
oa_data = <double *>PyArray_MultiIter_DATA(multi, 0)
221
ob_data = <double *>PyArray_MultiIter_DATA(multi, 1)
222
array_data[i] = func(state, oa_data[0], ob_data[0])
223
PyArray_MultiIter_NEXT(multi)
212
225
array = <ndarray>_sp.empty(size, _sp.float64)
213
226
array_data = <double *>array.data
215
length = PyArray_SIZE(array)
216
for i from 0 <= i < length:
217
array_data[i] = func(state, oa_data[0], ob_data[0])
219
multi = <broadcast>PyArray_MultiIterNew(3, <void*>array, <void *>oa, <void *>ob)
220
if (multi.size != PyArray_SIZE(array)):
221
raise ValueError("size is not compatible with inputs")
222
for i from 0 <= i < multi.size:
223
oa_data = <double *>PyArray_MultiIter_DATA(multi, 1)
224
ob_data = <double *>PyArray_MultiIter_DATA(multi, 2)
225
array_data[i] = func(state, oa_data[0], ob_data[0])
226
PyArray_MultiIter_NEXTi(multi, 1)
227
PyArray_MultiIter_NEXTi(multi, 2)
227
multi = <broadcast>PyArray_MultiIterNew(3, <void*>array, <void *>oa, <void *>ob)
228
if (multi.size != PyArray_SIZE(array)):
229
raise ValueError("size is not compatible with inputs")
230
for i from 0 <= i < multi.size:
231
oa_data = <double *>PyArray_MultiIter_DATA(multi, 1)
232
ob_data = <double *>PyArray_MultiIter_DATA(multi, 2)
233
array_data[i] = func(state, oa_data[0], ob_data[0])
234
PyArray_MultiIter_NEXTi(multi, 1)
235
PyArray_MultiIter_NEXTi(multi, 2)
230
cdef object cont3_array(rk_state *state, rk_cont3 func, object size, ndarray oa,
238
cdef object cont3_array_sc(rk_state *state, rk_cont3 func, object size, double a,
241
cdef double *array_data
242
cdef ndarray array "arrayObject"
247
return func(state, a, b, c)
249
array = <ndarray>_sp.empty(size, _sp.float64)
250
length = PyArray_SIZE(array)
251
array_data = <double *>array.data
252
for i from 0 <= i < length:
253
array_data[i] = func(state, a, b, c)
256
cdef object cont3_array(rk_state *state, rk_cont3 func, object size, ndarray oa,
231
257
ndarray ob, ndarray oc):
233
259
cdef double *array_data
238
264
cdef npy_intp length
240
266
cdef broadcast multi
244
if (oa.nd ==0 and ob.nd==0 and oc.nd == 0):
245
oa_data = <double *>oa.data
246
ob_data = <double *>ob.data
247
oc_data = <double *>oc.data
252
return func(state, oa_data[0], ob_data[0], oc_data[0])
254
multi = <broadcast> PyArray_MultiIterNew(3, <void *>oa, <void *>ob, <void *>oc)
255
array = <ndarray> PyArray_SimpleNew(multi.nd, multi.dimensions, NPY_DOUBLE)
256
array_data = <double *>array.data
257
for i from 0 <= i < multi.size:
258
oa_data = <double *>PyArray_MultiIter_DATA(multi, 0)
259
ob_data = <double *>PyArray_MultiIter_DATA(multi, 1)
260
oc_data = <double *>PyArray_MultiIter_DATA(multi, 2)
261
array_data[i] = func(state, oa_data[0], ob_data[0], oc_data[0])
262
PyArray_MultiIter_NEXT(multi)
269
multi = <broadcast> PyArray_MultiIterNew(3, <void *>oa, <void *>ob, <void *>oc)
270
array = <ndarray> PyArray_SimpleNew(multi.nd, multi.dimensions, NPY_DOUBLE)
271
array_data = <double *>array.data
272
for i from 0 <= i < multi.size:
273
oa_data = <double *>PyArray_MultiIter_DATA(multi, 0)
274
ob_data = <double *>PyArray_MultiIter_DATA(multi, 1)
275
oc_data = <double *>PyArray_MultiIter_DATA(multi, 2)
276
array_data[i] = func(state, oa_data[0], ob_data[0], oc_data[0])
277
PyArray_MultiIter_NEXT(multi)
264
279
array = <ndarray>_sp.empty(size, _sp.float64)
265
array_data = <double *>array.data
267
length = PyArray_SIZE(array)
268
for i from 0 <= i < length:
269
array_data[i] = func(state, oa_data[0], ob_data[0], oc_data[0])
271
multi = <broadcast>PyArray_MultiIterNew(4, <void*>array, <void *>oa,
272
<void *>ob, <void *>oc)
273
if (multi.size != PyArray_SIZE(array)):
274
raise ValueError("size is not compatible with inputs")
275
for i from 0 <= i < multi.size:
276
oa_data = <double *>PyArray_MultiIter_DATA(multi, 1)
277
ob_data = <double *>PyArray_MultiIter_DATA(multi, 2)
278
oc_data = <double *>PyArray_MultiIter_DATA(multi, 3)
279
array_data[i] = func(state, oa_data[0], ob_data[0], oc_data[0])
280
PyArray_MultiIter_NEXT(multi)
280
array_data = <double *>array.data
281
multi = <broadcast>PyArray_MultiIterNew(4, <void*>array, <void *>oa,
282
<void *>ob, <void *>oc)
283
if (multi.size != PyArray_SIZE(array)):
284
raise ValueError("size is not compatible with inputs")
285
for i from 0 <= i < multi.size:
286
oa_data = <double *>PyArray_MultiIter_DATA(multi, 1)
287
ob_data = <double *>PyArray_MultiIter_DATA(multi, 2)
288
oc_data = <double *>PyArray_MultiIter_DATA(multi, 3)
289
array_data[i] = func(state, oa_data[0], ob_data[0], oc_data[0])
290
PyArray_MultiIter_NEXT(multi)
283
293
cdef object disc0_array(rk_state *state, rk_disc0 func, object size):
304
330
cdef double *op_data
305
331
cdef long *on_data
307
332
cdef broadcast multi
310
if (on.nd == 0 and op.nd == 0):
311
on_data = <long *>on.data
312
op_data = <double *>op.data
317
return func(state, on_data[0], op_data[0])
319
multi = <broadcast> PyArray_MultiIterNew(2, <void *>on, <void *>op)
320
array = <ndarray> PyArray_SimpleNew(multi.nd, multi.dimensions, NPY_LONG)
321
array_data = <long *>array.data
322
for i from 0 <= i < multi.size:
323
on_data = <long *>PyArray_MultiIter_DATA(multi, 0)
324
op_data = <double *>PyArray_MultiIter_DATA(multi, 1)
325
array_data[i] = func(state, on_data[0], op_data[0])
326
PyArray_MultiIter_NEXT(multi)
335
multi = <broadcast> PyArray_MultiIterNew(2, <void *>on, <void *>op)
336
array = <ndarray> PyArray_SimpleNew(multi.nd, multi.dimensions, NPY_LONG)
337
array_data = <long *>array.data
338
for i from 0 <= i < multi.size:
339
on_data = <long *>PyArray_MultiIter_DATA(multi, 0)
340
op_data = <double *>PyArray_MultiIter_DATA(multi, 1)
341
array_data[i] = func(state, on_data[0], op_data[0])
342
PyArray_MultiIter_NEXT(multi)
328
array = <ndarray>_sp.empty(size, int)
330
length = PyArray_SIZE(array)
331
array_data = <long *>array.data
332
for i from 0 <= i < length:
333
array_data[i] = func(state, on_data[0], op_data[0])
335
multi = <broadcast>PyArray_MultiIterNew(3, <void*>array, <void *>on, <void *>op)
336
if (multi.size != PyArray_SIZE(array)):
337
raise ValueError("size is not compatible with inputs")
338
for i from 0 <= i < multi.size:
339
on_data = <long *>PyArray_MultiIter_DATA(multi, 1)
340
op_data = <double *>PyArray_MultiIter_DATA(multi, 2)
341
array_data[i] = func(state, on_data[0], op_data[0])
342
PyArray_MultiIter_NEXTi(multi, 1)
343
PyArray_MultiIter_NEXTi(multi, 2)
344
array = <ndarray>_sp.empty(size, int)
345
array_data = <long *>array.data
346
multi = <broadcast>PyArray_MultiIterNew(3, <void*>array, <void *>on, <void *>op)
347
if (multi.size != PyArray_SIZE(array)):
348
raise ValueError("size is not compatible with inputs")
349
for i from 0 <= i < multi.size:
350
on_data = <long *>PyArray_MultiIter_DATA(multi, 1)
351
op_data = <double *>PyArray_MultiIter_DATA(multi, 2)
352
array_data[i] = func(state, on_data[0], op_data[0])
353
PyArray_MultiIter_NEXTi(multi, 1)
354
PyArray_MultiIter_NEXTi(multi, 2)
347
cdef object discnmN_array(rk_state *state, rk_discnmN func, object size,
358
cdef object discnmN_array_sc(rk_state *state, rk_discnmN func, object size,
359
long n, long m, long N):
360
cdef long *array_data
361
cdef ndarray array "arrayObject"
366
return func(state, n, m, N)
368
array = <ndarray>_sp.empty(size, int)
369
length = PyArray_SIZE(array)
370
array_data = <long *>array.data
371
for i from 0 <= i < length:
372
array_data[i] = func(state, n, m, N)
375
cdef object discnmN_array(rk_state *state, rk_discnmN func, object size,
348
376
ndarray on, ndarray om, ndarray oN):
349
377
cdef long *array_data
350
378
cdef long *on_data
354
382
cdef npy_intp length
356
384
cdef broadcast multi
360
if (on.nd == 0 and om.nd == 0 and oN.nd==0):
362
on_data = <long *>on.data
363
om_data = <long *>om.data
364
oN_data = <long *>oN.data
368
return func(state, on_data[0], om_data[0], oN_data[0])
370
multi = <broadcast> PyArray_MultiIterNew(3, <void *>on, <void *>om, <void *>oN)
371
array = <ndarray> PyArray_SimpleNew(multi.nd, multi.dimensions, NPY_LONG)
372
array_data = <long *>array.data
373
for i from 0 <= i < multi.size:
374
on_data = <long *>PyArray_MultiIter_DATA(multi, 0)
375
om_data = <long *>PyArray_MultiIter_DATA(multi, 1)
376
oN_data = <long *>PyArray_MultiIter_DATA(multi, 2)
377
array_data[i] = func(state, on_data[0], om_data[0], oN_data[0])
378
PyArray_MultiIter_NEXT(multi)
387
multi = <broadcast> PyArray_MultiIterNew(3, <void *>on, <void *>om, <void *>oN)
388
array = <ndarray> PyArray_SimpleNew(multi.nd, multi.dimensions, NPY_LONG)
389
array_data = <long *>array.data
390
for i from 0 <= i < multi.size:
391
on_data = <long *>PyArray_MultiIter_DATA(multi, 0)
392
om_data = <long *>PyArray_MultiIter_DATA(multi, 1)
393
oN_data = <long *>PyArray_MultiIter_DATA(multi, 2)
394
array_data[i] = func(state, on_data[0], om_data[0], oN_data[0])
395
PyArray_MultiIter_NEXT(multi)
380
397
array = <ndarray>_sp.empty(size, int)
381
398
array_data = <long *>array.data
383
length = PyArray_SIZE(array)
384
for i from 0 <= i < length:
385
array_data[i] = func(state, on_data[0], om_data[0], oN_data[0])
387
multi = <broadcast>PyArray_MultiIterNew(4, <void*>array, <void *>on, <void *>om,
389
if (multi.size != PyArray_SIZE(array)):
390
raise ValueError("size is not compatible with inputs")
391
for i from 0 <= i < multi.size:
392
on_data = <long *>PyArray_MultiIter_DATA(multi, 1)
393
om_data = <long *>PyArray_MultiIter_DATA(multi, 2)
394
oN_data = <long *>PyArray_MultiIter_DATA(multi, 3)
395
array_data[i] = func(state, on_data[0], om_data[0], oN_data[0])
396
PyArray_MultiIter_NEXT(multi)
399
multi = <broadcast>PyArray_MultiIterNew(4, <void*>array, <void *>on, <void *>om,
401
if (multi.size != PyArray_SIZE(array)):
402
raise ValueError("size is not compatible with inputs")
403
for i from 0 <= i < multi.size:
404
on_data = <long *>PyArray_MultiIter_DATA(multi, 1)
405
om_data = <long *>PyArray_MultiIter_DATA(multi, 2)
406
oN_data = <long *>PyArray_MultiIter_DATA(multi, 3)
407
array_data[i] = func(state, on_data[0], om_data[0], oN_data[0])
408
PyArray_MultiIter_NEXT(multi)
412
cdef object discd_array_sc(rk_state *state, rk_discd func, object size, double a):
413
cdef long *array_data
414
cdef ndarray array "arrayObject"
419
return func(state, a)
421
array = <ndarray>_sp.empty(size, int)
422
length = PyArray_SIZE(array)
423
array_data = <long *>array.data
424
for i from 0 <= i < length:
425
array_data[i] = func(state, a)
400
428
cdef object discd_array(rk_state *state, rk_discd func, object size, ndarray oa):
401
429
cdef long *array_data
402
430
cdef double *oa_data
406
434
cdef broadcast multi
407
435
cdef flatiter itera
412
oa_data = <double *>oa.data
417
return func(state, oa_data[0])
419
array = <ndarray>PyArray_SimpleNew(oa.nd, oa.dimensions, NPY_LONG)
420
length = PyArray_SIZE(array)
421
array_data = <long *>array.data
422
itera = <flatiter>PyArray_IterNew(<object>oa)
423
for i from 0 <= i < length:
424
array_data[i] = func(state, (<double *>(itera.dataptr))[0])
425
PyArray_ITER_NEXT(itera)
438
array = <ndarray>PyArray_SimpleNew(oa.nd, oa.dimensions, NPY_LONG)
439
length = PyArray_SIZE(array)
440
array_data = <long *>array.data
441
itera = <flatiter>PyArray_IterNew(<object>oa)
442
for i from 0 <= i < length:
443
array_data[i] = func(state, (<double *>(itera.dataptr))[0])
444
PyArray_ITER_NEXT(itera)
427
446
array = <ndarray>_sp.empty(size, int)
428
447
array_data = <long *>array.data
430
length = PyArray_SIZE(array)
431
for i from 0 <= i < length:
432
array_data[i] = func(state, oa_data[0])
434
multi = <broadcast>PyArray_MultiIterNew(2, <void *>array, <void *>oa)
435
if (multi.size != PyArray_SIZE(array)):
436
raise ValueError("size is not compatible with inputs")
437
for i from 0 <= i < multi.size:
438
oa_data = <double *>PyArray_MultiIter_DATA(multi, 1)
439
array_data[i] = func(state, oa_data[0])
440
PyArray_MultiIter_NEXTi(multi, 1)
448
multi = <broadcast>PyArray_MultiIterNew(2, <void *>array, <void *>oa)
449
if (multi.size != PyArray_SIZE(array)):
450
raise ValueError("size is not compatible with inputs")
451
for i from 0 <= i < multi.size:
452
oa_data = <double *>PyArray_MultiIter_DATA(multi, 1)
453
array_data[i] = func(state, oa_data[0])
454
PyArray_MultiIter_NEXTi(multi, 1)
443
457
cdef double kahan_sum(double *darr, long n):
506
523
def get_state(self):
507
524
"""Return a tuple representing the internal state of the generator.
509
get_state() -> ('MT19937', int key[624], int pos)
526
get_state() -> ('MT19937', int key[624], int pos, int has_gauss, float cached_gaussian)
511
528
cdef ndarray state "arrayObject_state"
512
state = <ndarray>_sp.empty(624, int)
513
memcpy(<void*>(state.data), self.internal_state.key, 624*sizeof(long))
514
return ('MT19937', state, self.internal_state.pos)
529
state = <ndarray>_sp.empty(624, _sp.uint)
530
memcpy(<void*>(state.data), <void*>(self.internal_state.key), 624*sizeof(long))
531
state = <ndarray>_sp.asarray(state, _sp.uint32)
532
return ('MT19937', state, self.internal_state.pos,
533
self.internal_state.has_gauss, self.internal_state.gauss)
516
535
def set_state(self, state):
517
536
"""Set the state from a tuple.
538
state = ('MT19937', int key[624], int pos, int has_gauss, float cached_gaussian)
540
For backwards compatibility, the following form is also accepted
541
although it is missing some information about the cached Gaussian value.
519
543
state = ('MT19937', int key[624], int pos)
523
547
cdef ndarray obj "arrayObject_obj"
765
867
noncentral_f(dfnum, dfden, nonc, size=None) -> random values
869
cdef ndarray odfnum, odfden, ononc
870
cdef double fdfnum, fdfden, fnonc
872
fdfnum = PyFloat_AsDouble(dfnum)
873
fdfden = PyFloat_AsDouble(dfden)
874
fnonc = PyFloat_AsDouble(nonc)
875
if not PyErr_Occurred():
877
raise ValueError("dfnum <= 1")
879
raise ValueError("dfden <= 0")
881
raise ValueError("nonc < 0")
882
return cont3_array_sc(self.internal_state, rk_noncentral_f, size,
883
fdfnum, fdfden, fnonc)
770
887
odfnum = <ndarray>PyArray_FROM_OTF(dfnum, NPY_DOUBLE, NPY_ALIGNED)
771
888
odfden = <ndarray>PyArray_FROM_OTF(dfden, NPY_DOUBLE, NPY_ALIGNED)
772
ononc = <ndarray>PyArray_FROM_OTF(nonc, NPY_DOUBLE, NPY_ALIGNED)
889
ononc = <ndarray>PyArray_FROM_OTF(nonc, NPY_DOUBLE, NPY_ALIGNED)
774
891
if _sp.any(_sp.less_equal(odfnum, 1.0)):
775
raise ValueError("dfnum <= 1")
776
if _sp.any(_sp.less_equal(odfden, 0.0)):
892
raise ValueError("dfnum <= 1")
893
if _sp.any(_sp.less_equal(odfden, 0.0)):
777
894
raise ValueError("dfden <= 0")
778
895
if _sp.any(_sp.less(ononc, 0.0)):
779
896
raise ValueError("nonc < 0")
845
1004
pareto(a, size=None)
1009
fa = PyFloat_AsDouble(a)
1010
if not PyErr_Occurred():
1012
raise ValueError("a <= 0")
1013
return cont1_array_sc(self.internal_state, rk_pareto, size, fa)
848
1017
oa = <ndarray>PyArray_FROM_OTF(a, NPY_DOUBLE, NPY_ALIGNED)
849
if _sp.any(_sp.less_equal(oa, 0.0)):
1018
if _sp.any(_sp.less_equal(oa, 0.0)):
850
1019
raise ValueError("a <= 0")
851
1020
return cont1_array(self.internal_state, rk_pareto, size, oa)
853
def weibull(self, double a, size=None):
1022
def weibull(self, a, size=None):
854
1023
"""Weibull distribution.
856
1025
weibull(a, size=None)
1030
fa = PyFloat_AsDouble(a)
1031
if not PyErr_Occurred():
1033
raise ValueError("a <= 0")
1034
return cont1_array_sc(self.internal_state, rk_weibull, size, fa)
859
1038
oa = <ndarray>PyArray_FROM_OTF(a, NPY_DOUBLE, NPY_ALIGNED)
860
if _sp.any(_sp.less_equal(oa, 0.0)):
1039
if _sp.any(_sp.less_equal(oa, 0.0)):
861
1040
raise ValueError("a <= 0")
862
1041
return cont1_array(self.internal_state, rk_weibull, size, oa)
864
def power(self, double a, size=None):
1043
def power(self, a, size=None):
865
1044
"""Power distribution.
867
1046
power(a, size=None)
1051
fa = PyFloat_AsDouble(a)
1052
if not PyErr_Occurred():
1054
raise ValueError("a <= 0")
1055
return cont1_array_sc(self.internal_state, rk_power, size, fa)
870
1059
oa = <ndarray>PyArray_FROM_OTF(a, NPY_DOUBLE, NPY_ALIGNED)
871
if _sp.any(_sp.less_equal(oa, 0.0)):
1060
if _sp.any(_sp.less_equal(oa, 0.0)):
872
1061
raise ValueError("a <= 0")
873
1062
return cont1_array(self.internal_state, rk_power, size, oa)
875
1064
def laplace(self, loc=0.0, scale=1.0, size=None):
876
1065
"""Laplace distribution.
878
1067
laplace(loc=0.0, scale=1.0, size=None)
1069
cdef ndarray oloc, oscale
1070
cdef double floc, fscale
1072
floc = PyFloat_AsDouble(loc)
1073
fscale = PyFloat_AsDouble(scale)
1074
if not PyErr_Occurred():
1076
raise ValueError("scale <= 0")
1077
return cont2_array_sc(self.internal_state, rk_laplace, size, floc, fscale)
882
1080
oloc = PyArray_FROM_OTF(loc, NPY_DOUBLE, NPY_ALIGNED)
883
1081
oscale = PyArray_FROM_OTF(scale, NPY_DOUBLE, NPY_ALIGNED)
884
if _sp.any(_sp.less_equal(oscale, 0.0)):
1082
if _sp.any(_sp.less_equal(oscale, 0.0)):
885
1083
raise ValueError("scale <= 0")
886
1084
return cont2_array(self.internal_state, rk_laplace, size, oloc, oscale)
888
1086
def gumbel(self, loc=0.0, scale=1.0, size=None):
889
1087
"""Gumbel distribution.
891
1089
gumbel(loc=0.0, scale=1.0, size=None)
1091
cdef ndarray oloc, oscale
1092
cdef double floc, fscale
1094
floc = PyFloat_AsDouble(loc)
1095
fscale = PyFloat_AsDouble(scale)
1096
if not PyErr_Occurred():
1098
raise ValueError("scale <= 0")
1099
return cont2_array_sc(self.internal_state, rk_gumbel, size, floc, fscale)
895
1102
oloc = PyArray_FROM_OTF(loc, NPY_DOUBLE, NPY_ALIGNED)
896
1103
oscale = PyArray_FROM_OTF(scale, NPY_DOUBLE, NPY_ALIGNED)
897
if _sp.any(_sp.less_equal(oscale, 0.0)):
1104
if _sp.any(_sp.less_equal(oscale, 0.0)):
898
1105
raise ValueError("scale <= 0")
899
1106
return cont2_array(self.internal_state, rk_gumbel, size, oloc, oscale)
901
1108
def logistic(self, loc=0.0, scale=1.0, size=None):
902
1109
"""Logistic distribution.
904
1111
logistic(loc=0.0, scale=1.0, size=None)
1113
cdef ndarray oloc, oscale
1114
cdef double floc, fscale
1116
floc = PyFloat_AsDouble(loc)
1117
fscale = PyFloat_AsDouble(scale)
1118
if not PyErr_Occurred():
1120
raise ValueError("scale <= 0")
1121
return cont2_array_sc(self.internal_state, rk_logistic, size, floc, fscale)
908
1124
oloc = PyArray_FROM_OTF(loc, NPY_DOUBLE, NPY_ALIGNED)
909
1125
oscale = PyArray_FROM_OTF(scale, NPY_DOUBLE, NPY_ALIGNED)
910
if _sp.any(_sp.less_equal(oscale, 0.0)):
1126
if _sp.any(_sp.less_equal(oscale, 0.0)):
911
1127
raise ValueError("scale <= 0")
912
1128
return cont2_array(self.internal_state, rk_logistic, size, oloc, oscale)
914
1130
def lognormal(self, mean=0.0, sigma=1.0, size=None):
915
1131
"""Log-normal distribution.
917
Note that the mean parameter is not the mean of this distribution, but
1133
Note that the mean parameter is not the mean of this distribution, but
918
1134
the underlying normal distribution.
920
1136
lognormal(mean, sigma) <=> exp(normal(mean, sigma))
922
1138
lognormal(mean=0.0, sigma=1.0, size=None)
1140
cdef ndarray omean, osigma
1141
cdef double fmean, fsigma
1143
fmean = PyFloat_AsDouble(mean)
1144
fsigma = PyFloat_AsDouble(sigma)
1146
if not PyErr_Occurred():
1148
raise ValueError("sigma <= 0")
1149
return cont2_array_sc(self.internal_state, rk_lognormal, size, fmean, fsigma)
926
1153
omean = PyArray_FROM_OTF(mean, NPY_DOUBLE, NPY_ALIGNED)
927
1154
osigma = PyArray_FROM_OTF(sigma, NPY_DOUBLE, NPY_ALIGNED)
928
1155
if _sp.any(_sp.less_equal(osigma, 0.0)):
929
1156
raise ValueError("sigma <= 0.0")
930
1157
return cont2_array(self.internal_state, rk_lognormal, size, omean, osigma)
932
1159
def rayleigh(self, scale=1.0, size=None):
933
1160
"""Rayleigh distribution.
935
1162
rayleigh(scale=1.0, size=None)
937
1164
cdef ndarray oscale
1167
fscale = PyFloat_AsDouble(scale)
1169
if not PyErr_Occurred():
1171
raise ValueError("scale <= 0")
1172
return cont1_array_sc(self.internal_state, rk_rayleigh, size, fscale)
938
1176
oscale = <ndarray>PyArray_FROM_OTF(scale, NPY_DOUBLE, NPY_ALIGNED)
939
if _sp.any(_sp.less_equal(oscale, 0.0)):
1177
if _sp.any(_sp.less_equal(oscale, 0.0)):
940
1178
raise ValueError("scale <= 0.0")
941
1179
return cont1_array(self.internal_state, rk_rayleigh, size, oscale)
943
1181
def wald(self, mean, scale, size=None):
944
1182
"""Wald (inverse Gaussian) distribution.
946
1184
wald(mean, scale, size=None)
1186
cdef ndarray omean, oscale
1187
cdef double fmean, fscale
1189
fmean = PyFloat_AsDouble(mean)
1190
fscale = PyFloat_AsDouble(scale)
1191
if not PyErr_Occurred():
1193
raise ValueError("mean <= 0")
1195
raise ValueError("scale <= 0")
1196
return cont2_array_sc(self.internal_state, rk_wald, size, fmean, fscale)
950
1199
omean = PyArray_FROM_OTF(mean, NPY_DOUBLE, NPY_ALIGNED)
951
1200
oscale = PyArray_FROM_OTF(scale, NPY_DOUBLE, NPY_ALIGNED)
952
1201
if _sp.any(_sp.less_equal(omean,0.0)):
955
1204
raise ValueError("scale <= 0.0")
956
1205
return cont2_array(self.internal_state, rk_wald, size, omean, oscale)
958
1209
def triangular(self, left, mode, right, size=None):
959
"""Triangular distribution starting at left, peaking at mode, and
1210
"""Triangular distribution starting at left, peaking at mode, and
960
1211
ending at right (left <= mode <= right).
962
1213
triangular(left, mode, right, size=None)
1215
cdef ndarray oleft, omode, oright
1216
cdef double fleft, fmode, fright
1218
fleft = PyFloat_AsDouble(left)
1219
fright = PyFloat_AsDouble(right)
1220
fmode = PyFloat_AsDouble(mode)
1221
if not PyErr_Occurred():
1223
raise ValueError("left > mode")
1225
raise ValueError("mode > right")
1227
raise ValueError("left == right")
1228
return cont3_array_sc(self.internal_state, rk_triangular, size, fleft,
967
1232
oleft = <ndarray>PyArray_FROM_OTF(left, NPY_DOUBLE, NPY_ALIGNED)
968
1233
omode = <ndarray>PyArray_FROM_OTF(mode, NPY_DOUBLE, NPY_ALIGNED)
969
oright = <ndarray>PyArray_FROM_OTF(right, NPY_DOUBLE, NPY_ALIGNED)
1234
oright = <ndarray>PyArray_FROM_OTF(right, NPY_DOUBLE, NPY_ALIGNED)
971
1236
if _sp.any(_sp.greater(oleft, omode)):
972
1237
raise ValueError("left > mode")
973
1238
if _sp.any(_sp.greater(omode, oright)):
974
1239
raise ValueError("mode > right")
975
1240
if _sp.any(_sp.equal(oleft, oright)):
976
1241
raise ValueError("left == right")
977
return cont3_array(self.internal_state, rk_triangular, size, oleft,
1242
return cont3_array(self.internal_state, rk_triangular, size, oleft,
980
1245
# Complicated, discrete distributions:
1027
1333
def zipf(self, a, size=None):
1028
1334
"""Zipf distribution.
1030
1336
zipf(a, size=None)
1032
1338
cdef ndarray oa
1341
fa = PyFloat_AsDouble(a)
1342
if not PyErr_Occurred():
1344
raise ValueError("a <= 1.0")
1345
return discd_array_sc(self.internal_state, rk_zipf, size, fa)
1033
1349
oa = <ndarray>PyArray_FROM_OTF(a, NPY_DOUBLE, NPY_ALIGNED)
1034
1350
if _sp.any(_sp.less_equal(oa, 1.0)):
1035
1351
raise ValueError("a <= 1.0")
1036
1352
return discd_array(self.internal_state, rk_zipf, size, oa)
1038
1354
def geometric(self, p, size=None):
1039
1355
"""Geometric distribution with p being the probability of "success" on
1040
1356
an individual trial.
1042
1358
geometric(p, size=None)
1044
1360
cdef ndarray op
1363
fp = PyFloat_AsDouble(p)
1364
if not PyErr_Occurred():
1366
raise ValueError("p < 0.0")
1368
raise ValueError("p > 1.0")
1369
return discd_array_sc(self.internal_state, rk_geometric, size, fp)
1045
1374
op = <ndarray>PyArray_FROM_OTF(p, NPY_DOUBLE, NPY_ALIGNED)
1046
if _sp.any(_sp.less(op, 0.0)):
1375
if _sp.any(_sp.less(op, 0.0)):
1047
1376
raise ValueError("p < 0.0")
1048
1377
if _sp.any(_sp.greater(op, 1.0)):
1049
1378
raise ValueError("p > 1.0")
1050
1379
return discd_array(self.internal_state, rk_geometric, size, op)
1052
1381
def hypergeometric(self, ngood, nbad, nsample, size=None):
1053
1382
"""Hypergeometric distribution.
1055
Consider an urn with ngood "good" balls and nbad "bad" balls. If one
1056
were to draw nsample balls from the urn without replacement, then
1057
the hypergeometric distribution describes the distribution of "good"
1384
Consider an urn with ngood "good" balls and nbad "bad" balls. If one
1385
were to draw nsample balls from the urn without replacement, then
1386
the hypergeometric distribution describes the distribution of "good"
1058
1387
balls in the sample.
1060
hypergeometric(ngood, nbad, nsample, size=None)
1389
hypergeometric(ngood, nbad, nsample, size=None)
1064
cdef ndarray onsample
1391
cdef ndarray ongood, onbad, onsample
1392
cdef long lngood, lnbad, lnsample
1394
lngood = PyInt_AsLong(ngood)
1395
lnbad = PyInt_AsLong(nbad)
1396
lnsample = PyInt_AsLong(nsample)
1397
if not PyErr_Occurred():
1399
raise ValueError("ngood < 1")
1401
raise ValueError("nbad < 1")
1403
raise ValueError("nsample < 1")
1404
if ngood + nbad < nsample:
1405
raise ValueError("ngood + nbad < nsample")
1406
return discnmN_array_sc(self.internal_state, rk_hypergeometric, size,
1407
lngood, lnbad, lnsample)
1066
1412
ongood = <ndarray>PyArray_FROM_OTF(ngood, NPY_LONG, NPY_ALIGNED)
1067
1413
onbad = <ndarray>PyArray_FROM_OTF(nbad, NPY_LONG, NPY_ALIGNED)
1560
def dirichlet(self, object alpha, size=None):
1561
"""dirichlet(alpha, size=None)
1563
Draw `size` samples of dimension k from a Dirichlet distribution. A
1564
Dirichlet-distributed random variable can be seen as a multivariate
1565
generalization of a Beta distribution. Dirichlet pdf is the conjugate
1566
prior of a multinomial in Bayesian inference.
1571
Parameter of the distribution (k dimension for sample of
1574
Number of samples to draw.
1578
.. math:: X \\approx \\prod_{i=1}^{k}{x^{\\alpha_i-1}_i}
1580
Uses the following property for computation: for each dimension,
1581
draw a random sample y_i from a standard gamma generator of shape
1583
:math:`X = \\frac{1}{\\sum_{i=1}^k{y_i}} (y_1, \\ldot, y_n)` is
1584
Dirichlet distributed.
1588
.. [1] David McKay, "Information Theory, Inference and Learning
1589
Algorithms," chapter 23,
1590
http://www.inference.phy.cam.ac.uk/mackay/
1597
#alpha = N.atleast_1d(alpha)
1602
# for i in range(k):
1603
# val[i] = sgamma(alpha[i], n)
1606
# val = N.zeros((k, n))
1607
# for i in range(k):
1608
# val[i] = sgamma(alpha[i], n)
1609
# val /= N.sum(val, axis = 0)
1616
cdef ndarray alpha_arr, val_arr
1617
cdef double *alpha_data, *val_data
1619
cdef double acc, invacc
1622
alpha_arr = <ndarray>PyArray_ContiguousFromObject(alpha, NPY_DOUBLE, 1, 1)
1623
alpha_data = <double*>alpha_arr.data
1627
elif type(size) is int:
1632
diric = _sp.zeros(shape, _sp.float64)
1633
val_arr = <ndarray>diric
1634
val_data= <double*>val_arr.data
1637
totsize = PyArray_SIZE(val_arr)
1640
for j from 0 <= j < k:
1641
val_data[i+j] = rk_standard_gamma(self.internal_state, alpha_data[j])
1642
acc = acc + val_data[i+j]
1644
for j from 0 <= j < k:
1645
val_data[i+j] = val_data[i+j] * invacc
1202
1650
# Shuffling and permutations:
1203
1651
def shuffle(self, object x):
1204
1652
"""Modify a sequence in-place by shuffling its contents.
1210
# adaptation of random.shuffle()
1213
j = rk_interval(i, self.internal_state)
1214
x[i], x[j] = x[j], x[i]
1666
# adaptation of random.shuffle()
1668
j = rk_interval(i, self.internal_state)
1669
x[i], x[j] = x[j], x[i]
1673
copy = hasattr(x[0], 'copy')
1676
j = rk_interval(i, self.internal_state)
1677
x[i], x[j] = x[j].copy(), x[i].copy()
1681
j = rk_interval(i, self.internal_state)
1682
x[i], x[j] = x[j][:], x[i][:]
1217
1685
def permutation(self, object x):
1218
"""Given an integer, return a shuffled sequence of integers >= 0 and
1686
"""Given an integer, return a shuffled sequence of integers >= 0 and
1219
1687
< x; given a sequence, return a shuffled array copy.
1691
if isinstance(x, (int, _sp.integer)):
1224
1692
arr = _sp.arange(x)
1226
1694
arr = _sp.array(x)
1227
1695
self.shuffle(arr)
1230
1698
_rand = RandomState()
1231
1699
seed = _rand.seed