@@ -16,10 +16,10 @@ ctypedef uint32_t (* random_uint_1_i_32)(aug_state* state, uint32_t a) nogil
1616ctypedef int32_t (* random_int_2_i_32)(aug_state* state, int32_t a, int32_t b) nogil
1717ctypedef int64_t (* random_int_2_i)(aug_state* state, int64_t a, int64_t b) nogil
1818
19- ctypedef void (* random_double_fill)(aug_state* state, int count, double * out) nogil
19+ ctypedef void (* random_double_fill)(aug_state* state, np.npy_intp count, double * out) nogil
2020
21- cdef Py_ssize_t compute_numel(size):
22- cdef Py_ssize_t i, n = 1
21+ cdef np.npy_intp compute_numel(size):
22+ cdef np.npy_intp i, n = 1
2323 if isinstance (size, tuple ):
2424 for i in range (len (size)):
2525 n *= size[i]
@@ -104,25 +104,28 @@ cdef object cont_broadcast_1(aug_state* state, void* func, object size, object l
104104 object a, object a_name, constraint_type a_constraint):
105105
106106 cdef np.ndarray a_arr, randoms
107+ cdef double * randoms_data
107108 cdef np.broadcast it
108109 cdef random_double_1 f = (< random_double_1> func)
110+ cdef np.npy_intp i, n
109111
110112 a_arr = < np.ndarray> np.PyArray_FROM_OTF(a, np.NPY_DOUBLE, np.NPY_ALIGNED)
111113 if a_constraint != CONS_NONE:
112114 check_array_constraint(a_arr, a_name, a_constraint)
113115
114116 if size is not None :
115- randoms = np.empty(size, np.double)
117+ randoms = < np.ndarray > np.empty(size, np.double)
116118 else :
117- # randoms = np.empty(np.shape(a_arr), np.double)
118119 randoms = np.PyArray_SimpleNew(np.PyArray_NDIM(a_arr), np.PyArray_DIMS(a_arr), np.NPY_DOUBLE)
119120
120-
121+ randoms_data = < double * > np.PyArray_DATA(randoms)
122+ n = np.PyArray_SIZE(randoms)
121123 it = np.broadcast(randoms, a_arr)
124+
122125 with lock, nogil:
123- while np.PyArray_MultiIter_NOTDONE(it ):
126+ for i in range (n ):
124127 a_val = (< double * > np.PyArray_MultiIter_DATA(it, 1 ))[0 ]
125- ( < double * > np.PyArray_MultiIter_DATA(it, 0 ))[ 0 ] = f(state, a_val)
128+ randoms_data[i ] = f(state, a_val)
126129
127130 np.PyArray_MultiIter_NEXT(it)
128131
@@ -132,8 +135,10 @@ cdef object cont_broadcast_2(aug_state* state, void* func, object size, object l
132135 object a, object a_name, constraint_type a_constraint,
133136 object b, object b_name, constraint_type b_constraint):
134137 cdef np.ndarray a_arr, b_arr, randoms
138+ cdef double * randoms_data
135139 cdef np.broadcast it
136140 cdef random_double_2 f = (< random_double_2> func)
141+ cdef np.npy_intp i, n
137142
138143 a_arr = < np.ndarray> np.PyArray_FROM_OTF(a, np.NPY_DOUBLE, np.NPY_ALIGNED)
139144 if a_constraint != CONS_NONE:
@@ -144,18 +149,22 @@ cdef object cont_broadcast_2(aug_state* state, void* func, object size, object l
144149 check_array_constraint(b_arr, b_name, b_constraint)
145150
146151 if size is not None :
147- randoms = np.empty(size, np.double)
152+ randoms = < np.ndarray > np.empty(size, np.double)
148153 else :
149154 it = np.PyArray_MultiIterNew2(a_arr, b_arr)
150- randoms = np.empty(it.shape, np.double)
151- # randoms = np.PyArray_SimpleNew(it.nd, np.PyArray_DIMS(it), np.NPY_DOUBLE)
155+ randoms = < np.ndarray> np.empty(it.shape, np.double)
156+ # randoms = np.PyArray_SimpleNew(it.nd, np.PyArray_DIMS(it), np.NPY_DOUBLE)
157+
158+
159+ randoms_data = < double * > np.PyArray_DATA(randoms)
160+ n = np.PyArray_SIZE(randoms)
152161
153162 it = np.PyArray_MultiIterNew3(randoms, a_arr, b_arr)
154163 with lock, nogil:
155- while np.PyArray_MultiIter_NOTDONE(it ):
164+ for i in range (n ):
156165 a_val = (< double * > np.PyArray_MultiIter_DATA(it, 1 ))[0 ]
157166 b_val = (< double * > np.PyArray_MultiIter_DATA(it, 2 ))[0 ]
158- ( < double * > np.PyArray_MultiIter_DATA(it, 0 ))[ 0 ] = f(state, a_val, b_val)
167+ randoms_data[i ] = f(state, a_val, b_val)
159168
160169 np.PyArray_MultiIter_NEXT(it)
161170
@@ -166,8 +175,10 @@ cdef object cont_broadcast_3(aug_state* state, void* func, object size, object l
166175 object b, object b_name, constraint_type b_constraint,
167176 object c, object c_name, constraint_type c_constraint):
168177 cdef np.ndarray a_arr, b_arr, c_arr, randoms
178+ cdef double * randoms_data
169179 cdef np.broadcast it
170180 cdef random_double_3 f = (< random_double_3> func)
181+ cdef np.npy_intp i, n
171182
172183 a_arr = < np.ndarray> np.PyArray_FROM_OTF(a, np.NPY_DOUBLE, np.NPY_ALIGNED)
173184 if a_constraint != CONS_NONE:
@@ -182,20 +193,22 @@ cdef object cont_broadcast_3(aug_state* state, void* func, object size, object l
182193 check_array_constraint(c_arr, c_name, c_constraint)
183194
184195 if size is not None :
185- randoms = np.empty(size, np.double)
196+ randoms = < np.ndarray > np.empty(size, np.double)
186197 else :
187198 it = np.PyArray_MultiIterNew3(a_arr, b_arr, c_arr)
188199 # randoms = np.PyArray_SimpleNew(it.nd, np.PyArray_DIMS(it), np.NPY_DOUBLE)
189- randoms = np.empty(it.shape, np.double)
200+ randoms = < np.ndarray > np.empty(it.shape, np.double)
190201
191- it = it = np.PyArray_MultiIterNew4(randoms, a_arr, b_arr, c_arr)
192- # np.broadcast(randoms, a_arr, b_arr, c_arr)
202+ randoms_data = < double * > np.PyArray_DATA(randoms)
203+ n = np.PyArray_SIZE(randoms)
204+
205+ it = np.PyArray_MultiIterNew4(randoms, a_arr, b_arr, c_arr)
193206 with lock, nogil:
194- while np.PyArray_MultiIter_NOTDONE(it ):
207+ for i in range (n ):
195208 a_val = (< double * > np.PyArray_MultiIter_DATA(it, 1 ))[0 ]
196209 b_val = (< double * > np.PyArray_MultiIter_DATA(it, 2 ))[0 ]
197210 c_val = (< double * > np.PyArray_MultiIter_DATA(it, 3 ))[0 ]
198- ( < double * > np.PyArray_MultiIter_DATA(it, 0 ))[ 0 ] = f(state, a_val, b_val, c_val)
211+ randoms_data[i ] = f(state, a_val, b_val, c_val)
199212
200213 np.PyArray_MultiIter_NEXT(it)
201214
@@ -254,8 +267,9 @@ cdef object cont(aug_state* state, void* func, object size, object lock, int nar
254267 elif narg == 3 :
255268 return (< random_double_3> func)(state, _a, _b, _c)
256269
257- cdef Py_ssize_t i, n = compute_numel(size)
258- cdef double [::1 ] randoms = np.empty(n, np.double)
270+ cdef np.npy_intp i, n = compute_numel(size)
271+ cdef np.ndarray randoms = np.empty(n, np.double)
272+ cdef double * randoms_data = < double * > np.PyArray_DATA(randoms)
259273 cdef random_double_0 f0;
260274 cdef random_double_1 f1;
261275 cdef random_double_2 f2;
@@ -265,28 +279,30 @@ cdef object cont(aug_state* state, void* func, object size, object lock, int nar
265279 if narg == 0 :
266280 f0 = (< random_double_0> func)
267281 for i in range (n):
268- randoms [i] = f0(state)
282+ randoms_data [i] = f0(state)
269283 elif narg == 1 :
270284 f1 = (< random_double_1> func)
271285 for i in range (n):
272- randoms [i] = f1(state, _a)
286+ randoms_data [i] = f1(state, _a)
273287 elif narg == 2 :
274288 f2 = (< random_double_2> func)
275289 for i in range (n):
276- randoms [i] = f2(state, _a, _b)
290+ randoms_data [i] = f2(state, _a, _b)
277291 elif narg == 3 :
278292 f3 = (< random_double_3> func)
279293 for i in range (n):
280- randoms [i] = f3(state, _a, _b, _c)
294+ randoms_data [i] = f3(state, _a, _b, _c)
281295
282296 return np.asarray(randoms).reshape(size)
283297
284298cdef object discrete_broadcast_d(aug_state* state, void * func, object size, object lock,
285299 object a, object a_name, constraint_type a_constraint):
286300
287301 cdef np.ndarray a_arr, randoms
302+ cdef long * randoms_data
288303 cdef np.broadcast it
289304 cdef random_uint_d f = (< random_uint_d> func)
305+ cdef np.npy_intp i, n
290306
291307 a_arr = < np.ndarray> np.PyArray_FROM_OTF(a, np.NPY_DOUBLE, np.NPY_ALIGNED)
292308 if a_constraint != CONS_NONE:
@@ -298,11 +314,14 @@ cdef object discrete_broadcast_d(aug_state* state, void* func, object size, obje
298314 # randoms = np.empty(np.shape(a_arr), np.double)
299315 randoms = np.PyArray_SimpleNew(np.PyArray_NDIM(a_arr), np.PyArray_DIMS(a_arr), np.NPY_LONG)
300316
317+ randoms_data = < long * > np.PyArray_DATA(randoms)
318+ n = np.PyArray_SIZE(randoms)
319+
301320 it = np.broadcast(randoms, a_arr)
302321 with lock, nogil:
303- while np.PyArray_MultiIter_NOTDONE(it ):
322+ for i in range (n ):
304323 a_val = (< double * > np.PyArray_MultiIter_DATA(it, 1 ))[0 ]
305- ( < long * > np.PyArray_MultiIter_DATA(it, 0 ))[ 0 ] = f(state, a_val)
324+ randoms_data[i ] = f(state, a_val)
306325
307326 np.PyArray_MultiIter_NEXT(it)
308327
@@ -312,8 +331,10 @@ cdef object discrete_broadcast_dd(aug_state* state, void* func, object size, obj
312331 object a, object a_name, constraint_type a_constraint,
313332 object b, object b_name, constraint_type b_constraint):
314333 cdef np.ndarray a_arr, b_arr, randoms
334+ cdef long * randoms_data
315335 cdef np.broadcast it
316336 cdef random_uint_dd f = (< random_uint_dd> func)
337+ cdef np.npy_intp i, n
317338
318339 a_arr = < np.ndarray> np.PyArray_FROM_OTF(a, np.NPY_DOUBLE, np.NPY_ALIGNED)
319340 if a_constraint != CONS_NONE:
@@ -323,19 +344,21 @@ cdef object discrete_broadcast_dd(aug_state* state, void* func, object size, obj
323344 check_array_constraint(b_arr, b_name, b_constraint)
324345
325346 if size is not None :
326- randoms = np.empty(size, np.int)
347+ randoms = < np.ndarray > np.empty(size, np.int)
327348 else :
328349 it = np.PyArray_MultiIterNew2(a_arr, b_arr)
329- randoms = np.empty(it.shape, np.int)
350+ randoms = < np.ndarray > np.empty(it.shape, np.int)
330351 # randoms = np.PyArray_SimpleNew(it.nd, np.PyArray_DIMS(it), np.NPY_LONG)
331352
353+ randoms_data = < long * > np.PyArray_DATA(randoms)
354+ n = np.PyArray_SIZE(randoms)
355+
332356 it = np.PyArray_MultiIterNew3(randoms, a_arr, b_arr)
333357 with lock, nogil:
334- while np.PyArray_MultiIter_NOTDONE(it ):
358+ for i in range (n ):
335359 a_val = (< double * > np.PyArray_MultiIter_DATA(it, 1 ))[0 ]
336360 b_val = (< double * > np.PyArray_MultiIter_DATA(it, 2 ))[0 ]
337-
338- (< long * > np.PyArray_MultiIter_DATA(it, 0 ))[0 ] = f(state, a_val, b_val)
361+ randoms_data[i] = f(state, a_val, b_val)
339362
340363 np.PyArray_MultiIter_NEXT(it)
341364
@@ -345,8 +368,11 @@ cdef object discrete_broadcast_di(aug_state* state, void* func, object size, obj
345368 object a, object a_name, constraint_type a_constraint,
346369 object b, object b_name, constraint_type b_constraint):
347370 cdef np.ndarray a_arr, b_arr, randoms
371+ cdef long * randoms_data
348372 cdef np.broadcast it
349373 cdef random_uint_di f = (< random_uint_di> func)
374+ cdef np.npy_intp i, n
375+
350376
351377 a_arr = < np.ndarray> np.PyArray_FROM_OTF(a, np.NPY_DOUBLE, np.NPY_ALIGNED)
352378 if a_constraint != CONS_NONE:
@@ -357,15 +383,17 @@ cdef object discrete_broadcast_di(aug_state* state, void* func, object size, obj
357383 check_array_constraint(b_arr, b_name, b_constraint)
358384
359385 if size is not None :
360- randoms = np.empty(size, np.int)
386+ randoms = < np.ndarray > np.empty(size, np.int)
361387 else :
362388 it = np.PyArray_MultiIterNew2(a_arr, b_arr)
363- randoms = np.empty(it.shape, np.int)
364- # randoms = np.PyArray_SimpleNew(it.nd, np.PyArray_DIMS(it), np.NPY_LONG)
389+ randoms = < np.ndarray> np.empty(it.shape, np.int)
390+
391+ randoms_data = < long * > np.PyArray_DATA(randoms)
392+ n = np.PyArray_SIZE(randoms)
365393
366394 it = np.PyArray_MultiIterNew3(randoms, a_arr, b_arr)
367395 with lock, nogil:
368- while np.PyArray_MultiIter_NOTDONE(it ):
396+ for i in range (n ):
369397 a_val = (< double * > np.PyArray_MultiIter_DATA(it, 1 ))[0 ]
370398 b_val = (< long * > np.PyArray_MultiIter_DATA(it, 2 ))[0 ]
371399 (< long * > np.PyArray_MultiIter_DATA(it, 0 ))[0 ] = f(state, a_val, b_val)
@@ -379,8 +407,10 @@ cdef object discrete_broadcast_iii(aug_state* state, void* func, object size, ob
379407 object b, object b_name, constraint_type b_constraint,
380408 object c, object c_name, constraint_type c_constraint):
381409 cdef np.ndarray a_arr, b_arr, c_arr, randoms
410+ cdef long * randoms_data
382411 cdef np.broadcast it
383412 cdef random_uint_iii f = (< random_uint_iii> func)
413+ cdef np.npy_intp i, n
384414
385415 a_arr = < np.ndarray> np.PyArray_FROM_OTF(a, np.NPY_LONG, np.NPY_ALIGNED)
386416 if a_constraint != CONS_NONE:
@@ -395,19 +425,21 @@ cdef object discrete_broadcast_iii(aug_state* state, void* func, object size, ob
395425 check_array_constraint(c_arr, c_name, c_constraint)
396426
397427 if size is not None :
398- randoms = np.empty(size, np.int)
428+ randoms = < np.ndarray > np.empty(size, np.int)
399429 else :
400430 it = np.PyArray_MultiIterNew3(a_arr, b_arr, c_arr)
401- randoms = np.empty(it.shape, np.int)
402- # randoms = np.PyArray_SimpleNew(it.nd, np.PyArray_DIMS(it), np.NPY_LONG)
431+ randoms = < np.ndarray> np.empty(it.shape, np.int)
432+
433+ randoms_data = < long * > np.PyArray_DATA(randoms)
434+ n = np.PyArray_SIZE(randoms)
403435
404436 it = np.PyArray_MultiIterNew4(randoms, a_arr, b_arr, c_arr)
405437 with lock, nogil:
406- while np.PyArray_MultiIter_NOTDONE(it ):
438+ for i in range (n ):
407439 a_val = (< long * > np.PyArray_MultiIter_DATA(it, 1 ))[0 ]
408440 b_val = (< long * > np.PyArray_MultiIter_DATA(it, 2 ))[0 ]
409441 c_val = (< long * > np.PyArray_MultiIter_DATA(it, 3 ))[0 ]
410- ( < long * > np.PyArray_MultiIter_DATA(it, 0 ))[ 0 ] = f(state, a_val, b_val, c_val)
442+ randoms_data[i ] = f(state, a_val, b_val, c_val)
411443
412444 np.PyArray_MultiIter_NEXT(it)
413445
@@ -416,24 +448,28 @@ cdef object discrete_broadcast_iii(aug_state* state, void* func, object size, ob
416448cdef object discrete_broadcast_i(aug_state* state, void * func, object size, object lock,
417449 object a, object a_name, constraint_type a_constraint):
418450 cdef np.ndarray a_arr, randoms
451+ cdef long * randoms_data
419452 cdef np.broadcast it
420453 cdef random_uint_i f = (< random_uint_i> func)
454+ cdef np.npy_intp i, n
421455
422456 a_arr = < np.ndarray> np.PyArray_FROM_OTF(a, np.NPY_LONG, np.NPY_ALIGNED)
423457 if a_constraint != CONS_NONE:
424458 check_array_constraint(a_arr, a_name, a_constraint)
425459
426460 if size is not None :
427- randoms = np.empty(size, np.int)
461+ randoms = < np.ndarray > np.empty(size, np.int)
428462 else :
429- # randoms = np.empty(np.shape(a_arr), np.double)
430463 randoms = np.PyArray_SimpleNew(np.PyArray_NDIM(a_arr), np.PyArray_DIMS(a_arr), np.NPY_LONG)
431464
465+ randoms_data = < long * > np.PyArray_DATA(randoms)
466+ n = np.PyArray_SIZE(randoms)
467+
432468 it = np.broadcast(randoms, a_arr)
433469 with lock, nogil:
434- while np.PyArray_MultiIter_NOTDONE(it ):
470+ for i in range (n ):
435471 a_val = (< long * > np.PyArray_MultiIter_DATA(it, 1 ))[0 ]
436- ( < long * > np.PyArray_MultiIter_DATA(it, 0 ))[ 0 ] = f(state, a_val)
472+ randoms_data[i ] = f(state, a_val)
437473
438474 np.PyArray_MultiIter_NEXT(it)
439475
@@ -531,7 +567,7 @@ cdef object disc(aug_state* state, void* func, object size, object lock,
531567 else :
532568 return (< random_uint_iii> func)(state, _ia, _ib, _ic)
533569
534- cdef Py_ssize_t i, n = compute_numel(size)
570+ cdef np.npy_intp i, n = compute_numel(size)
535571 cdef np.int_t [::1 ] randoms = np.empty(n, np.int)
536572 cdef random_uint_0 f0;
537573 cdef random_uint_d fd;
0 commit comments