@@ -36,10 +36,13 @@ cdef extern from "Python.h":
36
36
int PyErr_Occurred ()
37
37
void PyErr_Clear ()
38
38
39
+ cdef extern from "numpy/npy_no_deprecated_api.h" :
40
+ pass
39
41
40
42
cimport numpy as cnp
41
43
from libc .string cimport memset , memcpy
42
44
cimport cpython .tuple
45
+ cimport cython
43
46
44
47
cdef extern from "math.h" :
45
48
double floor (double x )
@@ -52,6 +55,11 @@ cdef extern from "mklrand_py_helper.h":
52
55
char * py_bytes_DataPtr (object b )
53
56
int is_bytes_object (object b )
54
57
58
+ cdef extern from "numpy_multiiter_workaround.h" :
59
+ cnp .npy_intp cnp_PyArray_MultiIter_SIZE "workaround_PyArray_MultiIter_SIZE" (cnp .broadcast multi ) nogil
60
+ int cnp_PyArray_MultiIter_NDIM "workaround_PyArray_MultiIter_NDIM" (cnp .broadcast multi ) nogil
61
+ cnp .npy_intp * cnp_PyArray_MultiIter_DIMS "workaround_PyArray_MultiIter_DIMS" (cnp .broadcast multi ) nogil
62
+
55
63
cdef extern from "randomkit.h" :
56
64
57
65
ctypedef struct irk_state :
@@ -188,7 +196,6 @@ cdef int r = cnp._import_array()
188
196
if (r < 0 ):
189
197
raise ImportError ("Failed to import NumPy" )
190
198
191
- cimport cython
192
199
import numpy as np
193
200
import operator
194
201
import warnings
@@ -265,20 +272,20 @@ cdef object vec_cont1_array(irk_state *state, irk_cont1_vec func, object size,
265
272
array_data = < double * > cnp .PyArray_DATA (array )
266
273
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > array , < void * > oa )
267
274
res_size = cnp .PyArray_SIZE (array )
268
- if (cnp . PyArray_MultiIter_SIZE (multi ) != res_size ):
275
+ if (cnp_PyArray_MultiIter_SIZE (multi ) != res_size ):
269
276
raise ValueError ("size is not compatible with inputs" )
270
277
271
278
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (1 , < void * > oa )
272
- imax = cnp . PyArray_MultiIter_SIZE (multi )
279
+ imax = cnp_PyArray_MultiIter_SIZE (multi )
273
280
n = res_size // imax
274
281
with lock , nogil :
275
282
for i from 0 <= i < imax :
276
283
oa_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 0 )
277
284
func (state , n , array_data + n * i , oa_data [0 ])
278
285
cnp .PyArray_MultiIter_NEXT (multi )
279
286
arr_obj = < object > array
280
- multi_nd = cnp . PyArray_MultiIter_NDIM (multi )
281
- multi_dims = cnp . PyArray_MultiIter_DIMS (multi )
287
+ multi_nd = cnp_PyArray_MultiIter_NDIM (multi )
288
+ multi_dims = cnp_PyArray_MultiIter_DIMS (multi )
282
289
multi_shape = cpython .tuple .PyTuple_New (multi_nd )
283
290
for i from 0 <= i < multi_nd :
284
291
cpython .tuple .PyTuple_SetItem (multi_shape , i , multi_dims [i ])
@@ -324,13 +331,13 @@ cdef object vec_cont2_array(irk_state *state, irk_cont2_vec func, object size,
324
331
if size is None :
325
332
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > oa , < void * > ob )
326
333
array = < cnp .ndarray > cnp .PyArray_SimpleNew (
327
- cnp . PyArray_MultiIter_NDIM (multi ),
328
- cnp . PyArray_MultiIter_DIMS (multi ),
334
+ cnp_PyArray_MultiIter_NDIM (multi ),
335
+ cnp_PyArray_MultiIter_DIMS (multi ),
329
336
cnp .NPY_DOUBLE
330
337
)
331
338
array_data = < double * > cnp .PyArray_DATA (array )
332
339
with lock , nogil :
333
- for i from 0 <= i < cnp . PyArray_MultiIter_SIZE (multi ):
340
+ for i from 0 <= i < cnp_PyArray_MultiIter_SIZE (multi ):
334
341
oa_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 0 )
335
342
ob_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 1 )
336
343
func (state , 1 , & array_data [i ], oa_data [0 ], ob_data [0 ])
@@ -341,11 +348,11 @@ cdef object vec_cont2_array(irk_state *state, irk_cont2_vec func, object size,
341
348
array_data = < double * > cnp .PyArray_DATA (array )
342
349
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (3 , < void * > array , < void * > oa , < void * > ob )
343
350
res_size = cnp .PyArray_SIZE (array )
344
- if (cnp . PyArray_MultiIter_SIZE (multi ) != res_size ):
351
+ if (cnp_PyArray_MultiIter_SIZE (multi ) != res_size ):
345
352
raise ValueError ("size is not compatible with inputs" )
346
353
347
354
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > oa , < void * > ob )
348
- imax = cnp . PyArray_MultiIter_SIZE (multi )
355
+ imax = cnp_PyArray_MultiIter_SIZE (multi )
349
356
n = res_size // imax
350
357
with lock , nogil :
351
358
for i from 0 <= i < imax :
@@ -354,8 +361,8 @@ cdef object vec_cont2_array(irk_state *state, irk_cont2_vec func, object size,
354
361
func (state , n , array_data + n * i , oa_data [0 ], ob_data [0 ])
355
362
cnp .PyArray_MultiIter_NEXT (multi )
356
363
arr_obj = < object > array
357
- multi_nd = cnp . PyArray_MultiIter_NDIM (multi )
358
- multi_dims = cnp . PyArray_MultiIter_DIMS (multi )
364
+ multi_nd = cnp_PyArray_MultiIter_NDIM (multi )
365
+ multi_dims = cnp_PyArray_MultiIter_DIMS (multi )
359
366
multi_shape = cpython .tuple .PyTuple_New (multi_nd )
360
367
for i from 0 <= i < multi_nd :
361
368
cpython .tuple .PyTuple_SetItem (multi_shape , i , multi_dims [i ])
@@ -402,10 +409,10 @@ cdef object vec_cont3_array(irk_state *state, irk_cont3_vec func, object size,
402
409
403
410
if size is None :
404
411
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (3 , < void * > oa , < void * > ob , < void * > oc )
405
- array = < cnp .ndarray > cnp .PyArray_SimpleNew (cnp . PyArray_MultiIter_NDIM (multi ), cnp . PyArray_MultiIter_DIMS (multi ), cnp .NPY_DOUBLE )
412
+ array = < cnp .ndarray > cnp .PyArray_SimpleNew (cnp_PyArray_MultiIter_NDIM (multi ), cnp_PyArray_MultiIter_DIMS (multi ), cnp .NPY_DOUBLE )
406
413
array_data = < double * > cnp .PyArray_DATA (array )
407
414
with lock , nogil :
408
- for i from 0 <= i < cnp . PyArray_MultiIter_SIZE (multi ):
415
+ for i from 0 <= i < cnp_PyArray_MultiIter_SIZE (multi ):
409
416
oa_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 0 )
410
417
ob_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 1 )
411
418
oc_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 2 )
@@ -418,11 +425,11 @@ cdef object vec_cont3_array(irk_state *state, irk_cont3_vec func, object size,
418
425
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (4 , < void * > array , < void * > oa ,
419
426
< void * > ob , < void * > oc )
420
427
res_size = cnp .PyArray_SIZE (array )
421
- if (cnp . PyArray_MultiIter_SIZE (multi ) != res_size ):
428
+ if (cnp_PyArray_MultiIter_SIZE (multi ) != res_size ):
422
429
raise ValueError ("size is not compatible with inputs" )
423
430
424
431
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (3 , < void * > oa , < void * > ob , < void * > oc )
425
- imax = cnp . PyArray_MultiIter_SIZE (multi )
432
+ imax = cnp_PyArray_MultiIter_SIZE (multi )
426
433
n = res_size // imax
427
434
with lock , nogil :
428
435
for i from 0 <= i < imax :
@@ -432,8 +439,8 @@ cdef object vec_cont3_array(irk_state *state, irk_cont3_vec func, object size,
432
439
func (state , n , array_data + n * i , oa_data [0 ], ob_data [0 ], oc_data [0 ])
433
440
cnp .PyArray_MultiIter_NEXT (multi )
434
441
arr_obj = < object > array
435
- multi_nd = cnp . PyArray_MultiIter_NDIM (multi )
436
- multi_dims = cnp . PyArray_MultiIter_DIMS (multi )
442
+ multi_nd = cnp_PyArray_MultiIter_NDIM (multi )
443
+ multi_dims = cnp_PyArray_MultiIter_DIMS (multi )
437
444
multi_shape = cpython .tuple .PyTuple_New (multi_nd )
438
445
for i from 0 <= i < multi_nd :
439
446
cpython .tuple .PyTuple_SetItem (multi_shape , i , multi_dims [i ])
@@ -521,13 +528,16 @@ cdef object vec_discnp_array(irk_state *state, irk_discnp_vec func, object size,
521
528
cdef Py_ssize_t multi_nd
522
529
cdef tuple multi_shape
523
530
cdef cnp .npy_intp * multi_dims
531
+ cdef int multi_nd_i
524
532
525
533
if size is None :
526
534
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > on , < void * > op )
527
- array = < cnp .ndarray > cnp .PyArray_SimpleNew (cnp .PyArray_MultiIter_NDIM (multi ), cnp .PyArray_MultiIter_DIMS (multi ), cnp .NPY_INT )
535
+ multi_nd_i = cnp_PyArray_MultiIter_NDIM (multi )
536
+ multi_dims = cnp_PyArray_MultiIter_DIMS (multi )
537
+ array = < cnp .ndarray > cnp .PyArray_SimpleNew (multi_nd_i , multi_dims , cnp .NPY_INT )
528
538
array_data = < int * > cnp .PyArray_DATA (array )
529
539
with lock , nogil :
530
- for i from 0 <= i < cnp . PyArray_MultiIter_SIZE (multi ):
540
+ for i from 0 <= i < cnp_PyArray_MultiIter_SIZE (multi ):
531
541
on_data = < int * > cnp .PyArray_MultiIter_DATA (multi , 0 )
532
542
op_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 1 )
533
543
func (state , 1 , & array_data [i ], on_data [0 ], op_data [0 ])
@@ -538,11 +548,11 @@ cdef object vec_discnp_array(irk_state *state, irk_discnp_vec func, object size,
538
548
array_data = < int * > cnp .PyArray_DATA (array )
539
549
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (3 , < void * > array , < void * > on , < void * > op )
540
550
res_size = cnp .PyArray_SIZE (array )
541
- if (cnp . PyArray_MultiIter_SIZE (multi ) != res_size ):
551
+ if (cnp_PyArray_MultiIter_SIZE (multi ) != res_size ):
542
552
raise ValueError ("size is not compatible with inputs" )
543
553
544
554
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > on , < void * > op )
545
- imax = cnp . PyArray_MultiIter_SIZE (multi )
555
+ imax = cnp_PyArray_MultiIter_SIZE (multi )
546
556
n = res_size // imax
547
557
with lock , nogil :
548
558
for i from 0 <= i < imax :
@@ -551,8 +561,8 @@ cdef object vec_discnp_array(irk_state *state, irk_discnp_vec func, object size,
551
561
func (state , n , array_data + n * i , on_data [0 ], op_data [0 ])
552
562
cnp .PyArray_MultiIter_NEXT (multi )
553
563
arr_obj = < object > array
554
- multi_nd = cnp . PyArray_MultiIter_NDIM (multi )
555
- multi_dims = cnp . PyArray_MultiIter_DIMS (multi )
564
+ multi_nd = cnp_PyArray_MultiIter_NDIM (multi )
565
+ multi_dims = cnp_PyArray_MultiIter_DIMS (multi )
556
566
multi_shape = cpython .tuple .PyTuple_New (multi_nd )
557
567
for i from 0 <= i < multi_nd :
558
568
cpython .tuple .PyTuple_SetItem (multi_shape , i , multi_dims [i ])
@@ -599,10 +609,10 @@ cdef object vec_discdd_array(irk_state *state, irk_discdd_vec func, object size,
599
609
600
610
if size is None :
601
611
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > on , < void * > op )
602
- array = < cnp .ndarray > cnp .PyArray_SimpleNew (cnp . PyArray_MultiIter_NDIM (multi ), cnp . PyArray_MultiIter_DIMS (multi ), cnp .NPY_INT )
612
+ array = < cnp .ndarray > cnp .PyArray_SimpleNew (cnp_PyArray_MultiIter_NDIM (multi ), cnp_PyArray_MultiIter_DIMS (multi ), cnp .NPY_INT )
603
613
array_data = < int * > cnp .PyArray_DATA (array )
604
614
with lock , nogil :
605
- for i from 0 <= i < cnp . PyArray_MultiIter_SIZE (multi ):
615
+ for i from 0 <= i < cnp_PyArray_MultiIter_SIZE (multi ):
606
616
on_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 0 )
607
617
op_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 1 )
608
618
func (state , 1 , & array_data [i ], on_data [0 ], op_data [0 ])
@@ -613,11 +623,11 @@ cdef object vec_discdd_array(irk_state *state, irk_discdd_vec func, object size,
613
623
array_data = < int * > cnp .PyArray_DATA (array )
614
624
res_size = cnp .PyArray_SIZE (array )
615
625
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (3 , < void * > array , < void * > on , < void * > op )
616
- if (cnp . PyArray_MultiIter_SIZE (multi ) != res_size ):
626
+ if (cnp_PyArray_MultiIter_SIZE (multi ) != res_size ):
617
627
raise ValueError ("size is not compatible with inputs" )
618
628
619
629
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > on , < void * > op )
620
- imax = cnp . PyArray_MultiIter_SIZE (multi )
630
+ imax = cnp_PyArray_MultiIter_SIZE (multi )
621
631
n = res_size // imax
622
632
with lock , nogil :
623
633
for i from 0 <= i < imax :
@@ -626,8 +636,8 @@ cdef object vec_discdd_array(irk_state *state, irk_discdd_vec func, object size,
626
636
func (state , n , array_data + n * i , on_data [0 ], op_data [0 ])
627
637
cnp .PyArray_MultiIter_NEXT (multi )
628
638
arr_obj = < object > array
629
- multi_nd = cnp . PyArray_MultiIter_NDIM (multi )
630
- multi_dims = cnp . PyArray_MultiIter_DIMS (multi )
639
+ multi_nd = cnp_PyArray_MultiIter_NDIM (multi )
640
+ multi_dims = cnp_PyArray_MultiIter_DIMS (multi )
631
641
multi_shape = cpython .tuple .PyTuple_New (multi_nd )
632
642
for i from 0 <= i < multi_nd :
633
643
cpython .tuple .PyTuple_SetItem (multi_shape , i , multi_dims [i ])
@@ -675,10 +685,10 @@ cdef object vec_discnmN_array(irk_state *state, irk_discnmN_vec func, object siz
675
685
676
686
if size is None :
677
687
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (3 , < void * > on , < void * > om , < void * > oN )
678
- array = < cnp .ndarray > cnp .PyArray_SimpleNew (cnp . PyArray_MultiIter_NDIM (multi ), cnp . PyArray_MultiIter_DIMS (multi ), cnp .NPY_INT )
688
+ array = < cnp .ndarray > cnp .PyArray_SimpleNew (cnp_PyArray_MultiIter_NDIM (multi ), cnp_PyArray_MultiIter_DIMS (multi ), cnp .NPY_INT )
679
689
array_data = < int * > cnp .PyArray_DATA (array )
680
690
with lock , nogil :
681
- for i from 0 <= i < cnp . PyArray_MultiIter_SIZE (multi ):
691
+ for i from 0 <= i < cnp_PyArray_MultiIter_SIZE (multi ):
682
692
on_data = < int * > cnp .PyArray_MultiIter_DATA (multi , 0 )
683
693
om_data = < int * > cnp .PyArray_MultiIter_DATA (multi , 1 )
684
694
oN_data = < int * > cnp .PyArray_MultiIter_DATA (multi , 2 )
@@ -691,11 +701,11 @@ cdef object vec_discnmN_array(irk_state *state, irk_discnmN_vec func, object siz
691
701
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (4 , < void * > array , < void * > on , < void * > om ,
692
702
< void * > oN )
693
703
res_size = cnp .PyArray_SIZE (array )
694
- if (cnp . PyArray_MultiIter_SIZE (multi ) != res_size ):
704
+ if (cnp_PyArray_MultiIter_SIZE (multi ) != res_size ):
695
705
raise ValueError ("size is not compatible with inputs" )
696
706
697
707
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (3 , < void * > on , < void * > om , < void * > oN )
698
- imax = cnp . PyArray_MultiIter_SIZE (multi )
708
+ imax = cnp_PyArray_MultiIter_SIZE (multi )
699
709
n = res_size // imax
700
710
with lock , nogil :
701
711
for i from 0 <= i < imax :
@@ -705,8 +715,8 @@ cdef object vec_discnmN_array(irk_state *state, irk_discnmN_vec func, object siz
705
715
func (state , n , array_data + n * i , on_data [0 ], om_data [0 ], oN_data [0 ])
706
716
cnp .PyArray_MultiIter_NEXT (multi )
707
717
arr_obj = < object > array
708
- multi_nd = cnp . PyArray_MultiIter_NDIM (multi )
709
- multi_dims = cnp . PyArray_MultiIter_DIMS (multi )
718
+ multi_nd = cnp_PyArray_MultiIter_NDIM (multi )
719
+ multi_dims = cnp_PyArray_MultiIter_DIMS (multi )
710
720
multi_shape = cpython .tuple .PyTuple_New (multi_nd )
711
721
for i from 0 <= i < multi_nd :
712
722
cpython .tuple .PyTuple_SetItem (multi_shape , i , multi_dims [i ])
@@ -783,7 +793,7 @@ cdef object vec_discd_array(irk_state *state, irk_discd_vec func, object size, c
783
793
array_data = < int * > cnp .PyArray_DATA (array )
784
794
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > array , < void * > oa )
785
795
res_size = cnp .PyArray_SIZE (array )
786
- if (cnp . PyArray_MultiIter_SIZE (multi ) != res_size ):
796
+ if (cnp_PyArray_MultiIter_SIZE (multi ) != res_size ):
787
797
raise ValueError ("size is not compatible with inputs" )
788
798
789
799
imax = oa .size
@@ -826,7 +836,7 @@ cdef object vec_long_discd_array(irk_state *state, irk_discd_long_vec func, obje
826
836
array_data = < long * > cnp .PyArray_DATA (array )
827
837
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > array , < void * > oa )
828
838
res_size = cnp .PyArray_SIZE (array )
829
- if (cnp . PyArray_MultiIter_SIZE (multi ) != res_size ):
839
+ if (cnp_PyArray_MultiIter_SIZE (multi ) != res_size ):
830
840
raise ValueError ("size is not compatible with inputs" )
831
841
832
842
imax = oa .size
@@ -867,7 +877,7 @@ cdef object vec_Poisson_array(irk_state *state, irk_discdptr_vec func1, irk_disc
867
877
array_data = < int * > cnp .PyArray_DATA (array )
868
878
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > array , < void * > olambda )
869
879
res_size = cnp .PyArray_SIZE (array )
870
- if (cnp . PyArray_MultiIter_SIZE (multi ) != res_size ):
880
+ if (cnp_PyArray_MultiIter_SIZE (multi ) != res_size ):
871
881
raise ValueError ("size is not compatible with inputs" )
872
882
873
883
imax = olambda .size
0 commit comments