@@ -39,6 +39,7 @@ cdef extern from "Python.h":
39
39
40
40
cimport numpy as cnp
41
41
from libc .string cimport memset , memcpy
42
+ cimport cpython .tuple
42
43
43
44
cdef extern from "math.h" :
44
45
double floor (double x )
@@ -244,6 +245,9 @@ cdef object vec_cont1_array(irk_state *state, irk_cont1_vec func, object size,
244
245
cdef cnp .flatiter itera
245
246
cdef cnp .broadcast multi
246
247
cdef object arr_obj
248
+ cdef Py_ssize_t multi_nd
249
+ cdef tuple multi_shape
250
+ cdef cnp .npy_intp * multi_dims
247
251
248
252
if size is None :
249
253
array = < cnp .ndarray > cnp .PyArray_SimpleNew (cnp .PyArray_NDIM (oa ),
@@ -261,20 +265,25 @@ cdef object vec_cont1_array(irk_state *state, irk_cont1_vec func, object size,
261
265
array_data = < double * > cnp .PyArray_DATA (array )
262
266
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > array , < void * > oa )
263
267
res_size = cnp .PyArray_SIZE (array )
264
- if (multi . size != res_size ):
268
+ if (cnp . PyArray_MultiIter_SIZE ( multi ) != res_size ):
265
269
raise ValueError ("size is not compatible with inputs" )
266
270
267
271
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (1 , < void * > oa )
268
- imax = multi . size
272
+ imax = cnp . PyArray_MultiIter_SIZE ( multi )
269
273
n = res_size // imax
270
274
with lock , nogil :
271
275
for i from 0 <= i < imax :
272
276
oa_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 0 )
273
277
func (state , n , array_data + n * i , oa_data [0 ])
274
278
cnp .PyArray_MultiIter_NEXT (multi )
275
279
arr_obj = < object > array
276
- arr_obj .shape = (multi .shape + arr_obj .shape )[:arr_obj .ndim ]
277
- multi_ndim = len (multi .shape )
280
+ multi_nd = cnp .PyArray_MultiIter_NDIM (multi )
281
+ multi_dims = cnp .PyArray_MultiIter_DIMS (multi )
282
+ multi_shape = cpython .tuple .PyTuple_New (multi_nd )
283
+ for i from 0 <= i < multi_nd :
284
+ cpython .tuple .PyTuple_SetItem (multi_shape , i , multi_dims [i ])
285
+ arr_obj .shape = (multi_shape + arr_obj .shape )[:arr_obj .ndim ]
286
+ multi_ndim = len (multi_shape )
278
287
arr_obj = arr_obj .transpose (tuple (range (multi_ndim , arr_obj .ndim )) + tuple (range (0 , multi_ndim )))
279
288
280
289
return arr_obj
@@ -308,13 +317,20 @@ cdef object vec_cont2_array(irk_state *state, irk_cont2_vec func, object size,
308
317
cdef cnp .npy_intp i , n , imax , res_size
309
318
cdef cnp .broadcast multi
310
319
cdef object arr_obj
320
+ cdef Py_ssize_t multi_nd
321
+ cdef tuple multi_shape
322
+ cdef cnp .npy_intp * multi_dims
311
323
312
324
if size is None :
313
325
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > oa , < void * > ob )
314
- array = < cnp .ndarray > cnp .PyArray_SimpleNew (multi .nd , multi .dimensions , cnp .NPY_DOUBLE )
326
+ array = < cnp .ndarray > cnp .PyArray_SimpleNew (
327
+ cnp .PyArray_MultiIter_NDIM (multi ),
328
+ cnp .PyArray_MultiIter_DIMS (multi ),
329
+ cnp .NPY_DOUBLE
330
+ )
315
331
array_data = < double * > cnp .PyArray_DATA (array )
316
332
with lock , nogil :
317
- for i from 0 <= i < multi . size :
333
+ for i from 0 <= i < cnp . PyArray_MultiIter_SIZE ( multi ) :
318
334
oa_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 0 )
319
335
ob_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 1 )
320
336
func (state , 1 , & array_data [i ], oa_data [0 ], ob_data [0 ])
@@ -324,12 +340,12 @@ cdef object vec_cont2_array(irk_state *state, irk_cont2_vec func, object size,
324
340
array = < cnp .ndarray > np .empty (size , np .float64 )
325
341
array_data = < double * > cnp .PyArray_DATA (array )
326
342
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (3 , < void * > array , < void * > oa , < void * > ob )
327
- res_size = cnp .PyArray_SIZE (array );
328
- if (multi . size != res_size ):
343
+ res_size = cnp .PyArray_SIZE (array )
344
+ if (cnp . PyArray_MultiIter_SIZE ( multi ) != res_size ):
329
345
raise ValueError ("size is not compatible with inputs" )
330
346
331
347
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > oa , < void * > ob )
332
- imax = multi . size
348
+ imax = cnp . PyArray_MultiIter_SIZE ( multi )
333
349
n = res_size // imax
334
350
with lock , nogil :
335
351
for i from 0 <= i < imax :
@@ -338,8 +354,13 @@ cdef object vec_cont2_array(irk_state *state, irk_cont2_vec func, object size,
338
354
func (state , n , array_data + n * i , oa_data [0 ], ob_data [0 ])
339
355
cnp .PyArray_MultiIter_NEXT (multi )
340
356
arr_obj = < object > array
341
- arr_obj .shape = (multi .shape + arr_obj .shape )[:arr_obj .ndim ]
342
- multi_ndim = len (multi .shape )
357
+ multi_nd = cnp .PyArray_MultiIter_NDIM (multi )
358
+ multi_dims = cnp .PyArray_MultiIter_DIMS (multi )
359
+ multi_shape = cpython .tuple .PyTuple_New (multi_nd )
360
+ for i from 0 <= i < multi_nd :
361
+ cpython .tuple .PyTuple_SetItem (multi_shape , i , multi_dims [i ])
362
+ arr_obj .shape = (multi_shape + arr_obj .shape )[:arr_obj .ndim ]
363
+ multi_ndim = len (multi_shape )
343
364
arr_obj = arr_obj .transpose (tuple (range (multi_ndim , arr_obj .ndim )) + tuple (range (0 , multi_ndim )))
344
365
345
366
return arr_obj
@@ -375,13 +396,16 @@ cdef object vec_cont3_array(irk_state *state, irk_cont3_vec func, object size,
375
396
cdef cnp .npy_intp i , res_size , n , imax
376
397
cdef cnp .broadcast multi
377
398
cdef object arr_obj
399
+ cdef Py_ssize_t multi_nd
400
+ cdef tuple multi_shape
401
+ cdef cnp .npy_intp * multi_dims
378
402
379
403
if size is None :
380
404
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (3 , < void * > oa , < void * > ob , < void * > oc )
381
- array = < cnp .ndarray > cnp .PyArray_SimpleNew (multi . nd , multi . dimensions , cnp .NPY_DOUBLE )
405
+ array = < cnp .ndarray > cnp .PyArray_SimpleNew (cnp . PyArray_MultiIter_NDIM ( multi ), cnp . PyArray_MultiIter_DIMS ( multi ) , cnp .NPY_DOUBLE )
382
406
array_data = < double * > cnp .PyArray_DATA (array )
383
407
with lock , nogil :
384
- for i from 0 <= i < multi . size :
408
+ for i from 0 <= i < cnp . PyArray_MultiIter_SIZE ( multi ) :
385
409
oa_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 0 )
386
410
ob_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 1 )
387
411
oc_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 2 )
@@ -394,11 +418,11 @@ cdef object vec_cont3_array(irk_state *state, irk_cont3_vec func, object size,
394
418
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (4 , < void * > array , < void * > oa ,
395
419
< void * > ob , < void * > oc )
396
420
res_size = cnp .PyArray_SIZE (array )
397
- if (multi . size != res_size ):
421
+ if (cnp . PyArray_MultiIter_SIZE ( multi ) != res_size ):
398
422
raise ValueError ("size is not compatible with inputs" )
399
423
400
424
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (3 , < void * > oa , < void * > ob , < void * > oc )
401
- imax = multi . size
425
+ imax = cnp . PyArray_MultiIter_SIZE ( multi )
402
426
n = res_size // imax
403
427
with lock , nogil :
404
428
for i from 0 <= i < imax :
@@ -408,8 +432,13 @@ cdef object vec_cont3_array(irk_state *state, irk_cont3_vec func, object size,
408
432
func (state , n , array_data + n * i , oa_data [0 ], ob_data [0 ], oc_data [0 ])
409
433
cnp .PyArray_MultiIter_NEXT (multi )
410
434
arr_obj = < object > array
411
- arr_obj .shape = (multi .shape + arr_obj .shape )[:arr_obj .ndim ]
412
- multi_ndim = len (multi .shape )
435
+ multi_nd = cnp .PyArray_MultiIter_NDIM (multi )
436
+ multi_dims = cnp .PyArray_MultiIter_DIMS (multi )
437
+ multi_shape = cpython .tuple .PyTuple_New (multi_nd )
438
+ for i from 0 <= i < multi_nd :
439
+ cpython .tuple .PyTuple_SetItem (multi_shape , i , multi_dims [i ])
440
+ arr_obj .shape = (multi_shape + arr_obj .shape )[:arr_obj .ndim ]
441
+ multi_ndim = len (multi_shape )
413
442
arr_obj = arr_obj .transpose (tuple (range (multi_ndim , arr_obj .ndim )) + tuple (range (0 , multi_ndim )))
414
443
415
444
return arr_obj
@@ -489,13 +518,16 @@ cdef object vec_discnp_array(irk_state *state, irk_discnp_vec func, object size,
489
518
cdef int * on_data
490
519
cdef cnp .broadcast multi
491
520
cdef object arr_obj
521
+ cdef Py_ssize_t multi_nd
522
+ cdef tuple multi_shape
523
+ cdef cnp .npy_intp * multi_dims
492
524
493
525
if size is None :
494
526
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > on , < void * > op )
495
- array = < cnp .ndarray > cnp .PyArray_SimpleNew (multi . nd , multi . dimensions , cnp .NPY_INT )
527
+ array = < cnp .ndarray > cnp .PyArray_SimpleNew (cnp . PyArray_MultiIter_NDIM ( multi ), cnp . PyArray_MultiIter_DIMS ( multi ) , cnp .NPY_INT )
496
528
array_data = < int * > cnp .PyArray_DATA (array )
497
529
with lock , nogil :
498
- for i from 0 <= i < multi . size :
530
+ for i from 0 <= i < cnp . PyArray_MultiIter_SIZE ( multi ) :
499
531
on_data = < int * > cnp .PyArray_MultiIter_DATA (multi , 0 )
500
532
op_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 1 )
501
533
func (state , 1 , & array_data [i ], on_data [0 ], op_data [0 ])
@@ -506,11 +538,11 @@ cdef object vec_discnp_array(irk_state *state, irk_discnp_vec func, object size,
506
538
array_data = < int * > cnp .PyArray_DATA (array )
507
539
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (3 , < void * > array , < void * > on , < void * > op )
508
540
res_size = cnp .PyArray_SIZE (array )
509
- if (multi . size != res_size ):
541
+ if (cnp . PyArray_MultiIter_SIZE ( multi ) != res_size ):
510
542
raise ValueError ("size is not compatible with inputs" )
511
543
512
544
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > on , < void * > op )
513
- imax = multi . size
545
+ imax = cnp . PyArray_MultiIter_SIZE ( multi )
514
546
n = res_size // imax
515
547
with lock , nogil :
516
548
for i from 0 <= i < imax :
@@ -519,8 +551,13 @@ cdef object vec_discnp_array(irk_state *state, irk_discnp_vec func, object size,
519
551
func (state , n , array_data + n * i , on_data [0 ], op_data [0 ])
520
552
cnp .PyArray_MultiIter_NEXT (multi )
521
553
arr_obj = < object > array
522
- arr_obj .shape = (multi .shape + arr_obj .shape )[:arr_obj .ndim ]
523
- multi_ndim = len (multi .shape )
554
+ multi_nd = cnp .PyArray_MultiIter_NDIM (multi )
555
+ multi_dims = cnp .PyArray_MultiIter_DIMS (multi )
556
+ multi_shape = cpython .tuple .PyTuple_New (multi_nd )
557
+ for i from 0 <= i < multi_nd :
558
+ cpython .tuple .PyTuple_SetItem (multi_shape , i , multi_dims [i ])
559
+ arr_obj .shape = (multi_shape + arr_obj .shape )[:arr_obj .ndim ]
560
+ multi_ndim = len (multi_shape )
524
561
arr_obj = arr_obj .transpose (tuple (range (multi_ndim , arr_obj .ndim )) + tuple (range (0 , multi_ndim )))
525
562
526
563
return arr_obj
@@ -556,13 +593,16 @@ cdef object vec_discdd_array(irk_state *state, irk_discdd_vec func, object size,
556
593
cdef double * on_data
557
594
cdef cnp .broadcast multi
558
595
cdef object arr_obj
596
+ cdef Py_ssize_t multi_nd
597
+ cdef tuple multi_shape
598
+ cdef cnp .npy_intp * multi_dims
559
599
560
600
if size is None :
561
601
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > on , < void * > op )
562
- array = < cnp .ndarray > cnp .PyArray_SimpleNew (multi . nd , multi . dimensions , cnp .NPY_INT )
602
+ array = < cnp .ndarray > cnp .PyArray_SimpleNew (cnp . PyArray_MultiIter_NDIM ( multi ), cnp . PyArray_MultiIter_DIMS ( multi ) , cnp .NPY_INT )
563
603
array_data = < int * > cnp .PyArray_DATA (array )
564
604
with lock , nogil :
565
- for i from 0 <= i < multi . size :
605
+ for i from 0 <= i < cnp . PyArray_MultiIter_SIZE ( multi ) :
566
606
on_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 0 )
567
607
op_data = < double * > cnp .PyArray_MultiIter_DATA (multi , 1 )
568
608
func (state , 1 , & array_data [i ], on_data [0 ], op_data [0 ])
@@ -573,11 +613,11 @@ cdef object vec_discdd_array(irk_state *state, irk_discdd_vec func, object size,
573
613
array_data = < int * > cnp .PyArray_DATA (array )
574
614
res_size = cnp .PyArray_SIZE (array )
575
615
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (3 , < void * > array , < void * > on , < void * > op )
576
- if (multi . size != res_size ):
616
+ if (cnp . PyArray_MultiIter_SIZE ( multi ) != res_size ):
577
617
raise ValueError ("size is not compatible with inputs" )
578
618
579
619
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > on , < void * > op )
580
- imax = multi . size
620
+ imax = cnp . PyArray_MultiIter_SIZE ( multi )
581
621
n = res_size // imax
582
622
with lock , nogil :
583
623
for i from 0 <= i < imax :
@@ -586,8 +626,13 @@ cdef object vec_discdd_array(irk_state *state, irk_discdd_vec func, object size,
586
626
func (state , n , array_data + n * i , on_data [0 ], op_data [0 ])
587
627
cnp .PyArray_MultiIter_NEXT (multi )
588
628
arr_obj = < object > array
589
- arr_obj .shape = (multi .shape + arr_obj .shape )[:arr_obj .ndim ]
590
- multi_ndim = len (multi .shape )
629
+ multi_nd = cnp .PyArray_MultiIter_NDIM (multi )
630
+ multi_dims = cnp .PyArray_MultiIter_DIMS (multi )
631
+ multi_shape = cpython .tuple .PyTuple_New (multi_nd )
632
+ for i from 0 <= i < multi_nd :
633
+ cpython .tuple .PyTuple_SetItem (multi_shape , i , multi_dims [i ])
634
+ arr_obj .shape = (multi_shape + arr_obj .shape )[:arr_obj .ndim ]
635
+ multi_ndim = len (multi_shape )
591
636
arr_obj = arr_obj .transpose (tuple (range (multi_ndim , arr_obj .ndim )) + tuple (range (0 , multi_ndim )))
592
637
593
638
return arr_obj
@@ -624,13 +669,16 @@ cdef object vec_discnmN_array(irk_state *state, irk_discnmN_vec func, object siz
624
669
cdef cnp .broadcast multi , multi2
625
670
cdef cnp .npy_intp imax , n , res_size
626
671
cdef object arr_obj
672
+ cdef Py_ssize_t multi_nd
673
+ cdef tuple multi_shape
674
+ cdef cnp .npy_intp * multi_dims
627
675
628
676
if size is None :
629
677
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (3 , < void * > on , < void * > om , < void * > oN )
630
- array = < cnp .ndarray > cnp .PyArray_SimpleNew (multi . nd , multi . dimensions , cnp .NPY_INT )
678
+ array = < cnp .ndarray > cnp .PyArray_SimpleNew (cnp . PyArray_MultiIter_NDIM ( multi ), cnp . PyArray_MultiIter_DIMS ( multi ) , cnp .NPY_INT )
631
679
array_data = < int * > cnp .PyArray_DATA (array )
632
680
with lock , nogil :
633
- for i from 0 <= i < multi . size :
681
+ for i from 0 <= i < cnp . PyArray_MultiIter_SIZE ( multi ) :
634
682
on_data = < int * > cnp .PyArray_MultiIter_DATA (multi , 0 )
635
683
om_data = < int * > cnp .PyArray_MultiIter_DATA (multi , 1 )
636
684
oN_data = < int * > cnp .PyArray_MultiIter_DATA (multi , 2 )
@@ -643,11 +691,11 @@ cdef object vec_discnmN_array(irk_state *state, irk_discnmN_vec func, object siz
643
691
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (4 , < void * > array , < void * > on , < void * > om ,
644
692
< void * > oN )
645
693
res_size = cnp .PyArray_SIZE (array )
646
- if (multi . size != res_size ):
694
+ if (cnp . PyArray_MultiIter_SIZE ( multi ) != res_size ):
647
695
raise ValueError ("size is not compatible with inputs" )
648
696
649
697
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (3 , < void * > on , < void * > om , < void * > oN )
650
- imax = multi . size
698
+ imax = cnp . PyArray_MultiIter_SIZE ( multi )
651
699
n = res_size // imax
652
700
with lock , nogil :
653
701
for i from 0 <= i < imax :
@@ -657,8 +705,13 @@ cdef object vec_discnmN_array(irk_state *state, irk_discnmN_vec func, object siz
657
705
func (state , n , array_data + n * i , on_data [0 ], om_data [0 ], oN_data [0 ])
658
706
cnp .PyArray_MultiIter_NEXT (multi )
659
707
arr_obj = < object > array
660
- arr_obj .shape = (multi .shape + arr_obj .shape )[:arr_obj .ndim ]
661
- multi_ndim = len (multi .shape )
708
+ multi_nd = cnp .PyArray_MultiIter_NDIM (multi )
709
+ multi_dims = cnp .PyArray_MultiIter_DIMS (multi )
710
+ multi_shape = cpython .tuple .PyTuple_New (multi_nd )
711
+ for i from 0 <= i < multi_nd :
712
+ cpython .tuple .PyTuple_SetItem (multi_shape , i , multi_dims [i ])
713
+ arr_obj .shape = (multi_shape + arr_obj .shape )[:arr_obj .ndim ]
714
+ multi_ndim = len (multi_shape )
662
715
arr_obj = arr_obj .transpose (tuple (range (multi_ndim , arr_obj .ndim )) + tuple (range (0 , multi_ndim )))
663
716
664
717
return arr_obj
@@ -730,7 +783,7 @@ cdef object vec_discd_array(irk_state *state, irk_discd_vec func, object size, c
730
783
array_data = < int * > cnp .PyArray_DATA (array )
731
784
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > array , < void * > oa )
732
785
res_size = cnp .PyArray_SIZE (array )
733
- if (multi . size != res_size ):
786
+ if (cnp . PyArray_MultiIter_SIZE ( multi ) != res_size ):
734
787
raise ValueError ("size is not compatible with inputs" )
735
788
736
789
imax = oa .size
@@ -773,7 +826,7 @@ cdef object vec_long_discd_array(irk_state *state, irk_discd_long_vec func, obje
773
826
array_data = < long * > cnp .PyArray_DATA (array )
774
827
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > array , < void * > oa )
775
828
res_size = cnp .PyArray_SIZE (array )
776
- if (multi . size != res_size ):
829
+ if (cnp . PyArray_MultiIter_SIZE ( multi ) != res_size ):
777
830
raise ValueError ("size is not compatible with inputs" )
778
831
779
832
imax = oa .size
@@ -814,7 +867,7 @@ cdef object vec_Poisson_array(irk_state *state, irk_discdptr_vec func1, irk_disc
814
867
array_data = < int * > cnp .PyArray_DATA (array )
815
868
multi = < cnp .broadcast > cnp .PyArray_MultiIterNew (2 , < void * > array , < void * > olambda )
816
869
res_size = cnp .PyArray_SIZE (array )
817
- if (multi . size != res_size ):
870
+ if (cnp . PyArray_MultiIter_SIZE ( multi ) != res_size ):
818
871
raise ValueError ("size is not compatible with inputs" )
819
872
820
873
imax = olambda .size
0 commit comments