Skip to content

Commit e032da8

Browse files
ricardoV94brendan-m-murphy
authored andcommitted
Changes for deprecations in numpy 2.0 C-API
- replace `->elsize` by `PyArray_ITEMSIZE` - don't use deprecated PyArray_MoveInto
1 parent 0957dba commit e032da8

File tree

5 files changed

+69
-69
lines changed

5 files changed

+69
-69
lines changed

pytensor/sparse/basic.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3610,7 +3610,7 @@ def perform(self, node, inputs, outputs):
36103610
out[0] = g_a_data
36113611

36123612
def c_code_cache_version(self):
3613-
return (1,)
3613+
return (2,)
36143614

36153615
def c_code(self, node, name, inputs, outputs, sub):
36163616
(_indices, _indptr, _d, _g) = inputs
@@ -3647,11 +3647,11 @@ def c_code(self, node, name, inputs, outputs, sub):
36473647
npy_intp nnz = PyArray_DIMS({_indices})[0];
36483648
npy_intp N = PyArray_DIMS({_indptr})[0]-1; //TODO: error checking with this
36493649
3650-
npy_intp Sindices = PyArray_STRIDES({_indices})[0]/PyArray_DESCR({_indices})->elsize;
3651-
npy_intp Sindptr = PyArray_STRIDES({_indptr})[0]/PyArray_DESCR({_indptr})->elsize;
3650+
npy_intp Sindices = PyArray_STRIDES({_indices})[0]/PyArray_ITEMSIZE({_indices});
3651+
npy_intp Sindptr = PyArray_STRIDES({_indptr})[0]/PyArray_ITEMSIZE({_indptr});
36523652
3653-
const npy_intp Sd1 = PyArray_STRIDES({_d})[1]/PyArray_DESCR({_d})->elsize;
3654-
const npy_intp Sg1 = PyArray_STRIDES({_g})[1]/PyArray_DESCR({_g})->elsize;
3653+
const npy_intp Sd1 = PyArray_STRIDES({_d})[1]/PyArray_ITEMSIZE({_d});
3654+
const npy_intp Sg1 = PyArray_STRIDES({_g})[1]/PyArray_ITEMSIZE({_g});
36553655
36563656
const npy_intp K = PyArray_DIMS({_d})[1];
36573657
@@ -3744,7 +3744,7 @@ def perform(self, node, inputs, outputs):
37443744
out[0] = g_a_data
37453745

37463746
def c_code_cache_version(self):
3747-
return (1,)
3747+
return (2,)
37483748

37493749
def c_code(self, node, name, inputs, outputs, sub):
37503750
(_indices, _indptr, _d, _g) = inputs
@@ -3782,11 +3782,11 @@ def c_code(self, node, name, inputs, outputs, sub):
37823782
// extract number of rows
37833783
npy_intp N = PyArray_DIMS({_indptr})[0]-1; //TODO: error checking with this
37843784
3785-
npy_intp Sindices = PyArray_STRIDES({_indices})[0]/PyArray_DESCR({_indices})->elsize;
3786-
npy_intp Sindptr = PyArray_STRIDES({_indptr})[0]/PyArray_DESCR({_indptr})->elsize;
3785+
npy_intp Sindices = PyArray_STRIDES({_indices})[0]/PyArray_ITEMSIZE({_indices});
3786+
npy_intp Sindptr = PyArray_STRIDES({_indptr})[0]/PyArray_ITEMSIZE({_indptr});
37873787
3788-
const npy_intp Sd1 = PyArray_STRIDES({_d})[1]/PyArray_DESCR({_d})->elsize;
3789-
const npy_intp Sg1 = PyArray_STRIDES({_g})[1]/PyArray_DESCR({_g})->elsize;
3788+
const npy_intp Sd1 = PyArray_STRIDES({_d})[1]/PyArray_ITEMSIZE({_d});
3789+
const npy_intp Sg1 = PyArray_STRIDES({_g})[1]/PyArray_ITEMSIZE({_g});
37903790
37913791
const npy_intp K = PyArray_DIMS({_d})[1];
37923792

pytensor/sparse/rewriting.py

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@ def c_code(self, node, name, inputs, outputs, sub):
158158
159159
dtype_{y}* ydata = (dtype_{y}*)PyArray_DATA({y});
160160
dtype_{z}* zdata = (dtype_{z}*)PyArray_DATA({z});
161-
npy_intp Yi = PyArray_STRIDES({y})[0]/PyArray_DESCR({y})->elsize;
162-
npy_intp Yj = PyArray_STRIDES({y})[1]/PyArray_DESCR({y})->elsize;
161+
npy_intp Yi = PyArray_STRIDES({y})[0]/PyArray_ITEMSIZE({y});
162+
npy_intp Yj = PyArray_STRIDES({y})[1]/PyArray_ITEMSIZE({y});
163163
164164
npy_intp pos;
165165
if ({format} == 0){{
@@ -186,7 +186,7 @@ def infer_shape(self, fgraph, node, shapes):
186186
return [shapes[3]]
187187

188188
def c_code_cache_version(self):
189-
return (2,)
189+
return (3,)
190190

191191

192192
@node_rewriter([sparse.AddSD])
@@ -361,13 +361,13 @@ def c_code(self, node, name, inputs, outputs, sub):
361361
{{PyErr_SetString(PyExc_NotImplementedError, "array too big (overflows int32 index)"); {fail};}}
362362
363363
// strides tell you how many bytes to skip to go to next column/row entry
364-
npy_intp Szm = PyArray_STRIDES({z})[0] / PyArray_DESCR({z})->elsize;
365-
npy_intp Szn = PyArray_STRIDES({z})[1] / PyArray_DESCR({z})->elsize;
366-
//npy_intp Sbm = PyArray_STRIDES({b})[0] / PyArray_DESCR({b})->elsize;
367-
npy_intp Sbn = PyArray_STRIDES({b})[1] / PyArray_DESCR({b})->elsize;
368-
npy_intp Sval = PyArray_STRIDES({a_val})[0] / PyArray_DESCR({a_val})->elsize;
369-
npy_intp Sind = PyArray_STRIDES({a_ind})[0] / PyArray_DESCR({a_ind})->elsize;
370-
npy_intp Sptr = PyArray_STRIDES({a_ptr})[0] / PyArray_DESCR({a_ptr})->elsize;
364+
npy_intp Szm = PyArray_STRIDES({z})[0] / PyArray_ITEMSIZE({z});
365+
npy_intp Szn = PyArray_STRIDES({z})[1] / PyArray_ITEMSIZE({z});
366+
//npy_intp Sbm = PyArray_STRIDES({b})[0] / PyArray_ITEMSIZE({b});
367+
npy_intp Sbn = PyArray_STRIDES({b})[1] / PyArray_ITEMSIZE({b});
368+
npy_intp Sval = PyArray_STRIDES({a_val})[0] / PyArray_ITEMSIZE({a_val});
369+
npy_intp Sind = PyArray_STRIDES({a_ind})[0] / PyArray_ITEMSIZE({a_ind});
370+
npy_intp Sptr = PyArray_STRIDES({a_ptr})[0] / PyArray_ITEMSIZE({a_ptr});
371371
372372
// pointers to access actual data in the arrays passed as params.
373373
dtype_{z}* __restrict__ Dz = (dtype_{z}*)PyArray_DATA({z});
@@ -436,7 +436,7 @@ def c_code(self, node, name, inputs, outputs, sub):
436436
return rval
437437

438438
def c_code_cache_version(self):
439-
return (3,)
439+
return (4,)
440440

441441

442442
sd_csc = StructuredDotCSC()
@@ -555,13 +555,13 @@ def c_code(self, node, name, inputs, outputs, sub):
555555
{{PyErr_SetString(PyExc_NotImplementedError, "array too big (overflows int32 index)"); {fail};}}
556556
557557
// strides tell you how many bytes to skip to go to next column/row entry
558-
npy_intp Szm = PyArray_STRIDES({z})[0] / PyArray_DESCR({z})->elsize;
559-
npy_intp Szn = PyArray_STRIDES({z})[1] / PyArray_DESCR({z})->elsize;
560-
npy_intp Sbm = PyArray_STRIDES({b})[0] / PyArray_DESCR({b})->elsize;
561-
npy_intp Sbn = PyArray_STRIDES({b})[1] / PyArray_DESCR({b})->elsize;
562-
npy_intp Sval = PyArray_STRIDES({a_val})[0] / PyArray_DESCR({a_val})->elsize;
563-
npy_intp Sind = PyArray_STRIDES({a_ind})[0] / PyArray_DESCR({a_ind})->elsize;
564-
npy_intp Sptr = PyArray_STRIDES({a_ptr})[0] / PyArray_DESCR({a_ptr})->elsize;
558+
npy_intp Szm = PyArray_STRIDES({z})[0] / PyArray_ITEMSIZE({z});
559+
npy_intp Szn = PyArray_STRIDES({z})[1] / PyArray_ITEMSIZE({z});
560+
npy_intp Sbm = PyArray_STRIDES({b})[0] / PyArray_ITEMSIZE({b});
561+
npy_intp Sbn = PyArray_STRIDES({b})[1] / PyArray_ITEMSIZE({b});
562+
npy_intp Sval = PyArray_STRIDES({a_val})[0] / PyArray_ITEMSIZE({a_val});
563+
npy_intp Sind = PyArray_STRIDES({a_ind})[0] / PyArray_ITEMSIZE({a_ind});
564+
npy_intp Sptr = PyArray_STRIDES({a_ptr})[0] / PyArray_ITEMSIZE({a_ptr});
565565
566566
// pointers to access actual data in the arrays passed as params.
567567
dtype_{z}* __restrict__ Dz = (dtype_{z}*)PyArray_DATA({z});
@@ -614,7 +614,7 @@ def c_code(self, node, name, inputs, outputs, sub):
614614
"""
615615

616616
def c_code_cache_version(self):
617-
return (2,)
617+
return (3,)
618618

619619

620620
sd_csr = StructuredDotCSR()
@@ -845,12 +845,12 @@ def c_code(self, node, name, inputs, outputs, sub):
845845
const npy_int32 * __restrict__ Dptr = (npy_int32*)PyArray_DATA({x_ptr});
846846
const dtype_{alpha} alpha = ((dtype_{alpha}*)PyArray_DATA({alpha}))[0];
847847
848-
npy_intp Sz = PyArray_STRIDES({z})[1] / PyArray_DESCR({z})->elsize;
849-
npy_intp Szn = PyArray_STRIDES({zn})[1] / PyArray_DESCR({zn})->elsize;
850-
npy_intp Sval = PyArray_STRIDES({x_val})[0] / PyArray_DESCR({x_val})->elsize;
851-
npy_intp Sind = PyArray_STRIDES({x_ind})[0] / PyArray_DESCR({x_ind})->elsize;
852-
npy_intp Sptr = PyArray_STRIDES({x_ptr})[0] / PyArray_DESCR({x_ptr})->elsize;
853-
npy_intp Sy = PyArray_STRIDES({y})[1] / PyArray_DESCR({y})->elsize;
848+
npy_intp Sz = PyArray_STRIDES({z})[1] / PyArray_ITEMSIZE({z});
849+
npy_intp Szn = PyArray_STRIDES({zn})[1] / PyArray_ITEMSIZE({zn});
850+
npy_intp Sval = PyArray_STRIDES({x_val})[0] / PyArray_ITEMSIZE({x_val});
851+
npy_intp Sind = PyArray_STRIDES({x_ind})[0] / PyArray_ITEMSIZE({x_ind});
852+
npy_intp Sptr = PyArray_STRIDES({x_ptr})[0] / PyArray_ITEMSIZE({x_ptr});
853+
npy_intp Sy = PyArray_STRIDES({y})[1] / PyArray_ITEMSIZE({y});
854854
855855
// blas expects ints; convert here (rather than just making N etc ints) to avoid potential overflow in the negative-stride correction
856856
if ((N > 0x7fffffffL)||(Sy > 0x7fffffffL)||(Szn > 0x7fffffffL)||(Sy < -0x7fffffffL)||(Szn < -0x7fffffffL))
@@ -896,7 +896,7 @@ def c_code(self, node, name, inputs, outputs, sub):
896896
return rval
897897

898898
def c_code_cache_version(self):
899-
return (3, blas.blas_header_version())
899+
return (4, blas.blas_header_version())
900900

901901

902902
usmm_csc_dense = UsmmCscDense(inplace=False)
@@ -1035,13 +1035,13 @@ def c_code(self, node, name, inputs, outputs, sub):
10351035
npy_intp sp_dim = (M == a_dim_0)?a_dim_1:a_dim_0;
10361036
10371037
// strides tell you how many bytes to skip to go to next column/row entry
1038-
npy_intp Sz = PyArray_STRIDES({z})[0] / PyArray_DESCR({z})->elsize;
1039-
npy_intp Sa_val = PyArray_STRIDES({a_val})[0] / PyArray_DESCR({a_val})->elsize;
1040-
npy_intp Sa_ind = PyArray_STRIDES({a_ind})[0] / PyArray_DESCR({a_ind})->elsize;
1041-
npy_intp Sa_ptr = PyArray_STRIDES({a_ptr})[0] / PyArray_DESCR({a_ptr})->elsize;
1042-
npy_intp Sb_val = PyArray_STRIDES({b_val})[0] / PyArray_DESCR({b_val})->elsize;
1043-
npy_intp Sb_ind = PyArray_STRIDES({b_ind})[0] / PyArray_DESCR({b_ind})->elsize;
1044-
npy_intp Sb_ptr = PyArray_STRIDES({b_ptr})[0] / PyArray_DESCR({b_ptr})->elsize;
1038+
npy_intp Sz = PyArray_STRIDES({z})[0] / PyArray_ITEMSIZE({z});
1039+
npy_intp Sa_val = PyArray_STRIDES({a_val})[0] / PyArray_ITEMSIZE({a_val});
1040+
npy_intp Sa_ind = PyArray_STRIDES({a_ind})[0] / PyArray_ITEMSIZE({a_ind});
1041+
npy_intp Sa_ptr = PyArray_STRIDES({a_ptr})[0] / PyArray_ITEMSIZE({a_ptr});
1042+
npy_intp Sb_val = PyArray_STRIDES({b_val})[0] / PyArray_ITEMSIZE({b_val});
1043+
npy_intp Sb_ind = PyArray_STRIDES({b_ind})[0] / PyArray_ITEMSIZE({b_ind});
1044+
npy_intp Sb_ptr = PyArray_STRIDES({b_ptr})[0] / PyArray_ITEMSIZE({b_ptr});
10451045
10461046
// pointers to access actual data in the arrays passed as params.
10471047
dtype_{z}* __restrict__ Dz = (dtype_{z}*)PyArray_DATA({z});
@@ -1086,7 +1086,7 @@ def c_code(self, node, name, inputs, outputs, sub):
10861086
"""
10871087

10881088
def c_code_cache_version(self):
1089-
return (3,)
1089+
return (4,)
10901090

10911091

10921092
csm_grad_c = CSMGradC()
@@ -1482,7 +1482,7 @@ def make_node(self, a_data, a_indices, a_indptr, b):
14821482
)
14831483

14841484
def c_code_cache_version(self):
1485-
return (2,)
1485+
return (3,)
14861486

14871487
def c_code(self, node, name, inputs, outputs, sub):
14881488
(
@@ -1544,7 +1544,7 @@ def c_code(self, node, name, inputs, outputs, sub):
15441544
15451545
dtype_{_zout} * const __restrict__ zout = (dtype_{_zout}*)PyArray_DATA({_zout});
15461546
1547-
const npy_intp Sb = PyArray_STRIDES({_b})[0] / PyArray_DESCR({_b})->elsize;
1547+
const npy_intp Sb = PyArray_STRIDES({_b})[0] / PyArray_ITEMSIZE({_b});
15481548
15491549
// loop over rows
15501550
for (npy_intp j = 0; j < N; ++j)
@@ -1655,7 +1655,7 @@ def make_node(self, a_data, a_indices, a_indptr, b):
16551655
)
16561656

16571657
def c_code_cache_version(self):
1658-
return (3,)
1658+
return (4,)
16591659

16601660
def c_code(self, node, name, inputs, outputs, sub):
16611661
(
@@ -1723,7 +1723,7 @@ def c_code(self, node, name, inputs, outputs, sub):
17231723
17241724
dtype_{_zout} * const __restrict__ zout = (dtype_{_zout}*)PyArray_DATA({_zout});
17251725
1726-
const npy_intp Sb = PyArray_STRIDES({_b})[0] / PyArray_DESCR({_b})->elsize;
1726+
const npy_intp Sb = PyArray_STRIDES({_b})[0] / PyArray_ITEMSIZE({_b});
17271727
17281728
// loop over columns
17291729
for (npy_intp j = 0; j < N; ++j)
@@ -1868,7 +1868,7 @@ def make_node(self, x, y, p_data, p_ind, p_ptr, p_ncols):
18681868
)
18691869

18701870
def c_code_cache_version(self):
1871-
return (4, blas.blas_header_version())
1871+
return (5, blas.blas_header_version())
18721872

18731873
def c_support_code(self, **kwargs):
18741874
return blas.blas_header_text()
@@ -1995,14 +1995,14 @@ def c_code(self, node, name, inputs, outputs, sub):
19951995
dtype_{z_ind}* __restrict__ Dzi = (dtype_{z_ind}*)PyArray_DATA({z_ind});
19961996
dtype_{z_ptr}* __restrict__ Dzp = (dtype_{z_ptr}*)PyArray_DATA({z_ptr});
19971997
1998-
const npy_intp Sdx = PyArray_STRIDES({x})[1]/PyArray_DESCR({x})->elsize;
1999-
const npy_intp Sdy = PyArray_STRIDES({y})[1]/PyArray_DESCR({y})->elsize;
2000-
const npy_intp Sdpd = PyArray_STRIDES({p_data})[0] / PyArray_DESCR({p_data})->elsize;
2001-
const npy_intp Sdpi = PyArray_STRIDES({p_ind})[0] / PyArray_DESCR({p_ind})->elsize;
2002-
const npy_intp Sdpp = PyArray_STRIDES({p_ptr})[0] / PyArray_DESCR({p_ptr})->elsize;
2003-
const npy_intp Sdzd = PyArray_STRIDES({z_data})[0] / PyArray_DESCR({z_data})->elsize;
2004-
const npy_intp Sdzi = PyArray_STRIDES({z_ind})[0] / PyArray_DESCR({z_ind})->elsize;
2005-
const npy_intp Sdzp = PyArray_STRIDES({z_ptr})[0] / PyArray_DESCR({z_ptr})->elsize;
1998+
const npy_intp Sdx = PyArray_STRIDES({x})[1]/PyArray_ITEMSIZE({x});
1999+
const npy_intp Sdy = PyArray_STRIDES({y})[1]/PyArray_ITEMSIZE({y});
2000+
const npy_intp Sdpd = PyArray_STRIDES({p_data})[0] / PyArray_ITEMSIZE({p_data});
2001+
const npy_intp Sdpi = PyArray_STRIDES({p_ind})[0] / PyArray_ITEMSIZE({p_ind});
2002+
const npy_intp Sdpp = PyArray_STRIDES({p_ptr})[0] / PyArray_ITEMSIZE({p_ptr});
2003+
const npy_intp Sdzd = PyArray_STRIDES({z_data})[0] / PyArray_ITEMSIZE({z_data});
2004+
const npy_intp Sdzi = PyArray_STRIDES({z_ind})[0] / PyArray_ITEMSIZE({z_ind});
2005+
const npy_intp Sdzp = PyArray_STRIDES({z_ptr})[0] / PyArray_ITEMSIZE({z_ptr});
20062006
20072007
memcpy(Dzi, Dpi, PyArray_DIMS({p_ind})[0]*sizeof(dtype_{p_ind}));
20082008
memcpy(Dzp, Dpp, PyArray_DIMS({p_ptr})[0]*sizeof(dtype_{p_ptr}));

pytensor/tensor/blas.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ def c_header_dirs(self, **kwargs):
498498
int unit = 0;
499499
500500
int type_num = PyArray_DESCR(%(_x)s)->type_num;
501-
int type_size = PyArray_DESCR(%(_x)s)->elsize; // in bytes
501+
int type_size = PyArray_ITEMSIZE(%(_x)s); // in bytes
502502
503503
npy_intp* Nx = PyArray_DIMS(%(_x)s);
504504
npy_intp* Ny = PyArray_DIMS(%(_y)s);
@@ -789,7 +789,7 @@ def build_gemm_call(self):
789789
)
790790

791791
def build_gemm_version(self):
792-
return (13, blas_header_version())
792+
return (14, blas_header_version())
793793

794794

795795
class Gemm(GemmRelated):
@@ -1030,7 +1030,7 @@ def infer_shape(self, fgraph, node, input_shapes):
10301030
%(fail)s
10311031
}
10321032
1033-
if(PyArray_MoveInto(x_new, %(_x)s) == -1)
1033+
if(PyArray_CopyInto(x_new, %(_x)s) == -1)
10341034
{
10351035
%(fail)s
10361036
}
@@ -1056,7 +1056,7 @@ def infer_shape(self, fgraph, node, input_shapes):
10561056
%(fail)s
10571057
}
10581058
1059-
if(PyArray_MoveInto(y_new, %(_y)s) == -1)
1059+
if(PyArray_CopyInto(y_new, %(_y)s) == -1)
10601060
{
10611061
%(fail)s
10621062
}
@@ -1102,7 +1102,7 @@ def c_code(self, node, name, inp, out, sub):
11021102
def c_code_cache_version(self):
11031103
gv = self.build_gemm_version()
11041104
if gv:
1105-
return (7, *gv)
1105+
return (8, *gv)
11061106
else:
11071107
return gv
11081108

@@ -1538,7 +1538,7 @@ def contiguous(var, ndim):
15381538

15391539
return f"""
15401540
int type_num = PyArray_DESCR({_x})->type_num;
1541-
int type_size = PyArray_DESCR({_x})->elsize; // in bytes
1541+
int type_size = PyArray_ITEMSIZE({_x}); // in bytes
15421542
15431543
if (PyArray_NDIM({_x}) != 3) {{
15441544
PyErr_Format(PyExc_NotImplementedError,
@@ -1598,7 +1598,7 @@ def contiguous(var, ndim):
15981598
def c_code_cache_version(self):
15991599
from pytensor.tensor.blas_headers import blas_header_version
16001600

1601-
return (5, blas_header_version())
1601+
return (6, blas_header_version())
16021602

16031603
def grad(self, inp, grads):
16041604
x, y = inp

pytensor/tensor/blas_headers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,7 +1053,7 @@ def openblas_threads_text():
10531053

10541054
def blas_header_version():
10551055
# Version for the base header
1056-
version = (9,)
1056+
version = (10,)
10571057
if detect_macos_sdot_bug():
10581058
if detect_macos_sdot_bug.fix_works:
10591059
# Version with fix
@@ -1071,7 +1071,7 @@ def ____gemm_code(check_ab, a_init, b_init):
10711071
const char * error_string = NULL;
10721072
10731073
int type_num = PyArray_DESCR(_x)->type_num;
1074-
int type_size = PyArray_DESCR(_x)->elsize; // in bytes
1074+
int type_size = PyArray_ITEMSIZE(_x); // in bytes
10751075
10761076
npy_intp* Nx = PyArray_DIMS(_x);
10771077
npy_intp* Ny = PyArray_DIMS(_y);

tests/compile/test_debugmode.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ def dontuse_perform(self, node, inp, out_):
146146
raise ValueError(self.behaviour)
147147

148148
def c_code_cache_version(self):
149-
return (1,)
149+
return (2,)
150150

151151
def c_code(self, node, name, inp, out, sub):
152152
(a,) = inp
@@ -165,8 +165,8 @@ def c_code(self, node, name, inp, out, sub):
165165
prep_vars = f"""
166166
//the output array has size M x N
167167
npy_intp M = PyArray_DIMS({a})[0];
168-
npy_intp Sa = PyArray_STRIDES({a})[0] / PyArray_DESCR({a})->elsize;
169-
npy_intp Sz = PyArray_STRIDES({z})[0] / PyArray_DESCR({z})->elsize;
168+
npy_intp Sa = PyArray_STRIDES({a})[0] / PyArray_ITEMSIZE({a});
169+
npy_intp Sz = PyArray_STRIDES({z})[0] / PyArray_ITEMSIZE({z});
170170
171171
npy_double * Da = (npy_double*)PyArray_BYTES({a});
172172
npy_double * Dz = (npy_double*)PyArray_BYTES({z});

0 commit comments

Comments
 (0)