File: | numpy/core/src/multiarray/calculation.c |
Warning: | line 407, column 17 PyObject ownership leak with reference count of 1 |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | #define PY_SSIZE_T_CLEAN | ||||||
2 | #include <Python.h> | ||||||
3 | #include "structmember.h" | ||||||
4 | |||||||
5 | #define NPY_NO_DEPRECATED_API0x0000000E NPY_API_VERSION0x0000000E | ||||||
6 | #define _MULTIARRAYMODULE | ||||||
7 | #include "numpy/arrayobject.h" | ||||||
8 | #include "lowlevel_strided_loops.h" | ||||||
9 | |||||||
10 | #include "npy_config.h" | ||||||
11 | |||||||
12 | #include "npy_pycompat.h" | ||||||
13 | |||||||
14 | #include "common.h" | ||||||
15 | #include "number.h" | ||||||
16 | |||||||
17 | #include "calculation.h" | ||||||
18 | #include "array_assign.h" | ||||||
19 | |||||||
20 | static double | ||||||
21 | power_of_ten(int n) | ||||||
22 | { | ||||||
23 | static const double p10[] = {1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8}; | ||||||
24 | double ret; | ||||||
25 | if (n < 9) { | ||||||
26 | ret = p10[n]; | ||||||
27 | } | ||||||
28 | else { | ||||||
29 | ret = 1e9; | ||||||
30 | while (n-- > 9) { | ||||||
31 | ret *= 10.; | ||||||
32 | } | ||||||
33 | } | ||||||
34 | return ret; | ||||||
35 | } | ||||||
36 | |||||||
37 | /*NUMPY_API | ||||||
38 | * ArgMax | ||||||
39 | */ | ||||||
40 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
41 | PyArray_ArgMax(PyArrayObject *op, int axis, PyArrayObject *out) | ||||||
42 | { | ||||||
43 | PyArrayObject *ap = NULL((void*)0), *rp = NULL((void*)0); | ||||||
44 | PyArray_ArgFunc* arg_func; | ||||||
45 | char *ip; | ||||||
46 | npy_intp *rptr; | ||||||
47 | npy_intp i, n, m; | ||||||
48 | int elsize; | ||||||
49 | NPY_BEGIN_THREADS_DEFPyThreadState *_save=((void*)0);; | ||||||
50 | |||||||
51 | if ((ap = (PyArrayObject *)PyArray_CheckAxis(op, &axis, 0)) == NULL((void*)0)) { | ||||||
52 | return NULL((void*)0); | ||||||
53 | } | ||||||
54 | /* | ||||||
55 | * We need to permute the array so that axis is placed at the end. | ||||||
56 | * And all other dimensions are shifted left. | ||||||
57 | */ | ||||||
58 | if (axis != PyArray_NDIM(ap)-1) { | ||||||
59 | PyArray_Dims newaxes; | ||||||
60 | npy_intp dims[NPY_MAXDIMS32]; | ||||||
61 | int j; | ||||||
62 | |||||||
63 | newaxes.ptr = dims; | ||||||
64 | newaxes.len = PyArray_NDIM(ap); | ||||||
65 | for (j = 0; j < axis; j++) { | ||||||
66 | dims[j] = j; | ||||||
67 | } | ||||||
68 | for (j = axis; j < PyArray_NDIM(ap) - 1; j++) { | ||||||
69 | dims[j] = j + 1; | ||||||
70 | } | ||||||
71 | dims[PyArray_NDIM(ap) - 1] = axis; | ||||||
72 | op = (PyArrayObject *)PyArray_Transpose(ap, &newaxes); | ||||||
73 | Py_DECREF(ap)_Py_DECREF(((PyObject*)(ap))); | ||||||
74 | if (op == NULL((void*)0)) { | ||||||
75 | return NULL((void*)0); | ||||||
76 | } | ||||||
77 | } | ||||||
78 | else { | ||||||
79 | op = ap; | ||||||
80 | } | ||||||
81 | |||||||
82 | /* Will get native-byte order contiguous copy. */ | ||||||
83 | ap = (PyArrayObject *)PyArray_ContiguousFromAny((PyObject *)op,PyArray_FromAny((PyObject *)op, PyArray_DescrFromType(PyArray_DESCR (op)->type_num), 1, 0, ((0x0001 | (0x0100 | 0x0400))), ((void *)0)) | ||||||
84 | PyArray_DESCR(op)->type_num, 1, 0)PyArray_FromAny((PyObject *)op, PyArray_DescrFromType(PyArray_DESCR (op)->type_num), 1, 0, ((0x0001 | (0x0100 | 0x0400))), ((void *)0)); | ||||||
85 | Py_DECREF(op)_Py_DECREF(((PyObject*)(op))); | ||||||
86 | if (ap == NULL((void*)0)) { | ||||||
87 | return NULL((void*)0); | ||||||
88 | } | ||||||
89 | arg_func = PyArray_DESCR(ap)->f->argmax; | ||||||
90 | if (arg_func == NULL((void*)0)) { | ||||||
91 | PyErr_SetString(PyExc_TypeError, | ||||||
92 | "data type not ordered"); | ||||||
93 | goto fail; | ||||||
94 | } | ||||||
95 | elsize = PyArray_DESCR(ap)->elsize; | ||||||
96 | m = PyArray_DIMS(ap)[PyArray_NDIM(ap)-1]; | ||||||
97 | if (m == 0) { | ||||||
98 | PyErr_SetString(PyExc_ValueError, | ||||||
99 | "attempt to get argmax of an empty sequence"); | ||||||
100 | goto fail; | ||||||
101 | } | ||||||
102 | |||||||
103 | if (!out) { | ||||||
104 | rp = (PyArrayObject *)PyArray_NewFromDescr( | ||||||
105 | Py_TYPE(ap)(((PyObject*)(ap))->ob_type), PyArray_DescrFromType(NPY_INTPNPY_LONG), | ||||||
106 | PyArray_NDIM(ap) - 1, PyArray_DIMS(ap), NULL((void*)0), NULL((void*)0), | ||||||
107 | 0, (PyObject *)ap); | ||||||
108 | if (rp == NULL((void*)0)) { | ||||||
109 | goto fail; | ||||||
110 | } | ||||||
111 | } | ||||||
112 | else { | ||||||
113 | if ((PyArray_NDIM(out) != PyArray_NDIM(ap) - 1) || | ||||||
114 | !PyArray_CompareLists(PyArray_DIMS(out), PyArray_DIMS(ap), | ||||||
115 | PyArray_NDIM(out))) { | ||||||
116 | PyErr_SetString(PyExc_ValueError, | ||||||
117 | "output array does not match result of np.argmax."); | ||||||
118 | goto fail; | ||||||
119 | } | ||||||
120 | rp = (PyArrayObject *)PyArray_FromArray(out, | ||||||
121 | PyArray_DescrFromType(NPY_INTPNPY_LONG), | ||||||
122 | NPY_ARRAY_CARRAY(0x0001 | (0x0100 | 0x0400)) | NPY_ARRAY_WRITEBACKIFCOPY0x2000); | ||||||
123 | if (rp == NULL((void*)0)) { | ||||||
124 | goto fail; | ||||||
125 | } | ||||||
126 | } | ||||||
127 | |||||||
128 | NPY_BEGIN_THREADS_DESCR(PyArray_DESCR(ap))do {if (!(((((PyArray_DESCR(ap)))->flags & (0x10)) == ( 0x10)))) do {_save = PyEval_SaveThread();} while (0);;} while (0);; | ||||||
129 | n = PyArray_SIZE(ap)PyArray_MultiplyList(PyArray_DIMS(ap), PyArray_NDIM(ap))/m; | ||||||
130 | rptr = (npy_intp *)PyArray_DATA(rp); | ||||||
131 | for (ip = PyArray_DATA(ap), i = 0; i < n; i++, ip += elsize*m) { | ||||||
132 | arg_func(ip, m, rptr, ap); | ||||||
133 | rptr += 1; | ||||||
134 | } | ||||||
135 | NPY_END_THREADS_DESCR(PyArray_DESCR(ap))do {if (!(((((PyArray_DESCR(ap)))->flags & (0x10)) == ( 0x10)))) do { if (_save) { PyEval_RestoreThread(_save); _save = ((void*)0);} } while (0);; } while (0);; | ||||||
136 | |||||||
137 | Py_DECREF(ap)_Py_DECREF(((PyObject*)(ap))); | ||||||
138 | /* Trigger the UPDATEIFCOPY/WRTIEBACKIFCOPY if necessary */ | ||||||
139 | if (out != NULL((void*)0) && out != rp) { | ||||||
140 | PyArray_ResolveWritebackIfCopy(rp); | ||||||
141 | Py_DECREF(rp)_Py_DECREF(((PyObject*)(rp))); | ||||||
142 | rp = out; | ||||||
143 | Py_INCREF(rp)_Py_INCREF(((PyObject*)(rp))); | ||||||
144 | } | ||||||
145 | return (PyObject *)rp; | ||||||
146 | |||||||
147 | fail: | ||||||
148 | Py_DECREF(ap)_Py_DECREF(((PyObject*)(ap))); | ||||||
149 | Py_XDECREF(rp)_Py_XDECREF(((PyObject*)(rp))); | ||||||
150 | return NULL((void*)0); | ||||||
151 | } | ||||||
152 | |||||||
153 | /*NUMPY_API | ||||||
154 | * ArgMin | ||||||
155 | */ | ||||||
156 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
157 | PyArray_ArgMin(PyArrayObject *op, int axis, PyArrayObject *out) | ||||||
158 | { | ||||||
159 | PyArrayObject *ap = NULL((void*)0), *rp = NULL((void*)0); | ||||||
160 | PyArray_ArgFunc* arg_func; | ||||||
161 | char *ip; | ||||||
162 | npy_intp *rptr; | ||||||
163 | npy_intp i, n, m; | ||||||
164 | int elsize; | ||||||
165 | NPY_BEGIN_THREADS_DEFPyThreadState *_save=((void*)0);; | ||||||
166 | |||||||
167 | if ((ap = (PyArrayObject *)PyArray_CheckAxis(op, &axis, 0)) == NULL((void*)0)) { | ||||||
168 | return NULL((void*)0); | ||||||
169 | } | ||||||
170 | /* | ||||||
171 | * We need to permute the array so that axis is placed at the end. | ||||||
172 | * And all other dimensions are shifted left. | ||||||
173 | */ | ||||||
174 | if (axis != PyArray_NDIM(ap)-1) { | ||||||
175 | PyArray_Dims newaxes; | ||||||
176 | npy_intp dims[NPY_MAXDIMS32]; | ||||||
177 | int i; | ||||||
178 | |||||||
179 | newaxes.ptr = dims; | ||||||
180 | newaxes.len = PyArray_NDIM(ap); | ||||||
181 | for (i = 0; i < axis; i++) { | ||||||
182 | dims[i] = i; | ||||||
183 | } | ||||||
184 | for (i = axis; i < PyArray_NDIM(ap) - 1; i++) { | ||||||
185 | dims[i] = i + 1; | ||||||
186 | } | ||||||
187 | dims[PyArray_NDIM(ap) - 1] = axis; | ||||||
188 | op = (PyArrayObject *)PyArray_Transpose(ap, &newaxes); | ||||||
189 | Py_DECREF(ap)_Py_DECREF(((PyObject*)(ap))); | ||||||
190 | if (op == NULL((void*)0)) { | ||||||
191 | return NULL((void*)0); | ||||||
192 | } | ||||||
193 | } | ||||||
194 | else { | ||||||
195 | op = ap; | ||||||
196 | } | ||||||
197 | |||||||
198 | /* Will get native-byte order contiguous copy. */ | ||||||
199 | ap = (PyArrayObject *)PyArray_ContiguousFromAny((PyObject *)op,PyArray_FromAny((PyObject *)op, PyArray_DescrFromType(PyArray_DESCR (op)->type_num), 1, 0, ((0x0001 | (0x0100 | 0x0400))), ((void *)0)) | ||||||
200 | PyArray_DESCR(op)->type_num, 1, 0)PyArray_FromAny((PyObject *)op, PyArray_DescrFromType(PyArray_DESCR (op)->type_num), 1, 0, ((0x0001 | (0x0100 | 0x0400))), ((void *)0)); | ||||||
201 | Py_DECREF(op)_Py_DECREF(((PyObject*)(op))); | ||||||
202 | if (ap == NULL((void*)0)) { | ||||||
203 | return NULL((void*)0); | ||||||
204 | } | ||||||
205 | arg_func = PyArray_DESCR(ap)->f->argmin; | ||||||
206 | if (arg_func == NULL((void*)0)) { | ||||||
207 | PyErr_SetString(PyExc_TypeError, | ||||||
208 | "data type not ordered"); | ||||||
209 | goto fail; | ||||||
210 | } | ||||||
211 | elsize = PyArray_DESCR(ap)->elsize; | ||||||
212 | m = PyArray_DIMS(ap)[PyArray_NDIM(ap)-1]; | ||||||
213 | if (m == 0) { | ||||||
214 | PyErr_SetString(PyExc_ValueError, | ||||||
215 | "attempt to get argmin of an empty sequence"); | ||||||
216 | goto fail; | ||||||
217 | } | ||||||
218 | |||||||
219 | if (!out) { | ||||||
220 | rp = (PyArrayObject *)PyArray_NewFromDescr( | ||||||
221 | Py_TYPE(ap)(((PyObject*)(ap))->ob_type), PyArray_DescrFromType(NPY_INTPNPY_LONG), | ||||||
222 | PyArray_NDIM(ap) - 1, PyArray_DIMS(ap), NULL((void*)0), NULL((void*)0), | ||||||
223 | 0, (PyObject *)ap); | ||||||
224 | if (rp == NULL((void*)0)) { | ||||||
225 | goto fail; | ||||||
226 | } | ||||||
227 | } | ||||||
228 | else { | ||||||
229 | if ((PyArray_NDIM(out) != PyArray_NDIM(ap) - 1) || | ||||||
230 | !PyArray_CompareLists(PyArray_DIMS(out), PyArray_DIMS(ap), | ||||||
231 | PyArray_NDIM(out))) { | ||||||
232 | PyErr_SetString(PyExc_ValueError, | ||||||
233 | "output array does not match result of np.argmin."); | ||||||
234 | goto fail; | ||||||
235 | } | ||||||
236 | rp = (PyArrayObject *)PyArray_FromArray(out, | ||||||
237 | PyArray_DescrFromType(NPY_INTPNPY_LONG), | ||||||
238 | NPY_ARRAY_CARRAY(0x0001 | (0x0100 | 0x0400)) | NPY_ARRAY_WRITEBACKIFCOPY0x2000); | ||||||
239 | if (rp == NULL((void*)0)) { | ||||||
240 | goto fail; | ||||||
241 | } | ||||||
242 | } | ||||||
243 | |||||||
244 | NPY_BEGIN_THREADS_DESCR(PyArray_DESCR(ap))do {if (!(((((PyArray_DESCR(ap)))->flags & (0x10)) == ( 0x10)))) do {_save = PyEval_SaveThread();} while (0);;} while (0);; | ||||||
245 | n = PyArray_SIZE(ap)PyArray_MultiplyList(PyArray_DIMS(ap), PyArray_NDIM(ap))/m; | ||||||
246 | rptr = (npy_intp *)PyArray_DATA(rp); | ||||||
247 | for (ip = PyArray_DATA(ap), i = 0; i < n; i++, ip += elsize*m) { | ||||||
248 | arg_func(ip, m, rptr, ap); | ||||||
249 | rptr += 1; | ||||||
250 | } | ||||||
251 | NPY_END_THREADS_DESCR(PyArray_DESCR(ap))do {if (!(((((PyArray_DESCR(ap)))->flags & (0x10)) == ( 0x10)))) do { if (_save) { PyEval_RestoreThread(_save); _save = ((void*)0);} } while (0);; } while (0);; | ||||||
252 | |||||||
253 | Py_DECREF(ap)_Py_DECREF(((PyObject*)(ap))); | ||||||
254 | /* Trigger the UPDATEIFCOPY/WRITEBACKIFCOPY if necessary */ | ||||||
255 | if (out != NULL((void*)0) && out != rp) { | ||||||
256 | PyArray_ResolveWritebackIfCopy(rp); | ||||||
257 | Py_DECREF(rp)_Py_DECREF(((PyObject*)(rp))); | ||||||
258 | rp = out; | ||||||
259 | Py_INCREF(rp)_Py_INCREF(((PyObject*)(rp))); | ||||||
260 | } | ||||||
261 | return (PyObject *)rp; | ||||||
262 | |||||||
263 | fail: | ||||||
264 | Py_DECREF(ap)_Py_DECREF(((PyObject*)(ap))); | ||||||
265 | Py_XDECREF(rp)_Py_XDECREF(((PyObject*)(rp))); | ||||||
266 | return NULL((void*)0); | ||||||
267 | } | ||||||
268 | |||||||
269 | /*NUMPY_API | ||||||
270 | * Max | ||||||
271 | */ | ||||||
272 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
273 | PyArray_Max(PyArrayObject *ap, int axis, PyArrayObject *out) | ||||||
274 | { | ||||||
275 | PyArrayObject *arr; | ||||||
276 | PyObject *ret; | ||||||
277 | |||||||
278 | arr = (PyArrayObject *)PyArray_CheckAxis(ap, &axis, 0); | ||||||
279 | if (arr == NULL((void*)0)) { | ||||||
280 | return NULL((void*)0); | ||||||
281 | } | ||||||
282 | ret = PyArray_GenericReduceFunction(arr, n_ops.maximum, axis, | ||||||
283 | PyArray_DESCR(arr)->type_num, out); | ||||||
284 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
285 | return ret; | ||||||
286 | } | ||||||
287 | |||||||
288 | /*NUMPY_API | ||||||
289 | * Min | ||||||
290 | */ | ||||||
291 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
292 | PyArray_Min(PyArrayObject *ap, int axis, PyArrayObject *out) | ||||||
293 | { | ||||||
294 | PyArrayObject *arr; | ||||||
295 | PyObject *ret; | ||||||
296 | |||||||
297 | arr=(PyArrayObject *)PyArray_CheckAxis(ap, &axis, 0); | ||||||
298 | if (arr == NULL((void*)0)) { | ||||||
299 | return NULL((void*)0); | ||||||
300 | } | ||||||
301 | ret = PyArray_GenericReduceFunction(arr, n_ops.minimum, axis, | ||||||
302 | PyArray_DESCR(arr)->type_num, out); | ||||||
303 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
304 | return ret; | ||||||
305 | } | ||||||
306 | |||||||
307 | /*NUMPY_API | ||||||
308 | * Ptp | ||||||
309 | */ | ||||||
310 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
311 | PyArray_Ptp(PyArrayObject *ap, int axis, PyArrayObject *out) | ||||||
312 | { | ||||||
313 | PyArrayObject *arr; | ||||||
314 | PyObject *ret; | ||||||
315 | PyObject *obj1 = NULL((void*)0), *obj2 = NULL((void*)0); | ||||||
316 | |||||||
317 | arr=(PyArrayObject *)PyArray_CheckAxis(ap, &axis, 0); | ||||||
318 | if (arr == NULL((void*)0)) { | ||||||
319 | return NULL((void*)0); | ||||||
320 | } | ||||||
321 | obj1 = PyArray_Max(arr, axis, out); | ||||||
322 | if (obj1 == NULL((void*)0)) { | ||||||
323 | goto fail; | ||||||
324 | } | ||||||
325 | obj2 = PyArray_Min(arr, axis, NULL((void*)0)); | ||||||
326 | if (obj2 == NULL((void*)0)) { | ||||||
327 | goto fail; | ||||||
328 | } | ||||||
329 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
330 | if (out) { | ||||||
331 | ret = PyObject_CallFunction_PyObject_CallFunction_SizeT(n_ops.subtract, "OOO", out, obj2, out); | ||||||
332 | } | ||||||
333 | else { | ||||||
334 | ret = PyNumber_Subtract(obj1, obj2); | ||||||
335 | } | ||||||
336 | Py_DECREF(obj1)_Py_DECREF(((PyObject*)(obj1))); | ||||||
337 | Py_DECREF(obj2)_Py_DECREF(((PyObject*)(obj2))); | ||||||
338 | return ret; | ||||||
339 | |||||||
340 | fail: | ||||||
341 | Py_XDECREF(arr)_Py_XDECREF(((PyObject*)(arr))); | ||||||
342 | Py_XDECREF(obj1)_Py_XDECREF(((PyObject*)(obj1))); | ||||||
343 | Py_XDECREF(obj2)_Py_XDECREF(((PyObject*)(obj2))); | ||||||
344 | return NULL((void*)0); | ||||||
345 | } | ||||||
346 | |||||||
347 | |||||||
348 | |||||||
349 | /*NUMPY_API | ||||||
350 | * Set variance to 1 to by-pass square-root calculation and return variance | ||||||
351 | * Std | ||||||
352 | */ | ||||||
353 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
354 | PyArray_Std(PyArrayObject *self, int axis, int rtype, PyArrayObject *out, | ||||||
355 | int variance) | ||||||
356 | { | ||||||
357 | return __New_PyArray_Std(self, axis, rtype, out, variance, 0); | ||||||
| |||||||
358 | } | ||||||
359 | |||||||
360 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
361 | __New_PyArray_Std(PyArrayObject *self, int axis, int rtype, PyArrayObject *out, | ||||||
362 | int variance, int num) | ||||||
363 | { | ||||||
364 | PyObject *obj1 = NULL((void*)0), *obj2 = NULL((void*)0), *obj3 = NULL((void*)0); | ||||||
365 | PyArrayObject *arr1 = NULL((void*)0), *arr2 = NULL((void*)0), *arrnew = NULL((void*)0); | ||||||
366 | PyObject *ret = NULL((void*)0), *newshape = NULL((void*)0); | ||||||
367 | int i, n; | ||||||
368 | npy_intp val; | ||||||
369 | |||||||
370 | arrnew = (PyArrayObject *)PyArray_CheckAxis(self, &axis, 0); | ||||||
371 | if (arrnew
| ||||||
372 | return NULL((void*)0); | ||||||
373 | } | ||||||
374 | /* Compute and reshape mean */ | ||||||
375 | arr1 = (PyArrayObject *)PyArray_EnsureAnyArray( | ||||||
376 | PyArray_Mean(arrnew, axis, rtype, NULL((void*)0))); | ||||||
377 | if (arr1
| ||||||
378 | Py_DECREF(arrnew)_Py_DECREF(((PyObject*)(arrnew))); | ||||||
379 | return NULL((void*)0); | ||||||
380 | } | ||||||
381 | n = PyArray_NDIM(arrnew); | ||||||
382 | newshape = PyTuple_New(n); | ||||||
383 | if (newshape == NULL((void*)0)) { | ||||||
384 | Py_DECREF(arr1)_Py_DECREF(((PyObject*)(arr1))); | ||||||
385 | Py_DECREF(arrnew)_Py_DECREF(((PyObject*)(arrnew))); | ||||||
386 | return NULL((void*)0); | ||||||
387 | } | ||||||
388 | for (i = 0; i < n; i++) { | ||||||
389 | if (i == axis) { | ||||||
390 | val = 1; | ||||||
391 | } | ||||||
392 | else { | ||||||
393 | val = PyArray_DIM(arrnew,i); | ||||||
394 | } | ||||||
395 | PyTuple_SET_ITEM(newshape, i, PyLong_FromSsize_t(val))PyTuple_SetItem(newshape, i, PyLong_FromSsize_t(val)); | ||||||
396 | } | ||||||
397 | arr2 = (PyArrayObject *)PyArray_Reshape(arr1, newshape); | ||||||
398 | Py_DECREF(arr1)_Py_DECREF(((PyObject*)(arr1))); | ||||||
399 | Py_DECREF(newshape)_Py_DECREF(((PyObject*)(newshape))); | ||||||
400 | if (arr2 == NULL((void*)0)) { | ||||||
401 | Py_DECREF(arrnew)_Py_DECREF(((PyObject*)(arrnew))); | ||||||
402 | return NULL((void*)0); | ||||||
403 | } | ||||||
404 | |||||||
405 | /* Compute x = x - mx */ | ||||||
406 | arr1 = (PyArrayObject *)PyArray_EnsureAnyArray( | ||||||
407 | PyNumber_Subtract((PyObject *)arrnew, (PyObject *)arr2)); | ||||||
| |||||||
408 | Py_DECREF(arr2)_Py_DECREF(((PyObject*)(arr2))); | ||||||
409 | if (arr1
| ||||||
410 | Py_DECREF(arrnew)_Py_DECREF(((PyObject*)(arrnew))); | ||||||
411 | return NULL((void*)0); | ||||||
412 | } | ||||||
413 | /* Compute x * x */ | ||||||
414 | if (PyArray_ISCOMPLEX(arr1)(((PyArray_TYPE(arr1)) >= NPY_CFLOAT) && ((PyArray_TYPE (arr1)) <= NPY_CLONGDOUBLE))) { | ||||||
415 | obj3 = PyArray_Conjugate(arr1, NULL((void*)0)); | ||||||
416 | } | ||||||
417 | else { | ||||||
418 | obj3 = (PyObject *)arr1; | ||||||
419 | Py_INCREF(arr1)_Py_INCREF(((PyObject*)(arr1))); | ||||||
420 | } | ||||||
421 | if (obj3 == NULL((void*)0)) { | ||||||
422 | Py_DECREF(arrnew)_Py_DECREF(((PyObject*)(arrnew))); | ||||||
423 | return NULL((void*)0); | ||||||
424 | } | ||||||
425 | arr2 = (PyArrayObject *)PyArray_EnsureAnyArray( | ||||||
426 | PyArray_GenericBinaryFunction((PyObject *)arr1, obj3, | ||||||
427 | n_ops.multiply)); | ||||||
428 | Py_DECREF(arr1)_Py_DECREF(((PyObject*)(arr1))); | ||||||
429 | Py_DECREF(obj3)_Py_DECREF(((PyObject*)(obj3))); | ||||||
430 | if (arr2 == NULL((void*)0)) { | ||||||
431 | Py_DECREF(arrnew)_Py_DECREF(((PyObject*)(arrnew))); | ||||||
432 | return NULL((void*)0); | ||||||
433 | } | ||||||
434 | if (PyArray_ISCOMPLEX(arr2)(((PyArray_TYPE(arr2)) >= NPY_CFLOAT) && ((PyArray_TYPE (arr2)) <= NPY_CLONGDOUBLE))) { | ||||||
435 | obj3 = PyObject_GetAttrString((PyObject *)arr2, "real"); | ||||||
436 | switch(rtype) { | ||||||
437 | case NPY_CDOUBLE: | ||||||
438 | rtype = NPY_DOUBLE; | ||||||
439 | break; | ||||||
440 | case NPY_CFLOAT: | ||||||
441 | rtype = NPY_FLOAT; | ||||||
442 | break; | ||||||
443 | case NPY_CLONGDOUBLE: | ||||||
444 | rtype = NPY_LONGDOUBLE; | ||||||
445 | break; | ||||||
446 | } | ||||||
447 | } | ||||||
448 | else { | ||||||
449 | obj3 = (PyObject *)arr2; | ||||||
450 | Py_INCREF(arr2)_Py_INCREF(((PyObject*)(arr2))); | ||||||
451 | } | ||||||
452 | if (obj3 == NULL((void*)0)) { | ||||||
453 | Py_DECREF(arrnew)_Py_DECREF(((PyObject*)(arrnew))); | ||||||
454 | return NULL((void*)0); | ||||||
455 | } | ||||||
456 | /* Compute add.reduce(x*x,axis) */ | ||||||
457 | obj1 = PyArray_GenericReduceFunction((PyArrayObject *)obj3, n_ops.add, | ||||||
458 | axis, rtype, NULL((void*)0)); | ||||||
459 | Py_DECREF(obj3)_Py_DECREF(((PyObject*)(obj3))); | ||||||
460 | Py_DECREF(arr2)_Py_DECREF(((PyObject*)(arr2))); | ||||||
461 | if (obj1 == NULL((void*)0)) { | ||||||
462 | Py_DECREF(arrnew)_Py_DECREF(((PyObject*)(arrnew))); | ||||||
463 | return NULL((void*)0); | ||||||
464 | } | ||||||
465 | n = PyArray_DIM(arrnew,axis); | ||||||
466 | Py_DECREF(arrnew)_Py_DECREF(((PyObject*)(arrnew))); | ||||||
467 | n = (n-num); | ||||||
468 | if (n == 0) { | ||||||
469 | n = 1; | ||||||
470 | } | ||||||
471 | obj2 = PyFloat_FromDouble(1.0/((double )n)); | ||||||
472 | if (obj2 == NULL((void*)0)) { | ||||||
473 | Py_DECREF(obj1)_Py_DECREF(((PyObject*)(obj1))); | ||||||
474 | return NULL((void*)0); | ||||||
475 | } | ||||||
476 | ret = PyNumber_Multiply(obj1, obj2); | ||||||
477 | Py_DECREF(obj1)_Py_DECREF(((PyObject*)(obj1))); | ||||||
478 | Py_DECREF(obj2)_Py_DECREF(((PyObject*)(obj2))); | ||||||
479 | |||||||
480 | if (!variance) { | ||||||
481 | arr1 = (PyArrayObject *)PyArray_EnsureAnyArray(ret); | ||||||
482 | /* sqrt() */ | ||||||
483 | ret = PyArray_GenericUnaryFunction(arr1, n_ops.sqrt); | ||||||
484 | Py_DECREF(arr1)_Py_DECREF(((PyObject*)(arr1))); | ||||||
485 | } | ||||||
486 | if (ret == NULL((void*)0)) { | ||||||
487 | return NULL((void*)0); | ||||||
488 | } | ||||||
489 | if (PyArray_CheckExact(self)(((PyObject*)(self))->ob_type == &PyArray_Type)) { | ||||||
490 | goto finish; | ||||||
491 | } | ||||||
492 | if (PyArray_Check(self)((((PyObject*)(self))->ob_type) == (&PyArray_Type) || PyType_IsSubtype ((((PyObject*)(self))->ob_type), (&PyArray_Type))) && Py_TYPE(self)(((PyObject*)(self))->ob_type) == Py_TYPE(ret)(((PyObject*)(ret))->ob_type)) { | ||||||
493 | goto finish; | ||||||
494 | } | ||||||
495 | arr1 = (PyArrayObject *)PyArray_EnsureArray(ret); | ||||||
496 | if (arr1 == NULL((void*)0)) { | ||||||
497 | return NULL((void*)0); | ||||||
498 | } | ||||||
499 | ret = PyArray_View(arr1, NULL((void*)0), Py_TYPE(self)(((PyObject*)(self))->ob_type)); | ||||||
500 | Py_DECREF(arr1)_Py_DECREF(((PyObject*)(arr1))); | ||||||
501 | |||||||
502 | finish: | ||||||
503 | if (out) { | ||||||
504 | if (PyArray_AssignArray(out, (PyArrayObject *)ret, | ||||||
505 | NULL((void*)0), NPY_DEFAULT_ASSIGN_CASTING) < 0) { | ||||||
506 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); | ||||||
507 | return NULL((void*)0); | ||||||
508 | } | ||||||
509 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); | ||||||
510 | Py_INCREF(out)_Py_INCREF(((PyObject*)(out))); | ||||||
511 | return (PyObject *)out; | ||||||
512 | } | ||||||
513 | return ret; | ||||||
514 | } | ||||||
515 | |||||||
516 | |||||||
517 | /*NUMPY_API | ||||||
518 | *Sum | ||||||
519 | */ | ||||||
520 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
521 | PyArray_Sum(PyArrayObject *self, int axis, int rtype, PyArrayObject *out) | ||||||
522 | { | ||||||
523 | PyObject *arr, *ret; | ||||||
524 | |||||||
525 | arr = PyArray_CheckAxis(self, &axis, 0); | ||||||
526 | if (arr == NULL((void*)0)) { | ||||||
527 | return NULL((void*)0); | ||||||
528 | } | ||||||
529 | ret = PyArray_GenericReduceFunction((PyArrayObject *)arr, n_ops.add, axis, | ||||||
530 | rtype, out); | ||||||
531 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
532 | return ret; | ||||||
533 | } | ||||||
534 | |||||||
535 | /*NUMPY_API | ||||||
536 | * Prod | ||||||
537 | */ | ||||||
538 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
539 | PyArray_Prod(PyArrayObject *self, int axis, int rtype, PyArrayObject *out) | ||||||
540 | { | ||||||
541 | PyObject *arr, *ret; | ||||||
542 | |||||||
543 | arr = PyArray_CheckAxis(self, &axis, 0); | ||||||
544 | if (arr == NULL((void*)0)) { | ||||||
545 | return NULL((void*)0); | ||||||
546 | } | ||||||
547 | ret = PyArray_GenericReduceFunction((PyArrayObject *)arr, | ||||||
548 | n_ops.multiply, axis, | ||||||
549 | rtype, out); | ||||||
550 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
551 | return ret; | ||||||
552 | } | ||||||
553 | |||||||
554 | /*NUMPY_API | ||||||
555 | *CumSum | ||||||
556 | */ | ||||||
557 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
558 | PyArray_CumSum(PyArrayObject *self, int axis, int rtype, PyArrayObject *out) | ||||||
559 | { | ||||||
560 | PyObject *arr, *ret; | ||||||
561 | |||||||
562 | arr = PyArray_CheckAxis(self, &axis, 0); | ||||||
563 | if (arr == NULL((void*)0)) { | ||||||
564 | return NULL((void*)0); | ||||||
565 | } | ||||||
566 | ret = PyArray_GenericAccumulateFunction((PyArrayObject *)arr, | ||||||
567 | n_ops.add, axis, | ||||||
568 | rtype, out); | ||||||
569 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
570 | return ret; | ||||||
571 | } | ||||||
572 | |||||||
573 | /*NUMPY_API | ||||||
574 | * CumProd | ||||||
575 | */ | ||||||
576 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
577 | PyArray_CumProd(PyArrayObject *self, int axis, int rtype, PyArrayObject *out) | ||||||
578 | { | ||||||
579 | PyObject *arr, *ret; | ||||||
580 | |||||||
581 | arr = PyArray_CheckAxis(self, &axis, 0); | ||||||
582 | if (arr == NULL((void*)0)) { | ||||||
583 | return NULL((void*)0); | ||||||
584 | } | ||||||
585 | |||||||
586 | ret = PyArray_GenericAccumulateFunction((PyArrayObject *)arr, | ||||||
587 | n_ops.multiply, axis, | ||||||
588 | rtype, out); | ||||||
589 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
590 | return ret; | ||||||
591 | } | ||||||
592 | |||||||
593 | /*NUMPY_API | ||||||
594 | * Round | ||||||
595 | */ | ||||||
596 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
597 | PyArray_Round(PyArrayObject *a, int decimals, PyArrayObject *out) | ||||||
598 | { | ||||||
599 | PyObject *f, *ret = NULL((void*)0), *tmp, *op1, *op2; | ||||||
600 | int ret_int=0; | ||||||
601 | PyArray_Descr *my_descr; | ||||||
602 | if (out && (PyArray_SIZE(out)PyArray_MultiplyList(PyArray_DIMS(out), PyArray_NDIM(out)) != PyArray_SIZE(a)PyArray_MultiplyList(PyArray_DIMS(a), PyArray_NDIM(a)))) { | ||||||
603 | PyErr_SetString(PyExc_ValueError, | ||||||
604 | "invalid output shape"); | ||||||
605 | return NULL((void*)0); | ||||||
606 | } | ||||||
607 | if (PyArray_ISCOMPLEX(a)(((PyArray_TYPE(a)) >= NPY_CFLOAT) && ((PyArray_TYPE (a)) <= NPY_CLONGDOUBLE))) { | ||||||
608 | PyObject *part; | ||||||
609 | PyObject *round_part; | ||||||
610 | PyObject *arr; | ||||||
611 | int res; | ||||||
612 | |||||||
613 | if (out) { | ||||||
614 | arr = (PyObject *)out; | ||||||
615 | Py_INCREF(arr)_Py_INCREF(((PyObject*)(arr))); | ||||||
616 | } | ||||||
617 | else { | ||||||
618 | arr = PyArray_Copy(a)PyArray_NewCopy(a, NPY_CORDER); | ||||||
619 | if (arr == NULL((void*)0)) { | ||||||
620 | return NULL((void*)0); | ||||||
621 | } | ||||||
622 | } | ||||||
623 | |||||||
624 | /* arr.real = a.real.round(decimals) */ | ||||||
625 | part = PyObject_GetAttrString((PyObject *)a, "real"); | ||||||
626 | if (part == NULL((void*)0)) { | ||||||
627 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
628 | return NULL((void*)0); | ||||||
629 | } | ||||||
630 | part = PyArray_EnsureAnyArray(part); | ||||||
631 | round_part = PyArray_Round((PyArrayObject *)part, | ||||||
632 | decimals, NULL((void*)0)); | ||||||
633 | Py_DECREF(part)_Py_DECREF(((PyObject*)(part))); | ||||||
634 | if (round_part == NULL((void*)0)) { | ||||||
635 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
636 | return NULL((void*)0); | ||||||
637 | } | ||||||
638 | res = PyObject_SetAttrString(arr, "real", round_part); | ||||||
639 | Py_DECREF(round_part)_Py_DECREF(((PyObject*)(round_part))); | ||||||
640 | if (res < 0) { | ||||||
641 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
642 | return NULL((void*)0); | ||||||
643 | } | ||||||
644 | |||||||
645 | /* arr.imag = a.imag.round(decimals) */ | ||||||
646 | part = PyObject_GetAttrString((PyObject *)a, "imag"); | ||||||
647 | if (part == NULL((void*)0)) { | ||||||
648 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
649 | return NULL((void*)0); | ||||||
650 | } | ||||||
651 | part = PyArray_EnsureAnyArray(part); | ||||||
652 | round_part = PyArray_Round((PyArrayObject *)part, | ||||||
653 | decimals, NULL((void*)0)); | ||||||
654 | Py_DECREF(part)_Py_DECREF(((PyObject*)(part))); | ||||||
655 | if (round_part == NULL((void*)0)) { | ||||||
656 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
657 | return NULL((void*)0); | ||||||
658 | } | ||||||
659 | res = PyObject_SetAttrString(arr, "imag", round_part); | ||||||
660 | Py_DECREF(round_part)_Py_DECREF(((PyObject*)(round_part))); | ||||||
661 | if (res < 0) { | ||||||
662 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
663 | return NULL((void*)0); | ||||||
664 | } | ||||||
665 | return arr; | ||||||
666 | } | ||||||
667 | /* do the most common case first */ | ||||||
668 | if (decimals >= 0) { | ||||||
669 | if (PyArray_ISINTEGER(a)(((PyArray_TYPE(a)) >= NPY_BYTE) && ((PyArray_TYPE (a)) <= NPY_ULONGLONG))) { | ||||||
670 | if (out) { | ||||||
671 | if (PyArray_AssignArray(out, a, | ||||||
672 | NULL((void*)0), NPY_DEFAULT_ASSIGN_CASTING) < 0) { | ||||||
673 | return NULL((void*)0); | ||||||
674 | } | ||||||
675 | Py_INCREF(out)_Py_INCREF(((PyObject*)(out))); | ||||||
676 | return (PyObject *)out; | ||||||
677 | } | ||||||
678 | else { | ||||||
679 | Py_INCREF(a)_Py_INCREF(((PyObject*)(a))); | ||||||
680 | return (PyObject *)a; | ||||||
681 | } | ||||||
682 | } | ||||||
683 | if (decimals == 0) { | ||||||
684 | if (out) { | ||||||
685 | return PyObject_CallFunction_PyObject_CallFunction_SizeT(n_ops.rint, "OO", a, out); | ||||||
686 | } | ||||||
687 | return PyObject_CallFunction_PyObject_CallFunction_SizeT(n_ops.rint, "O", a); | ||||||
688 | } | ||||||
689 | op1 = n_ops.multiply; | ||||||
690 | op2 = n_ops.true_divide; | ||||||
691 | } | ||||||
692 | else { | ||||||
693 | op1 = n_ops.true_divide; | ||||||
694 | op2 = n_ops.multiply; | ||||||
695 | decimals = -decimals; | ||||||
696 | } | ||||||
697 | if (!out) { | ||||||
698 | if (PyArray_ISINTEGER(a)(((PyArray_TYPE(a)) >= NPY_BYTE) && ((PyArray_TYPE (a)) <= NPY_ULONGLONG))) { | ||||||
699 | ret_int = 1; | ||||||
700 | my_descr = PyArray_DescrFromType(NPY_DOUBLE); | ||||||
701 | } | ||||||
702 | else { | ||||||
703 | Py_INCREF(PyArray_DESCR(a))_Py_INCREF(((PyObject*)(PyArray_DESCR(a)))); | ||||||
704 | my_descr = PyArray_DESCR(a); | ||||||
705 | } | ||||||
706 | out = (PyArrayObject *)PyArray_Empty(PyArray_NDIM(a), PyArray_DIMS(a), | ||||||
707 | my_descr, | ||||||
708 | PyArray_ISFORTRAN(a)(PyArray_CHKFLAGS(a, 0x0002) && (!PyArray_CHKFLAGS(a, 0x0001)))); | ||||||
709 | if (out == NULL((void*)0)) { | ||||||
710 | return NULL((void*)0); | ||||||
711 | } | ||||||
712 | } | ||||||
713 | else { | ||||||
714 | Py_INCREF(out)_Py_INCREF(((PyObject*)(out))); | ||||||
715 | } | ||||||
716 | f = PyFloat_FromDouble(power_of_ten(decimals)); | ||||||
717 | if (f == NULL((void*)0)) { | ||||||
718 | return NULL((void*)0); | ||||||
719 | } | ||||||
720 | ret = PyObject_CallFunction_PyObject_CallFunction_SizeT(op1, "OOO", a, f, out); | ||||||
721 | if (ret == NULL((void*)0)) { | ||||||
722 | goto finish; | ||||||
723 | } | ||||||
724 | tmp = PyObject_CallFunction_PyObject_CallFunction_SizeT(n_ops.rint, "OO", ret, ret); | ||||||
725 | if (tmp == NULL((void*)0)) { | ||||||
726 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); | ||||||
727 | ret = NULL((void*)0); | ||||||
728 | goto finish; | ||||||
729 | } | ||||||
730 | Py_DECREF(tmp)_Py_DECREF(((PyObject*)(tmp))); | ||||||
731 | tmp = PyObject_CallFunction_PyObject_CallFunction_SizeT(op2, "OOO", ret, f, ret); | ||||||
732 | if (tmp == NULL((void*)0)) { | ||||||
733 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); | ||||||
734 | ret = NULL((void*)0); | ||||||
735 | goto finish; | ||||||
736 | } | ||||||
737 | Py_DECREF(tmp)_Py_DECREF(((PyObject*)(tmp))); | ||||||
738 | |||||||
739 | finish: | ||||||
740 | Py_DECREF(f)_Py_DECREF(((PyObject*)(f))); | ||||||
741 | Py_DECREF(out)_Py_DECREF(((PyObject*)(out))); | ||||||
742 | if (ret_int) { | ||||||
743 | Py_INCREF(PyArray_DESCR(a))_Py_INCREF(((PyObject*)(PyArray_DESCR(a)))); | ||||||
744 | tmp = PyArray_CastToType((PyArrayObject *)ret, | ||||||
745 | PyArray_DESCR(a), PyArray_ISFORTRAN(a)(PyArray_CHKFLAGS(a, 0x0002) && (!PyArray_CHKFLAGS(a, 0x0001)))); | ||||||
746 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); | ||||||
747 | return tmp; | ||||||
748 | } | ||||||
749 | return ret; | ||||||
750 | } | ||||||
751 | |||||||
752 | |||||||
753 | /*NUMPY_API | ||||||
754 | * Mean | ||||||
755 | */ | ||||||
756 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
757 | PyArray_Mean(PyArrayObject *self, int axis, int rtype, PyArrayObject *out) | ||||||
758 | { | ||||||
759 | PyObject *obj1 = NULL((void*)0), *obj2 = NULL((void*)0), *ret; | ||||||
760 | PyArrayObject *arr; | ||||||
761 | |||||||
762 | arr = (PyArrayObject *)PyArray_CheckAxis(self, &axis, 0); | ||||||
763 | if (arr == NULL((void*)0)) { | ||||||
764 | return NULL((void*)0); | ||||||
765 | } | ||||||
766 | obj1 = PyArray_GenericReduceFunction(arr, n_ops.add, axis, | ||||||
767 | rtype, out); | ||||||
768 | obj2 = PyFloat_FromDouble((double)PyArray_DIM(arr,axis)); | ||||||
769 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
770 | if (obj1 == NULL((void*)0) || obj2 == NULL((void*)0)) { | ||||||
771 | Py_XDECREF(obj1)_Py_XDECREF(((PyObject*)(obj1))); | ||||||
772 | Py_XDECREF(obj2)_Py_XDECREF(((PyObject*)(obj2))); | ||||||
773 | return NULL((void*)0); | ||||||
774 | } | ||||||
775 | if (!out) { | ||||||
776 | ret = PyNumber_TrueDivide(obj1, obj2); | ||||||
777 | } | ||||||
778 | else { | ||||||
779 | ret = PyObject_CallFunction_PyObject_CallFunction_SizeT(n_ops.divide, "OOO", out, obj2, out); | ||||||
780 | } | ||||||
781 | Py_DECREF(obj1)_Py_DECREF(((PyObject*)(obj1))); | ||||||
782 | Py_DECREF(obj2)_Py_DECREF(((PyObject*)(obj2))); | ||||||
783 | return ret; | ||||||
784 | } | ||||||
785 | |||||||
786 | /*NUMPY_API | ||||||
787 | * Any | ||||||
788 | */ | ||||||
789 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
790 | PyArray_Any(PyArrayObject *self, int axis, PyArrayObject *out) | ||||||
791 | { | ||||||
792 | PyObject *arr, *ret; | ||||||
793 | |||||||
794 | arr = PyArray_CheckAxis(self, &axis, 0); | ||||||
795 | if (arr == NULL((void*)0)) { | ||||||
796 | return NULL((void*)0); | ||||||
797 | } | ||||||
798 | ret = PyArray_GenericReduceFunction((PyArrayObject *)arr, | ||||||
799 | n_ops.logical_or, axis, | ||||||
800 | NPY_BOOL, out); | ||||||
801 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
802 | return ret; | ||||||
803 | } | ||||||
804 | |||||||
805 | /*NUMPY_API | ||||||
806 | * All | ||||||
807 | */ | ||||||
808 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
809 | PyArray_All(PyArrayObject *self, int axis, PyArrayObject *out) | ||||||
810 | { | ||||||
811 | PyObject *arr, *ret; | ||||||
812 | |||||||
813 | arr = PyArray_CheckAxis(self, &axis, 0); | ||||||
814 | if (arr == NULL((void*)0)) { | ||||||
815 | return NULL((void*)0); | ||||||
816 | } | ||||||
817 | ret = PyArray_GenericReduceFunction((PyArrayObject *)arr, | ||||||
818 | n_ops.logical_and, axis, | ||||||
819 | NPY_BOOL, out); | ||||||
820 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | ||||||
821 | return ret; | ||||||
822 | } | ||||||
823 | |||||||
824 | |||||||
825 | static PyObject * | ||||||
826 | _GenericBinaryOutFunction(PyArrayObject *m1, PyObject *m2, PyArrayObject *out, | ||||||
827 | PyObject *op) | ||||||
828 | { | ||||||
829 | if (out == NULL((void*)0)) { | ||||||
830 | return PyObject_CallFunction_PyObject_CallFunction_SizeT(op, "OO", m1, m2); | ||||||
831 | } | ||||||
832 | else { | ||||||
833 | PyObject *args, *ret; | ||||||
834 | static PyObject *kw = NULL((void*)0); | ||||||
835 | |||||||
836 | if (kw == NULL((void*)0)) { | ||||||
837 | kw = Py_BuildValue_Py_BuildValue_SizeT("{s:s}", "casting", "unsafe"); | ||||||
838 | if (kw == NULL((void*)0)) { | ||||||
839 | return NULL((void*)0); | ||||||
840 | } | ||||||
841 | } | ||||||
842 | |||||||
843 | args = Py_BuildValue_Py_BuildValue_SizeT("OOO", m1, m2, out); | ||||||
844 | if (args == NULL((void*)0)) { | ||||||
845 | return NULL((void*)0); | ||||||
846 | } | ||||||
847 | |||||||
848 | ret = PyObject_Call(op, args, kw); | ||||||
849 | |||||||
850 | Py_DECREF(args)_Py_DECREF(((PyObject*)(args))); | ||||||
851 | |||||||
852 | return ret; | ||||||
853 | } | ||||||
854 | } | ||||||
855 | |||||||
856 | static PyObject * | ||||||
857 | _slow_array_clip(PyArrayObject *self, PyObject *min, PyObject *max, PyArrayObject *out) | ||||||
858 | { | ||||||
859 | PyObject *res1=NULL((void*)0), *res2=NULL((void*)0); | ||||||
860 | |||||||
861 | if (max != NULL((void*)0)) { | ||||||
862 | res1 = _GenericBinaryOutFunction(self, max, out, n_ops.minimum); | ||||||
863 | if (res1 == NULL((void*)0)) { | ||||||
864 | return NULL((void*)0); | ||||||
865 | } | ||||||
866 | } | ||||||
867 | else { | ||||||
868 | res1 = (PyObject *)self; | ||||||
869 | Py_INCREF(res1)_Py_INCREF(((PyObject*)(res1))); | ||||||
870 | } | ||||||
871 | |||||||
872 | if (min != NULL((void*)0)) { | ||||||
873 | res2 = _GenericBinaryOutFunction((PyArrayObject *)res1, | ||||||
874 | min, out, n_ops.maximum); | ||||||
875 | if (res2 == NULL((void*)0)) { | ||||||
876 | Py_XDECREF(res1)_Py_XDECREF(((PyObject*)(res1))); | ||||||
877 | return NULL((void*)0); | ||||||
878 | } | ||||||
879 | } | ||||||
880 | else { | ||||||
881 | res2 = res1; | ||||||
882 | Py_INCREF(res2)_Py_INCREF(((PyObject*)(res2))); | ||||||
883 | } | ||||||
884 | Py_DECREF(res1)_Py_DECREF(((PyObject*)(res1))); | ||||||
885 | return res2; | ||||||
886 | } | ||||||
887 | |||||||
888 | /*NUMPY_API | ||||||
889 | * Clip | ||||||
890 | */ | ||||||
891 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
892 | PyArray_Clip(PyArrayObject *self, PyObject *min, PyObject *max, PyArrayObject *out) | ||||||
893 | { | ||||||
894 | PyArray_FastClipFunc *func; | ||||||
895 | int outgood = 0, ingood = 0; | ||||||
896 | PyArrayObject *maxa = NULL((void*)0); | ||||||
897 | PyArrayObject *mina = NULL((void*)0); | ||||||
898 | PyArrayObject *newout = NULL((void*)0), *newin = NULL((void*)0); | ||||||
899 | PyArray_Descr *indescr = NULL((void*)0), *newdescr = NULL((void*)0); | ||||||
900 | char *max_data, *min_data; | ||||||
901 | PyObject *zero; | ||||||
902 | |||||||
903 | /* Treat None the same as NULL */ | ||||||
904 | if (min == Py_None(&_Py_NoneStruct)) { | ||||||
905 | min = NULL((void*)0); | ||||||
906 | } | ||||||
907 | if (max == Py_None(&_Py_NoneStruct)) { | ||||||
908 | max = NULL((void*)0); | ||||||
909 | } | ||||||
910 | |||||||
911 | if ((max == NULL((void*)0)) && (min == NULL((void*)0))) { | ||||||
912 | PyErr_SetString(PyExc_ValueError, | ||||||
913 | "array_clip: must set either max or min"); | ||||||
914 | return NULL((void*)0); | ||||||
915 | } | ||||||
916 | |||||||
917 | func = PyArray_DESCR(self)->f->fastclip; | ||||||
918 | if (func == NULL((void*)0)) { | ||||||
919 | if (min == NULL((void*)0)) { | ||||||
920 | return PyObject_CallFunctionObjArgs(n_ops.minimum, self, max, out, NULL((void*)0)); | ||||||
921 | } | ||||||
922 | else if (max == NULL((void*)0)) { | ||||||
923 | return PyObject_CallFunctionObjArgs(n_ops.maximum, self, min, out, NULL((void*)0)); | ||||||
924 | } | ||||||
925 | else { | ||||||
926 | return PyObject_CallFunctionObjArgs(n_ops.clip, self, min, max, out, NULL((void*)0)); | ||||||
927 | } | ||||||
928 | } | ||||||
929 | |||||||
930 | /* | ||||||
931 | * NumPy 1.17.0, 2019-02-24 | ||||||
932 | * NumPy 1.19.0, 2020-01-15 | ||||||
933 | * | ||||||
934 | * Setting `->f->fastclip to anything but NULL has been deprecated in 1.19 | ||||||
935 | * the code path below was previously deprecated since 1.17. | ||||||
936 | * (the deprecation moved to registration time instead of execution time) | ||||||
937 | * everything below can be removed once this deprecation completes | ||||||
938 | */ | ||||||
939 | |||||||
940 | if (func == NULL((void*)0) | ||||||
941 | || (min != NULL((void*)0) && !PyArray_CheckAnyScalar(min)(((((((PyObject*)(min))->ob_type) == (&PyFloat_Type) || PyType_IsSubtype((((PyObject*)(min))->ob_type), (&PyFloat_Type ))) || ((((PyObject*)(min))->ob_type) == (&PyComplex_Type ) || PyType_IsSubtype((((PyObject*)(min))->ob_type), (& PyComplex_Type))) || ((((((PyObject*)(min))->ob_type))-> tp_flags & ((1UL << 24))) != 0) || ((((PyObject*)(min ))->ob_type) == &PyBool_Type)) || ((((((PyObject*)(min ))->ob_type))->tp_flags & ((1UL << 27))) != 0 ) || ((((((PyObject*)(min))->ob_type))->tp_flags & ( (1UL << 28))) != 0)) || ((((((PyObject*)(min))->ob_type ) == (&PyGenericArrType_Type) || PyType_IsSubtype((((PyObject *)(min))->ob_type), (&PyGenericArrType_Type)))) || ((( ((PyObject*)(min))->ob_type) == (&PyArray_Type) || PyType_IsSubtype ((((PyObject*)(min))->ob_type), (&PyArray_Type))) && (PyArray_NDIM((PyArrayObject *)min) == 0))))) | ||||||
942 | || (max != NULL((void*)0) && !PyArray_CheckAnyScalar(max)(((((((PyObject*)(max))->ob_type) == (&PyFloat_Type) || PyType_IsSubtype((((PyObject*)(max))->ob_type), (&PyFloat_Type ))) || ((((PyObject*)(max))->ob_type) == (&PyComplex_Type ) || PyType_IsSubtype((((PyObject*)(max))->ob_type), (& PyComplex_Type))) || ((((((PyObject*)(max))->ob_type))-> tp_flags & ((1UL << 24))) != 0) || ((((PyObject*)(max ))->ob_type) == &PyBool_Type)) || ((((((PyObject*)(max ))->ob_type))->tp_flags & ((1UL << 27))) != 0 ) || ((((((PyObject*)(max))->ob_type))->tp_flags & ( (1UL << 28))) != 0)) || ((((((PyObject*)(max))->ob_type ) == (&PyGenericArrType_Type) || PyType_IsSubtype((((PyObject *)(max))->ob_type), (&PyGenericArrType_Type)))) || ((( ((PyObject*)(max))->ob_type) == (&PyArray_Type) || PyType_IsSubtype ((((PyObject*)(max))->ob_type), (&PyArray_Type))) && (PyArray_NDIM((PyArrayObject *)max) == 0))))) | ||||||
943 | || PyArray_ISBYTESWAPPED(self)(!((PyArray_DESCR(self)->byteorder) != '>')) | ||||||
944 | || (out && PyArray_ISBYTESWAPPED(out)(!((PyArray_DESCR(out)->byteorder) != '>')))) { | ||||||
945 | return _slow_array_clip(self, min, max, out); | ||||||
946 | } | ||||||
947 | /* Use the fast scalar clip function */ | ||||||
948 | |||||||
949 | /* First we need to figure out the correct type */ | ||||||
950 | if (min != NULL((void*)0)) { | ||||||
951 | indescr = PyArray_DescrFromObject(min, NULL((void*)0)); | ||||||
952 | if (indescr == NULL((void*)0)) { | ||||||
953 | goto fail; | ||||||
954 | } | ||||||
955 | } | ||||||
956 | if (max != NULL((void*)0)) { | ||||||
957 | newdescr = PyArray_DescrFromObject(max, indescr); | ||||||
958 | Py_XDECREF(indescr)_Py_XDECREF(((PyObject*)(indescr))); | ||||||
959 | indescr = NULL((void*)0); | ||||||
960 | if (newdescr == NULL((void*)0)) { | ||||||
961 | goto fail; | ||||||
962 | } | ||||||
963 | } | ||||||
964 | else { | ||||||
965 | /* Steal the reference */ | ||||||
966 | newdescr = indescr; | ||||||
967 | indescr = NULL((void*)0); | ||||||
968 | } | ||||||
969 | |||||||
970 | |||||||
971 | /* | ||||||
972 | * Use the scalar descriptor only if it is of a bigger | ||||||
973 | * KIND than the input array (and then find the | ||||||
974 | * type that matches both). | ||||||
975 | */ | ||||||
976 | if (PyArray_ScalarKind(newdescr->type_num, NULL((void*)0)) > | ||||||
977 | PyArray_ScalarKind(PyArray_DESCR(self)->type_num, NULL((void*)0))) { | ||||||
978 | indescr = PyArray_PromoteTypes(newdescr, PyArray_DESCR(self)); | ||||||
979 | if (indescr == NULL((void*)0)) { | ||||||
980 | goto fail; | ||||||
981 | } | ||||||
982 | func = indescr->f->fastclip; | ||||||
983 | if (func == NULL((void*)0)) { | ||||||
984 | Py_DECREF(indescr)_Py_DECREF(((PyObject*)(indescr))); | ||||||
985 | return _slow_array_clip(self, min, max, out); | ||||||
986 | } | ||||||
987 | } | ||||||
988 | else { | ||||||
989 | indescr = PyArray_DESCR(self); | ||||||
990 | Py_INCREF(indescr)_Py_INCREF(((PyObject*)(indescr))); | ||||||
991 | } | ||||||
992 | Py_DECREF(newdescr)_Py_DECREF(((PyObject*)(newdescr))); | ||||||
993 | newdescr = NULL((void*)0); | ||||||
994 | |||||||
995 | if (!PyDataType_ISNOTSWAPPED(indescr)((((PyArray_Descr *)(indescr))->byteorder) != '>')) { | ||||||
996 | PyArray_Descr *descr2; | ||||||
997 | descr2 = PyArray_DescrNewByteorder(indescr, '='); | ||||||
998 | Py_DECREF(indescr)_Py_DECREF(((PyObject*)(indescr))); | ||||||
999 | indescr = NULL((void*)0); | ||||||
1000 | if (descr2 == NULL((void*)0)) { | ||||||
1001 | goto fail; | ||||||
1002 | } | ||||||
1003 | indescr = descr2; | ||||||
1004 | } | ||||||
1005 | |||||||
1006 | /* Convert max to an array */ | ||||||
1007 | if (max != NULL((void*)0)) { | ||||||
1008 | Py_INCREF(indescr)_Py_INCREF(((PyObject*)(indescr))); | ||||||
1009 | maxa = (PyArrayObject *)PyArray_FromAny(max, indescr, 0, 0, | ||||||
1010 | NPY_ARRAY_DEFAULT((0x0001 | (0x0100 | 0x0400))), NULL((void*)0)); | ||||||
1011 | if (maxa == NULL((void*)0)) { | ||||||
1012 | goto fail; | ||||||
1013 | } | ||||||
1014 | } | ||||||
1015 | |||||||
1016 | /* | ||||||
1017 | * If we are unsigned, then make sure min is not < 0 | ||||||
1018 | * This is to match the behavior of _slow_array_clip | ||||||
1019 | * | ||||||
1020 | * We allow min and max to go beyond the limits | ||||||
1021 | * for other data-types in which case they | ||||||
1022 | * are interpreted as their modular counterparts. | ||||||
1023 | */ | ||||||
1024 | if (min != NULL((void*)0)) { | ||||||
1025 | if (PyArray_ISUNSIGNED(self)(((PyArray_TYPE(self)) == NPY_UBYTE) || ((PyArray_TYPE(self)) == NPY_USHORT) || ((PyArray_TYPE(self)) == NPY_UINT) || ((PyArray_TYPE (self)) == NPY_ULONG) || ((PyArray_TYPE(self)) == NPY_ULONGLONG ))) { | ||||||
1026 | int cmp; | ||||||
1027 | zero = PyLong_FromLong(0); | ||||||
1028 | cmp = PyObject_RichCompareBool(min, zero, Py_LT0); | ||||||
1029 | if (cmp == -1) { | ||||||
1030 | Py_DECREF(zero)_Py_DECREF(((PyObject*)(zero))); | ||||||
1031 | goto fail; | ||||||
1032 | } | ||||||
1033 | if (cmp == 1) { | ||||||
1034 | min = zero; | ||||||
1035 | } | ||||||
1036 | else { | ||||||
1037 | Py_DECREF(zero)_Py_DECREF(((PyObject*)(zero))); | ||||||
1038 | Py_INCREF(min)_Py_INCREF(((PyObject*)(min))); | ||||||
1039 | } | ||||||
1040 | } | ||||||
1041 | else { | ||||||
1042 | Py_INCREF(min)_Py_INCREF(((PyObject*)(min))); | ||||||
1043 | } | ||||||
1044 | |||||||
1045 | /* Convert min to an array */ | ||||||
1046 | Py_INCREF(indescr)_Py_INCREF(((PyObject*)(indescr))); | ||||||
1047 | mina = (PyArrayObject *)PyArray_FromAny(min, indescr, 0, 0, | ||||||
1048 | NPY_ARRAY_DEFAULT((0x0001 | (0x0100 | 0x0400))), NULL((void*)0)); | ||||||
1049 | Py_DECREF(min)_Py_DECREF(((PyObject*)(min))); | ||||||
1050 | if (mina == NULL((void*)0)) { | ||||||
1051 | goto fail; | ||||||
1052 | } | ||||||
1053 | } | ||||||
1054 | |||||||
1055 | /* | ||||||
1056 | * Check to see if input is single-segment, aligned, | ||||||
1057 | * and in native byteorder | ||||||
1058 | */ | ||||||
1059 | if (PyArray_ISONESEGMENT(self)(PyArray_CHKFLAGS(self, 0x0001) || PyArray_CHKFLAGS(self, 0x0002 )) && | ||||||
1060 | PyArray_CHKFLAGS(self, NPY_ARRAY_ALIGNED0x0100) && | ||||||
1061 | PyArray_ISNOTSWAPPED(self)((PyArray_DESCR(self)->byteorder) != '>') && | ||||||
1062 | (PyArray_DESCR(self) == indescr)) { | ||||||
1063 | ingood = 1; | ||||||
1064 | } | ||||||
1065 | if (!ingood) { | ||||||
1066 | int flags; | ||||||
1067 | |||||||
1068 | if (PyArray_ISFORTRAN(self)(PyArray_CHKFLAGS(self, 0x0002) && (!PyArray_CHKFLAGS (self, 0x0001)))) { | ||||||
1069 | flags = NPY_ARRAY_FARRAY(0x0002 | (0x0100 | 0x0400)); | ||||||
1070 | } | ||||||
1071 | else { | ||||||
1072 | flags = NPY_ARRAY_CARRAY(0x0001 | (0x0100 | 0x0400)); | ||||||
1073 | } | ||||||
1074 | Py_INCREF(indescr)_Py_INCREF(((PyObject*)(indescr))); | ||||||
1075 | newin = (PyArrayObject *)PyArray_FromArray(self, indescr, flags); | ||||||
1076 | if (newin == NULL((void*)0)) { | ||||||
1077 | goto fail; | ||||||
1078 | } | ||||||
1079 | } | ||||||
1080 | else { | ||||||
1081 | newin = self; | ||||||
1082 | Py_INCREF(newin)_Py_INCREF(((PyObject*)(newin))); | ||||||
1083 | } | ||||||
1084 | |||||||
1085 | /* | ||||||
1086 | * At this point, newin is a single-segment, aligned, and correct | ||||||
1087 | * byte-order array of the correct type | ||||||
1088 | * | ||||||
1089 | * if ingood == 0, then it is a copy, otherwise, | ||||||
1090 | * it is the original input. | ||||||
1091 | */ | ||||||
1092 | |||||||
1093 | /* | ||||||
1094 | * If we have already made a copy of the data, then use | ||||||
1095 | * that as the output array | ||||||
1096 | */ | ||||||
1097 | if (out == NULL((void*)0) && !ingood) { | ||||||
1098 | out = newin; | ||||||
1099 | } | ||||||
1100 | |||||||
1101 | /* | ||||||
1102 | * Now, we know newin is a usable array for fastclip, | ||||||
1103 | * we need to make sure the output array is available | ||||||
1104 | * and usable | ||||||
1105 | */ | ||||||
1106 | if (out == NULL((void*)0)) { | ||||||
1107 | Py_INCREF(indescr)_Py_INCREF(((PyObject*)(indescr))); | ||||||
1108 | out = (PyArrayObject*)PyArray_NewFromDescr(Py_TYPE(self)(((PyObject*)(self))->ob_type), | ||||||
1109 | indescr, PyArray_NDIM(self), | ||||||
1110 | PyArray_DIMS(self), | ||||||
1111 | NULL((void*)0), NULL((void*)0), | ||||||
1112 | PyArray_ISFORTRAN(self)(PyArray_CHKFLAGS(self, 0x0002) && (!PyArray_CHKFLAGS (self, 0x0001))), | ||||||
1113 | (PyObject *)self); | ||||||
1114 | if (out == NULL((void*)0)) { | ||||||
1115 | goto fail; | ||||||
1116 | } | ||||||
1117 | |||||||
1118 | outgood = 1; | ||||||
1119 | } | ||||||
1120 | else Py_INCREF(out)_Py_INCREF(((PyObject*)(out))); | ||||||
1121 | /* Input is good at this point */ | ||||||
1122 | if (out == newin) { | ||||||
1123 | outgood = 1; | ||||||
1124 | } | ||||||
1125 | |||||||
1126 | |||||||
1127 | /* make sure the shape of the output array is the same */ | ||||||
1128 | if (!PyArray_SAMESHAPE(newin, out)((PyArray_NDIM(newin) == PyArray_NDIM(out)) && PyArray_CompareLists (PyArray_DIMS(newin), PyArray_DIMS(out), PyArray_NDIM(newin)) )) { | ||||||
1129 | PyErr_SetString(PyExc_ValueError, "clip: Output array must have the" | ||||||
1130 | "same shape as the input."); | ||||||
1131 | goto fail; | ||||||
1132 | } | ||||||
1133 | |||||||
1134 | if (!outgood && PyArray_EQUIVALENTLY_ITERABLE(( ( PyArray_NDIM(self) == PyArray_NDIM(out) && PyArray_CompareLists (PyArray_DIMS(self), PyArray_DIMS(out), PyArray_NDIM(self)) && (PyArray_FLAGS(self)&(0x0001| 0x0002)) & (PyArray_FLAGS (out)&(0x0001| 0x0002)) ) && PyArray_EQUIVALENTLY_ITERABLE_OVERLAP_OK ( self, out, 1, 0)) | ||||||
1135 | self, out, PyArray_TRIVIALLY_ITERABLE_OP_READ,( ( PyArray_NDIM(self) == PyArray_NDIM(out) && PyArray_CompareLists (PyArray_DIMS(self), PyArray_DIMS(out), PyArray_NDIM(self)) && (PyArray_FLAGS(self)&(0x0001| 0x0002)) & (PyArray_FLAGS (out)&(0x0001| 0x0002)) ) && PyArray_EQUIVALENTLY_ITERABLE_OVERLAP_OK ( self, out, 1, 0)) | ||||||
1136 | PyArray_TRIVIALLY_ITERABLE_OP_NOREAD)( ( PyArray_NDIM(self) == PyArray_NDIM(out) && PyArray_CompareLists (PyArray_DIMS(self), PyArray_DIMS(out), PyArray_NDIM(self)) && (PyArray_FLAGS(self)&(0x0001| 0x0002)) & (PyArray_FLAGS (out)&(0x0001| 0x0002)) ) && PyArray_EQUIVALENTLY_ITERABLE_OVERLAP_OK ( self, out, 1, 0)) && | ||||||
1137 | PyArray_CHKFLAGS(out, NPY_ARRAY_ALIGNED0x0100) && | ||||||
1138 | PyArray_ISNOTSWAPPED(out)((PyArray_DESCR(out)->byteorder) != '>') && | ||||||
1139 | PyArray_EquivTypes(PyArray_DESCR(out), indescr)) { | ||||||
1140 | outgood = 1; | ||||||
1141 | } | ||||||
1142 | |||||||
1143 | /* | ||||||
1144 | * Do we still not have a suitable output array? | ||||||
1145 | * Create one, now. No matter why the array is not suitable a copy has | ||||||
1146 | * to be made. This may be just to avoid memory overlap though. | ||||||
1147 | */ | ||||||
1148 | if (!outgood) { | ||||||
1149 | int oflags; | ||||||
1150 | if (PyArray_ISFORTRAN(self)(PyArray_CHKFLAGS(self, 0x0002) && (!PyArray_CHKFLAGS (self, 0x0001)))) { | ||||||
1151 | oflags = NPY_ARRAY_FARRAY(0x0002 | (0x0100 | 0x0400)); | ||||||
1152 | } | ||||||
1153 | else { | ||||||
1154 | oflags = NPY_ARRAY_CARRAY(0x0001 | (0x0100 | 0x0400)); | ||||||
1155 | } | ||||||
1156 | oflags |= (NPY_ARRAY_WRITEBACKIFCOPY0x2000 | NPY_ARRAY_FORCECAST0x0010 | | ||||||
1157 | NPY_ARRAY_ENSURECOPY0x0020); | ||||||
1158 | Py_INCREF(indescr)_Py_INCREF(((PyObject*)(indescr))); | ||||||
1159 | newout = (PyArrayObject*)PyArray_FromArray(out, indescr, oflags); | ||||||
1160 | if (newout == NULL((void*)0)) { | ||||||
1161 | goto fail; | ||||||
1162 | } | ||||||
1163 | } | ||||||
1164 | else { | ||||||
1165 | newout = out; | ||||||
1166 | Py_INCREF(newout)_Py_INCREF(((PyObject*)(newout))); | ||||||
1167 | } | ||||||
1168 | |||||||
1169 | /* Now we can call the fast-clip function */ | ||||||
1170 | min_data = max_data = NULL((void*)0); | ||||||
1171 | if (mina != NULL((void*)0)) { | ||||||
1172 | min_data = PyArray_DATA(mina); | ||||||
1173 | } | ||||||
1174 | if (maxa != NULL((void*)0)) { | ||||||
1175 | max_data = PyArray_DATA(maxa); | ||||||
1176 | } | ||||||
1177 | func(PyArray_DATA(newin), PyArray_SIZE(newin)PyArray_MultiplyList(PyArray_DIMS(newin), PyArray_NDIM(newin) ), min_data, max_data, PyArray_DATA(newout)); | ||||||
1178 | |||||||
1179 | /* Clean up temporary variables */ | ||||||
1180 | Py_XDECREF(indescr)_Py_XDECREF(((PyObject*)(indescr))); | ||||||
1181 | Py_XDECREF(newdescr)_Py_XDECREF(((PyObject*)(newdescr))); | ||||||
1182 | Py_XDECREF(mina)_Py_XDECREF(((PyObject*)(mina))); | ||||||
1183 | Py_XDECREF(maxa)_Py_XDECREF(((PyObject*)(maxa))); | ||||||
1184 | Py_DECREF(newin)_Py_DECREF(((PyObject*)(newin))); | ||||||
1185 | /* Copy back into out if out was not already a nice array. */ | ||||||
1186 | PyArray_ResolveWritebackIfCopy(newout); | ||||||
1187 | Py_DECREF(newout)_Py_DECREF(((PyObject*)(newout))); | ||||||
1188 | return (PyObject *)out; | ||||||
1189 | |||||||
1190 | fail: | ||||||
1191 | Py_XDECREF(indescr)_Py_XDECREF(((PyObject*)(indescr))); | ||||||
1192 | Py_XDECREF(newdescr)_Py_XDECREF(((PyObject*)(newdescr))); | ||||||
1193 | Py_XDECREF(maxa)_Py_XDECREF(((PyObject*)(maxa))); | ||||||
1194 | Py_XDECREF(mina)_Py_XDECREF(((PyObject*)(mina))); | ||||||
1195 | Py_XDECREF(newin)_Py_XDECREF(((PyObject*)(newin))); | ||||||
1196 | PyArray_DiscardWritebackIfCopy(newout); | ||||||
1197 | Py_XDECREF(newout)_Py_XDECREF(((PyObject*)(newout))); | ||||||
1198 | return NULL((void*)0); | ||||||
1199 | } | ||||||
1200 | |||||||
1201 | |||||||
1202 | /*NUMPY_API | ||||||
1203 | * Conjugate | ||||||
1204 | */ | ||||||
1205 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
1206 | PyArray_Conjugate(PyArrayObject *self, PyArrayObject *out) | ||||||
1207 | { | ||||||
1208 | if (PyArray_ISCOMPLEX(self)(((PyArray_TYPE(self)) >= NPY_CFLOAT) && ((PyArray_TYPE (self)) <= NPY_CLONGDOUBLE)) || PyArray_ISOBJECT(self)((PyArray_TYPE(self)) == NPY_OBJECT) || | ||||||
1209 | PyArray_ISUSERDEF(self)(((PyArray_TYPE(self)) >= NPY_USERDEF) && ((PyArray_TYPE (self)) < NPY_USERDEF+ NPY_NUMUSERTYPES))) { | ||||||
1210 | if (out == NULL((void*)0)) { | ||||||
1211 | return PyArray_GenericUnaryFunction(self, | ||||||
1212 | n_ops.conjugate); | ||||||
1213 | } | ||||||
1214 | else { | ||||||
1215 | return PyArray_GenericBinaryFunction((PyObject *)self, | ||||||
1216 | (PyObject *)out, | ||||||
1217 | n_ops.conjugate); | ||||||
1218 | } | ||||||
1219 | } | ||||||
1220 | else { | ||||||
1221 | PyArrayObject *ret; | ||||||
1222 | if (!PyArray_ISNUMBER(self)(((PyArray_TYPE(self)) <= NPY_CLONGDOUBLE) || ((PyArray_TYPE (self)) == NPY_HALF))) { | ||||||
1223 | /* 2017-05-04, 1.13 */ | ||||||
1224 | if (DEPRECATE("attempting to conjugate non-numeric dtype; this "PyErr_WarnEx(PyExc_DeprecationWarning,"attempting to conjugate non-numeric dtype; this " "will error in the future to match the behavior of " "np.conjugate" ,1) | ||||||
1225 | "will error in the future to match the behavior of "PyErr_WarnEx(PyExc_DeprecationWarning,"attempting to conjugate non-numeric dtype; this " "will error in the future to match the behavior of " "np.conjugate" ,1) | ||||||
1226 | "np.conjugate")PyErr_WarnEx(PyExc_DeprecationWarning,"attempting to conjugate non-numeric dtype; this " "will error in the future to match the behavior of " "np.conjugate" ,1) < 0) { | ||||||
1227 | return NULL((void*)0); | ||||||
1228 | } | ||||||
1229 | } | ||||||
1230 | if (out) { | ||||||
1231 | if (PyArray_AssignArray(out, self, | ||||||
1232 | NULL((void*)0), NPY_DEFAULT_ASSIGN_CASTING) < 0) { | ||||||
1233 | return NULL((void*)0); | ||||||
1234 | } | ||||||
1235 | ret = out; | ||||||
1236 | } | ||||||
1237 | else { | ||||||
1238 | ret = self; | ||||||
1239 | } | ||||||
1240 | Py_INCREF(ret)_Py_INCREF(((PyObject*)(ret))); | ||||||
1241 | return (PyObject *)ret; | ||||||
1242 | } | ||||||
1243 | } | ||||||
1244 | |||||||
1245 | /*NUMPY_API | ||||||
1246 | * Trace | ||||||
1247 | */ | ||||||
1248 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||||
1249 | PyArray_Trace(PyArrayObject *self, int offset, int axis1, int axis2, | ||||||
1250 | int rtype, PyArrayObject *out) | ||||||
1251 | { | ||||||
1252 | PyObject *diag = NULL((void*)0), *ret = NULL((void*)0); | ||||||
1253 | |||||||
1254 | diag = PyArray_Diagonal(self, offset, axis1, axis2); | ||||||
1255 | if (diag == NULL((void*)0)) { | ||||||
1256 | return NULL((void*)0); | ||||||
1257 | } | ||||||
1258 | ret = PyArray_GenericReduceFunction((PyArrayObject *)diag, n_ops.add, -1, rtype, out); | ||||||
1259 | Py_DECREF(diag)_Py_DECREF(((PyObject*)(diag))); | ||||||
1260 | return ret; | ||||||
1261 | } |
1 | #ifndef PyNumber_Subtract |
2 | struct _object; |
3 | typedef struct _object PyObject; |
4 | PyObject* clang_analyzer_PyObject_New_Reference(); |
5 | PyObject* PyNumber_Subtract(PyObject *o1, PyObject *o2) { |
6 | return clang_analyzer_PyObject_New_Reference(); |
7 | } |
8 | #else |
9 | #warning "API PyNumber_Subtract is defined as a macro." |
10 | #endif |
1 | #define PY_SSIZE_T_CLEAN |
2 | #include <Python.h> |
3 | #include "structmember.h" |
4 | |
5 | #define NPY_NO_DEPRECATED_API0x0000000E NPY_API_VERSION0x0000000E |
6 | #define _MULTIARRAYMODULE |
7 | #include "numpy/arrayobject.h" |
8 | #include "numpy/arrayscalars.h" |
9 | |
10 | #include "numpy/npy_math.h" |
11 | |
12 | #include "npy_config.h" |
13 | |
14 | #include "npy_ctypes.h" |
15 | #include "npy_pycompat.h" |
16 | #include "multiarraymodule.h" |
17 | |
18 | #include "common.h" |
19 | #include "ctors.h" |
20 | #include "convert_datatype.h" |
21 | #include "shape.h" |
22 | #include "npy_buffer.h" |
23 | #include "lowlevel_strided_loops.h" |
24 | #include "_datetime.h" |
25 | #include "datetime_strings.h" |
26 | #include "array_assign.h" |
27 | #include "mapping.h" /* for array_item_asarray */ |
28 | #include "templ_common.h" /* for npy_mul_with_overflow_intp */ |
29 | #include "alloc.h" |
30 | #include <assert.h> |
31 | |
32 | #include "get_attr_string.h" |
33 | #include "array_coercion.h" |
34 | |
35 | /* |
36 | * Reading from a file or a string. |
37 | * |
38 | * As much as possible, we try to use the same code for both files and strings, |
39 | * so the semantics for fromstring and fromfile are the same, especially with |
40 | * regards to the handling of text representations. |
41 | */ |
42 | |
43 | /* |
44 | * Scanning function for next element parsing and separator skipping. |
45 | * These functions return: |
46 | * - 0 to indicate more data to read |
47 | * - -1 when reading stopped at the end of the string/file |
48 | * - -2 when reading stopped before the end was reached. |
49 | * |
50 | * The dtype specific parsing functions may set the python error state |
51 | * (they have to get the GIL first) additionally. |
52 | */ |
53 | typedef int (*next_element)(void **, void *, PyArray_Descr *, void *); |
54 | typedef int (*skip_separator)(void **, const char *, void *); |
55 | |
56 | |
57 | static npy_bool |
58 | string_is_fully_read(char const* start, char const* end) { |
59 | if (end == NULL((void*)0)) { |
60 | return *start == '\0'; /* null terminated */ |
61 | } |
62 | else { |
63 | return start >= end; /* fixed length */ |
64 | } |
65 | } |
66 | |
67 | |
68 | static int |
69 | fromstr_next_element(char **s, void *dptr, PyArray_Descr *dtype, |
70 | const char *end) |
71 | { |
72 | char *e = *s; |
73 | int r = dtype->f->fromstr(*s, dptr, &e, dtype); |
74 | /* |
75 | * fromstr always returns 0 for basic dtypes; s points to the end of the |
76 | * parsed string. If s is not changed an error occurred or the end was |
77 | * reached. |
78 | */ |
79 | if (*s == e || r < 0) { |
80 | /* Nothing read, could be end of string or an error (or both) */ |
81 | if (string_is_fully_read(*s, end)) { |
82 | return -1; |
83 | } |
84 | return -2; |
85 | } |
86 | *s = e; |
87 | if (end != NULL((void*)0) && *s > end) { |
88 | /* Stop the iteration if we read far enough */ |
89 | return -1; |
90 | } |
91 | return 0; |
92 | } |
93 | |
94 | static int |
95 | fromfile_next_element(FILE **fp, void *dptr, PyArray_Descr *dtype, |
96 | void *NPY_UNUSED(stream_data)(__NPY_UNUSED_TAGGEDstream_data) __attribute__ ((__unused__))) |
97 | { |
98 | /* the NULL argument is for backwards-compatibility */ |
99 | int r = dtype->f->scanfunc(*fp, dptr, NULL((void*)0), dtype); |
100 | /* r can be EOF or the number of items read (0 or 1) */ |
101 | if (r == 1) { |
102 | return 0; |
103 | } |
104 | else if (r == EOF(-1)) { |
105 | return -1; |
106 | } |
107 | else { |
108 | /* unable to read more, but EOF not reached indicating an error. */ |
109 | return -2; |
110 | } |
111 | } |
112 | |
113 | /* |
114 | * Remove multiple whitespace from the separator, and add a space to the |
115 | * beginning and end. This simplifies the separator-skipping code below. |
116 | */ |
117 | static char * |
118 | swab_separator(const char *sep) |
119 | { |
120 | int skip_space = 0; |
121 | char *s, *start; |
122 | |
123 | s = start = malloc(strlen(sep)+3); |
124 | if (s == NULL((void*)0)) { |
125 | PyErr_NoMemory(); |
126 | return NULL((void*)0); |
127 | } |
128 | /* add space to front if there isn't one */ |
129 | if (*sep != '\0' && !isspace(*sep)((*__ctype_b_loc ())[(int) ((*sep))] & (unsigned short int ) _ISspace)) { |
130 | *s = ' '; s++; |
131 | } |
132 | while (*sep != '\0') { |
133 | if (isspace(*sep)((*__ctype_b_loc ())[(int) ((*sep))] & (unsigned short int ) _ISspace)) { |
134 | if (skip_space) { |
135 | sep++; |
136 | } |
137 | else { |
138 | *s = ' '; |
139 | s++; |
140 | sep++; |
141 | skip_space = 1; |
142 | } |
143 | } |
144 | else { |
145 | *s = *sep; |
146 | s++; |
147 | sep++; |
148 | skip_space = 0; |
149 | } |
150 | } |
151 | /* add space to end if there isn't one */ |
152 | if (s != start && s[-1] == ' ') { |
153 | *s = ' '; |
154 | s++; |
155 | } |
156 | *s = '\0'; |
157 | return start; |
158 | } |
159 | |
160 | /* |
161 | * Assuming that the separator is the next bit in the string (file), skip it. |
162 | * |
163 | * Single spaces in the separator are matched to arbitrary-long sequences |
164 | * of whitespace in the input. If the separator consists only of spaces, |
165 | * it matches one or more whitespace characters. |
166 | * |
167 | * If we can't match the separator, return -2. |
168 | * If we hit the end of the string (file), return -1. |
169 | * Otherwise, return 0. |
170 | */ |
171 | static int |
172 | fromstr_skip_separator(char **s, const char *sep, const char *end) |
173 | { |
174 | char *string = *s; |
175 | int result = 0; |
176 | |
177 | while (1) { |
178 | char c = *string; |
179 | if (string_is_fully_read(string, end)) { |
180 | result = -1; |
181 | break; |
182 | } |
183 | else if (*sep == '\0') { |
184 | if (string != *s) { |
185 | /* matched separator */ |
186 | result = 0; |
187 | break; |
188 | } |
189 | else { |
190 | /* separator was whitespace wildcard that didn't match */ |
191 | result = -2; |
192 | break; |
193 | } |
194 | } |
195 | else if (*sep == ' ') { |
196 | /* whitespace wildcard */ |
197 | if (!isspace(c)((*__ctype_b_loc ())[(int) ((c))] & (unsigned short int) _ISspace )) { |
198 | sep++; |
199 | continue; |
200 | } |
201 | } |
202 | else if (*sep != c) { |
203 | result = -2; |
204 | break; |
205 | } |
206 | else { |
207 | sep++; |
208 | } |
209 | string++; |
210 | } |
211 | *s = string; |
212 | return result; |
213 | } |
214 | |
215 | static int |
216 | fromfile_skip_separator(FILE **fp, const char *sep, void *NPY_UNUSED(stream_data)(__NPY_UNUSED_TAGGEDstream_data) __attribute__ ((__unused__))) |
217 | { |
218 | int result = 0; |
219 | const char *sep_start = sep; |
220 | |
221 | while (1) { |
222 | int c = fgetc(*fp); |
223 | |
224 | if (c == EOF(-1)) { |
225 | result = -1; |
226 | break; |
227 | } |
228 | else if (*sep == '\0') { |
229 | ungetc(c, *fp); |
230 | if (sep != sep_start) { |
231 | /* matched separator */ |
232 | result = 0; |
233 | break; |
234 | } |
235 | else { |
236 | /* separator was whitespace wildcard that didn't match */ |
237 | result = -2; |
238 | break; |
239 | } |
240 | } |
241 | else if (*sep == ' ') { |
242 | /* whitespace wildcard */ |
243 | if (!isspace(c)((*__ctype_b_loc ())[(int) ((c))] & (unsigned short int) _ISspace )) { |
244 | sep++; |
245 | sep_start++; |
246 | ungetc(c, *fp); |
247 | } |
248 | else if (sep == sep_start) { |
249 | sep_start--; |
250 | } |
251 | } |
252 | else if (*sep != c) { |
253 | ungetc(c, *fp); |
254 | result = -2; |
255 | break; |
256 | } |
257 | else { |
258 | sep++; |
259 | } |
260 | } |
261 | return result; |
262 | } |
263 | |
264 | /* |
265 | * Change a sub-array field to the base descriptor |
266 | * and update the dimensions and strides |
267 | * appropriately. Dimensions and strides are added |
268 | * to the end. |
269 | * |
270 | * Strides are only added if given (because data is given). |
271 | */ |
272 | static int |
273 | _update_descr_and_dimensions(PyArray_Descr **des, npy_intp *newdims, |
274 | npy_intp *newstrides, int oldnd) |
275 | { |
276 | PyArray_Descr *old; |
277 | int newnd; |
278 | int numnew; |
279 | npy_intp *mydim; |
280 | int i; |
281 | int tuple; |
282 | |
283 | old = *des; |
284 | *des = old->subarray->base; |
285 | |
286 | |
287 | mydim = newdims + oldnd; |
288 | tuple = PyTuple_Check(old->subarray->shape)((((((PyObject*)(old->subarray->shape))->ob_type))-> tp_flags & ((1UL << 26))) != 0); |
289 | if (tuple) { |
290 | numnew = PyTuple_GET_SIZE(old->subarray->shape)(((PyVarObject*)((((void) (0)), (PyTupleObject *)(old->subarray ->shape))))->ob_size); |
291 | } |
292 | else { |
293 | numnew = 1; |
294 | } |
295 | |
296 | |
297 | newnd = oldnd + numnew; |
298 | if (newnd > NPY_MAXDIMS32) { |
299 | goto finish; |
300 | } |
301 | if (tuple) { |
302 | for (i = 0; i < numnew; i++) { |
303 | mydim[i] = (npy_intp) PyLong_AsLong( |
304 | PyTuple_GET_ITEM(old->subarray->shape, i)((((void) (0)), (PyTupleObject *)(old->subarray->shape) )->ob_item[i])); |
305 | } |
306 | } |
307 | else { |
308 | mydim[0] = (npy_intp) PyLong_AsLong(old->subarray->shape); |
309 | } |
310 | |
311 | if (newstrides) { |
312 | npy_intp tempsize; |
313 | npy_intp *mystrides; |
314 | |
315 | mystrides = newstrides + oldnd; |
316 | /* Make new strides -- always C-contiguous */ |
317 | tempsize = (*des)->elsize; |
318 | for (i = numnew - 1; i >= 0; i--) { |
319 | mystrides[i] = tempsize; |
320 | tempsize *= mydim[i] ? mydim[i] : 1; |
321 | } |
322 | } |
323 | |
324 | finish: |
325 | Py_INCREF(*des)_Py_INCREF(((PyObject*)(*des))); |
326 | Py_DECREF(old)_Py_DECREF(((PyObject*)(old))); |
327 | return newnd; |
328 | } |
329 | |
330 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) void |
331 | _unaligned_strided_byte_copy(char *dst, npy_intp outstrides, char *src, |
332 | npy_intp instrides, npy_intp N, int elsize) |
333 | { |
334 | npy_intp i; |
335 | char *tout = dst; |
336 | char *tin = src; |
337 | |
338 | #define _COPY_N_SIZE(size) \ |
339 | for(i=0; i<N; i++) { \ |
340 | memcpy(tout, tin, size); \ |
341 | tin += instrides; \ |
342 | tout += outstrides; \ |
343 | } \ |
344 | return |
345 | |
346 | switch(elsize) { |
347 | case 8: |
348 | _COPY_N_SIZE(8); |
349 | case 4: |
350 | _COPY_N_SIZE(4); |
351 | case 1: |
352 | _COPY_N_SIZE(1); |
353 | case 2: |
354 | _COPY_N_SIZE(2); |
355 | case 16: |
356 | _COPY_N_SIZE(16); |
357 | default: |
358 | _COPY_N_SIZE(elsize); |
359 | } |
360 | #undef _COPY_N_SIZE |
361 | |
362 | } |
363 | |
364 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) void |
365 | _strided_byte_swap(void *p, npy_intp stride, npy_intp n, int size) |
366 | { |
367 | char *a, *b, c = 0; |
368 | int j, m; |
369 | |
370 | switch(size) { |
371 | case 1: /* no byteswap necessary */ |
372 | break; |
373 | case 4: |
374 | if (npy_is_aligned((void*)((npy_intp)p | stride), sizeof(npy_uint32))) { |
375 | for (a = (char*)p; n > 0; n--, a += stride) { |
376 | npy_uint32 * a_ = (npy_uint32 *)a; |
377 | *a_ = npy_bswap4(*a_); |
378 | } |
379 | } |
380 | else { |
381 | for (a = (char*)p; n > 0; n--, a += stride) { |
382 | npy_bswap4_unaligned(a); |
383 | } |
384 | } |
385 | break; |
386 | case 8: |
387 | if (npy_is_aligned((void*)((npy_intp)p | stride), sizeof(npy_uint64))) { |
388 | for (a = (char*)p; n > 0; n--, a += stride) { |
389 | npy_uint64 * a_ = (npy_uint64 *)a; |
390 | *a_ = npy_bswap8(*a_); |
391 | } |
392 | } |
393 | else { |
394 | for (a = (char*)p; n > 0; n--, a += stride) { |
395 | npy_bswap8_unaligned(a); |
396 | } |
397 | } |
398 | break; |
399 | case 2: |
400 | if (npy_is_aligned((void*)((npy_intp)p | stride), sizeof(npy_uint16))) { |
401 | for (a = (char*)p; n > 0; n--, a += stride) { |
402 | npy_uint16 * a_ = (npy_uint16 *)a; |
403 | *a_ = npy_bswap2(*a_); |
404 | } |
405 | } |
406 | else { |
407 | for (a = (char*)p; n > 0; n--, a += stride) { |
408 | npy_bswap2_unaligned(a); |
409 | } |
410 | } |
411 | break; |
412 | default: |
413 | m = size/2; |
414 | for (a = (char *)p; n > 0; n--, a += stride - m) { |
415 | b = a + (size - 1); |
416 | for (j = 0; j < m; j++) { |
417 | c=*a; *a++ = *b; *b-- = c; |
418 | } |
419 | } |
420 | break; |
421 | } |
422 | } |
423 | |
424 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) void |
425 | byte_swap_vector(void *p, npy_intp n, int size) |
426 | { |
427 | _strided_byte_swap(p, (npy_intp) size, n, size); |
428 | return; |
429 | } |
430 | |
431 | /* If numitems > 1, then dst must be contiguous */ |
432 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) void |
433 | copy_and_swap(void *dst, void *src, int itemsize, npy_intp numitems, |
434 | npy_intp srcstrides, int swap) |
435 | { |
436 | if ((numitems == 1) || (itemsize == srcstrides)) { |
437 | memcpy(dst, src, itemsize*numitems); |
438 | } |
439 | else { |
440 | npy_intp i; |
441 | char *s1 = (char *)src; |
442 | char *d1 = (char *)dst; |
443 | |
444 | for (i = 0; i < numitems; i++) { |
445 | memcpy(d1, s1, itemsize); |
446 | d1 += itemsize; |
447 | s1 += srcstrides; |
448 | } |
449 | } |
450 | |
451 | if (swap) { |
452 | byte_swap_vector(dst, numitems, itemsize); |
453 | } |
454 | } |
455 | |
456 | |
457 | /* |
458 | * Recursive helper to assign using a coercion cache. This function |
459 | * must consume the cache depth first, just as the cache was originally |
460 | * produced. |
461 | */ |
462 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int |
463 | PyArray_AssignFromCache_Recursive( |
464 | PyArrayObject *self, const int ndim, coercion_cache_obj **cache) |
465 | { |
466 | /* Consume first cache element by extracting information and freeing it */ |
467 | PyObject *original_obj = (*cache)->converted_obj; |
468 | PyObject *obj = (*cache)->arr_or_sequence; |
469 | Py_INCREF(obj)_Py_INCREF(((PyObject*)(obj))); |
470 | npy_bool sequence = (*cache)->sequence; |
471 | int depth = (*cache)->depth; |
472 | *cache = npy_unlink_coercion_cache(*cache); |
473 | |
474 | /* |
475 | * The maximum depth is special (specifically for objects), but usually |
476 | * unrolled in the sequence branch below. |
477 | */ |
478 | if (NPY_UNLIKELY(depth == ndim)__builtin_expect(!!(depth == ndim), 0)) { |
479 | /* |
480 | * We have reached the maximum depth. We should simply assign to the |
481 | * element in principle. There is one exception. If this is a 0-D |
482 | * array being stored into a 0-D array (but we do not reach here then). |
483 | */ |
484 | if (PyArray_ISOBJECT(self)((PyArray_TYPE(self)) == NPY_OBJECT)) { |
485 | assert(ndim != 0)((void) (0)); /* guaranteed by PyArray_AssignFromCache */ |
486 | assert(PyArray_NDIM(self) == 0)((void) (0)); |
487 | Py_DECREF(obj)_Py_DECREF(((PyObject*)(obj))); |
488 | return PyArray_Pack(PyArray_DESCR(self), PyArray_BYTES(self), |
489 | original_obj); |
490 | } |
491 | if (sequence) { |
492 | /* |
493 | * Sanity check which may be removed, the error is raised already |
494 | * in `PyArray_DiscoverDTypeAndShape`. |
495 | */ |
496 | assert(0)((void) (0)); |
497 | PyErr_SetString(PyExc_RuntimeError, |
498 | "setting an array element with a sequence"); |
499 | goto fail; |
500 | } |
501 | else if (original_obj != obj || !PyArray_CheckExact(obj)(((PyObject*)(obj))->ob_type == &PyArray_Type)) { |
502 | /* |
503 | * If the leave node is an array-like, but not a numpy array, |
504 | * we pretend it is an arbitrary scalar. This means that in |
505 | * most cases (where the dtype is int or float), we will end |
506 | * up using float(array-like), or int(array-like). That does |
507 | * not support general casting, but helps Quantity and masked |
508 | * arrays, because it allows them to raise an error when |
509 | * `__float__()` or `__int__()` is called. |
510 | */ |
511 | Py_DECREF(obj)_Py_DECREF(((PyObject*)(obj))); |
512 | return PyArray_SETITEM(self, PyArray_BYTES(self), original_obj); |
513 | } |
514 | } |
515 | |
516 | /* The element is either a sequence, or an array */ |
517 | if (!sequence) { |
518 | /* Straight forward array assignment */ |
519 | assert(PyArray_Check(obj))((void) (0)); |
520 | if (PyArray_CopyInto(self, (PyArrayObject *)obj) < 0) { |
521 | goto fail; |
522 | } |
523 | } |
524 | else { |
525 | assert(depth != ndim)((void) (0)); |
526 | npy_intp length = PySequence_LengthPySequence_Size(obj); |
527 | if (length != PyArray_DIMS(self)[0]) { |
528 | PyErr_SetString(PyExc_RuntimeError, |
529 | "Inconsistent object during array creation? " |
530 | "Content of sequences changed (length inconsistent)."); |
531 | goto fail; |
532 | } |
533 | |
534 | for (npy_intp i = 0; i < length; i++) { |
535 | PyObject *value = PySequence_Fast_GET_ITEM(obj, i)(((((((PyObject*)(obj))->ob_type))->tp_flags & ((1UL << 25))) != 0) ? (((PyListObject *)(obj))->ob_item[ i]) : ((((void) (0)), (PyTupleObject *)(obj))->ob_item[i]) ); |
536 | |
537 | if (*cache == NULL((void*)0) || (*cache)->converted_obj != value || |
538 | (*cache)->depth != depth + 1) { |
539 | if (ndim != depth + 1) { |
540 | PyErr_SetString(PyExc_RuntimeError, |
541 | "Inconsistent object during array creation? " |
542 | "Content of sequences changed (now too shallow)."); |
543 | goto fail; |
544 | } |
545 | /* Straight forward assignment of elements */ |
546 | char *item; |
547 | item = (PyArray_BYTES(self) + i * PyArray_STRIDES(self)[0]); |
548 | if (PyArray_Pack(PyArray_DESCR(self), item, value) < 0) { |
549 | goto fail; |
550 | } |
551 | } |
552 | else { |
553 | PyArrayObject *view; |
554 | view = (PyArrayObject *)array_item_asarray(self, i); |
555 | if (view == NULL((void*)0)) { |
556 | goto fail; |
557 | } |
558 | if (PyArray_AssignFromCache_Recursive(view, ndim, cache) < 0) { |
559 | Py_DECREF(view)_Py_DECREF(((PyObject*)(view))); |
560 | goto fail; |
561 | } |
562 | Py_DECREF(view)_Py_DECREF(((PyObject*)(view))); |
563 | } |
564 | } |
565 | } |
566 | Py_DECREF(obj)_Py_DECREF(((PyObject*)(obj))); |
567 | return 0; |
568 | |
569 | fail: |
570 | Py_DECREF(obj)_Py_DECREF(((PyObject*)(obj))); |
571 | return -1; |
572 | } |
573 | |
574 | |
575 | /** |
576 | * Fills an item based on a coercion cache object. It consumes the cache |
577 | * object while doing so. |
578 | * |
579 | * @param self Array to fill. |
580 | * @param cache coercion_cache_object, will be consumed. The cache must not |
581 | * contain a single array (must start with a sequence). The array case |
582 | * should be handled by `PyArray_FromArray()` before. |
583 | * @return 0 on success -1 on failure. |
584 | */ |
585 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int |
586 | PyArray_AssignFromCache(PyArrayObject *self, coercion_cache_obj *cache) { |
587 | int ndim = PyArray_NDIM(self); |
588 | /* |
589 | * Do not support ndim == 0 now with an array in the cache. |
590 | * The ndim == 0 is special because np.array(np.array(0), dtype=object) |
591 | * should unpack the inner array. |
592 | * Since the single-array case is special, it is handled previously |
593 | * in either case. |
594 | */ |
595 | assert(cache->sequence)((void) (0)); |
596 | assert(ndim != 0)((void) (0)); /* guaranteed if cache contains a sequence */ |
597 | |
598 | if (PyArray_AssignFromCache_Recursive(self, ndim, &cache) < 0) { |
599 | /* free the remaining cache. */ |
600 | npy_free_coercion_cache(cache); |
601 | return -1; |
602 | } |
603 | |
604 | /* |
605 | * Sanity check, this is the initial call, and when it returns, the |
606 | * cache has to be fully consumed, otherwise something is wrong. |
607 | * NOTE: May be nicer to put into a recursion helper. |
608 | */ |
609 | if (cache != NULL((void*)0)) { |
610 | PyErr_SetString(PyExc_RuntimeError, |
611 | "Inconsistent object during array creation? " |
612 | "Content of sequences changed (cache not consumed)."); |
613 | npy_free_coercion_cache(cache); |
614 | return -1; |
615 | } |
616 | return 0; |
617 | } |
618 | |
619 | |
620 | static void |
621 | raise_memory_error(int nd, npy_intp const *dims, PyArray_Descr *descr) |
622 | { |
623 | static PyObject *exc_type = NULL((void*)0); |
624 | |
625 | npy_cache_import( |
626 | "numpy.core._exceptions", "_ArrayMemoryError", |
627 | &exc_type); |
628 | if (exc_type == NULL((void*)0)) { |
629 | goto fail; |
630 | } |
631 | |
632 | PyObject *shape = PyArray_IntTupleFromIntp(nd, dims); |
633 | if (shape == NULL((void*)0)) { |
634 | goto fail; |
635 | } |
636 | |
637 | /* produce an error object */ |
638 | PyObject *exc_value = PyTuple_Pack(2, shape, (PyObject *)descr); |
639 | Py_DECREF(shape)_Py_DECREF(((PyObject*)(shape))); |
640 | if (exc_value == NULL((void*)0)){ |
641 | goto fail; |
642 | } |
643 | PyErr_SetObject(exc_type, exc_value); |
644 | Py_DECREF(exc_value)_Py_DECREF(((PyObject*)(exc_value))); |
645 | return; |
646 | |
647 | fail: |
648 | /* we couldn't raise the formatted exception for some reason */ |
649 | PyErr_WriteUnraisable(NULL((void*)0)); |
650 | PyErr_NoMemory(); |
651 | } |
652 | |
653 | /* |
654 | * Generic new array creation routine. |
655 | * Internal variant with calloc argument for PyArray_Zeros. |
656 | * |
657 | * steals a reference to descr. On failure or descr->subarray, descr will |
658 | * be decrefed. |
659 | */ |
660 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
661 | PyArray_NewFromDescr_int( |
662 | PyTypeObject *subtype, PyArray_Descr *descr, int nd, |
663 | npy_intp const *dims, npy_intp const *strides, void *data, |
664 | int flags, PyObject *obj, PyObject *base, int zeroed, |
665 | int allow_emptystring) |
666 | { |
667 | PyArrayObject_fields *fa; |
668 | npy_intp nbytes; |
669 | |
670 | if (nd > NPY_MAXDIMS32 || nd < 0) { |
671 | PyErr_Format(PyExc_ValueError, |
672 | "number of dimensions must be within [0, %d]", NPY_MAXDIMS32); |
673 | Py_DECREF(descr)_Py_DECREF(((PyObject*)(descr))); |
674 | return NULL((void*)0); |
675 | } |
676 | |
677 | if (descr->subarray) { |
678 | PyObject *ret; |
679 | npy_intp newdims[2*NPY_MAXDIMS32]; |
680 | npy_intp *newstrides = NULL((void*)0); |
681 | memcpy(newdims, dims, nd*sizeof(npy_intp)); |
682 | if (strides) { |
683 | newstrides = newdims + NPY_MAXDIMS32; |
684 | memcpy(newstrides, strides, nd*sizeof(npy_intp)); |
685 | } |
686 | nd =_update_descr_and_dimensions(&descr, newdims, |
687 | newstrides, nd); |
688 | ret = PyArray_NewFromDescr_int( |
689 | subtype, descr, |
690 | nd, newdims, newstrides, data, |
691 | flags, obj, base, |
692 | zeroed, allow_emptystring); |
693 | return ret; |
694 | } |
695 | |
696 | /* Check datatype element size */ |
697 | nbytes = descr->elsize; |
698 | if (PyDataType_ISUNSIZED(descr)((descr)->elsize == 0 && !(((PyArray_Descr *)(descr ))->names != ((void*)0)))) { |
699 | if (!PyDataType_ISFLEXIBLE(descr)(((((PyArray_Descr*)(descr))->type_num) >=NPY_STRING) && ((((PyArray_Descr*)(descr))->type_num) <=NPY_VOID))) { |
700 | PyErr_SetString(PyExc_TypeError, "Empty data-type"); |
701 | Py_DECREF(descr)_Py_DECREF(((PyObject*)(descr))); |
702 | return NULL((void*)0); |
703 | } |
704 | else if (PyDataType_ISSTRING(descr)(((((PyArray_Descr*)(descr))->type_num) == NPY_STRING) || ( (((PyArray_Descr*)(descr))->type_num) == NPY_UNICODE)) && !allow_emptystring && |
705 | data == NULL((void*)0)) { |
706 | PyArray_DESCR_REPLACE(descr)do { PyArray_Descr *_new_; _new_ = PyArray_DescrNew(descr); _Py_XDECREF (((PyObject*)(descr))); descr = _new_; } while(0); |
707 | if (descr == NULL((void*)0)) { |
708 | return NULL((void*)0); |
709 | } |
710 | if (descr->type_num == NPY_STRING) { |
711 | nbytes = descr->elsize = 1; |
712 | } |
713 | else { |
714 | nbytes = descr->elsize = sizeof(npy_ucs4); |
715 | } |
716 | } |
717 | } |
718 | |
719 | fa = (PyArrayObject_fields *) subtype->tp_alloc(subtype, 0); |
720 | if (fa == NULL((void*)0)) { |
721 | Py_DECREF(descr)_Py_DECREF(((PyObject*)(descr))); |
722 | return NULL((void*)0); |
723 | } |
724 | fa->_buffer_info = NULL((void*)0); |
725 | fa->nd = nd; |
726 | fa->dimensions = NULL((void*)0); |
727 | fa->data = NULL((void*)0); |
728 | |
729 | if (data == NULL((void*)0)) { |
730 | fa->flags = NPY_ARRAY_DEFAULT((0x0001 | (0x0100 | 0x0400))); |
731 | if (flags) { |
732 | fa->flags |= NPY_ARRAY_F_CONTIGUOUS0x0002; |
733 | if (nd > 1) { |
734 | fa->flags &= ~NPY_ARRAY_C_CONTIGUOUS0x0001; |
735 | } |
736 | flags = NPY_ARRAY_F_CONTIGUOUS0x0002; |
737 | } |
738 | } |
739 | else { |
740 | fa->flags = (flags & ~NPY_ARRAY_WRITEBACKIFCOPY0x2000); |
741 | fa->flags &= ~NPY_ARRAY_UPDATEIFCOPY0x1000; |
742 | } |
743 | fa->descr = descr; |
744 | fa->base = (PyObject *)NULL((void*)0); |
745 | fa->weakreflist = (PyObject *)NULL((void*)0); |
746 | |
747 | if (nd > 0) { |
748 | fa->dimensions = npy_alloc_cache_dim(2 * nd); |
749 | if (fa->dimensions == NULL((void*)0)) { |
750 | PyErr_NoMemory(); |
751 | goto fail; |
752 | } |
753 | fa->strides = fa->dimensions + nd; |
754 | |
755 | /* Copy dimensions, check them, and find total array size `nbytes` */ |
756 | for (int i = 0; i < nd; i++) { |
757 | fa->dimensions[i] = dims[i]; |
758 | |
759 | if (fa->dimensions[i] == 0) { |
760 | /* |
761 | * Compare to PyArray_OverflowMultiplyList that |
762 | * returns 0 in this case. |
763 | */ |
764 | continue; |
765 | } |
766 | |
767 | if (fa->dimensions[i] < 0) { |
768 | PyErr_SetString(PyExc_ValueError, |
769 | "negative dimensions are not allowed"); |
770 | goto fail; |
771 | } |
772 | |
773 | /* |
774 | * Care needs to be taken to avoid integer overflow when multiplying |
775 | * the dimensions together to get the total size of the array. |
776 | */ |
777 | if (npy_mul_with_overflow_intp(&nbytes, nbytes, fa->dimensions[i])) { |
778 | PyErr_SetString(PyExc_ValueError, |
779 | "array is too big; `arr.size * arr.dtype.itemsize` " |
780 | "is larger than the maximum possible size."); |
781 | goto fail; |
782 | } |
783 | } |
784 | |
785 | /* Fill the strides (or copy them if they were passed in) */ |
786 | if (strides == NULL((void*)0)) { |
787 | /* fill the strides and set the contiguity flags */ |
788 | _array_fill_strides(fa->strides, dims, nd, descr->elsize, |
789 | flags, &(fa->flags)); |
790 | } |
791 | else { |
792 | /* User to provided strides (user is responsible for correctness) */ |
793 | for (int i = 0; i < nd; i++) { |
794 | fa->strides[i] = strides[i]; |
795 | } |
796 | /* Since the strides were passed in must update contiguity */ |
797 | PyArray_UpdateFlags((PyArrayObject *)fa, |
798 | NPY_ARRAY_C_CONTIGUOUS0x0001|NPY_ARRAY_F_CONTIGUOUS0x0002); |
799 | } |
800 | } |
801 | else { |
802 | fa->dimensions = NULL((void*)0); |
803 | fa->strides = NULL((void*)0); |
804 | fa->flags |= NPY_ARRAY_C_CONTIGUOUS0x0001|NPY_ARRAY_F_CONTIGUOUS0x0002; |
805 | } |
806 | |
807 | if (data == NULL((void*)0)) { |
808 | /* |
809 | * Allocate something even for zero-space arrays |
810 | * e.g. shape=(0,) -- otherwise buffer exposure |
811 | * (a.data) doesn't work as it should. |
812 | * Could probably just allocate a few bytes here. -- Chuck |
813 | */ |
814 | if (nbytes == 0) { |
815 | nbytes = descr->elsize ? descr->elsize : 1; |
816 | } |
817 | /* |
818 | * It is bad to have uninitialized OBJECT pointers |
819 | * which could also be sub-fields of a VOID array |
820 | */ |
821 | if (zeroed || PyDataType_FLAGCHK(descr, NPY_NEEDS_INIT)(((descr)->flags & (0x08)) == (0x08))) { |
822 | data = npy_alloc_cache_zero(nbytes); |
823 | } |
824 | else { |
825 | data = npy_alloc_cache(nbytes); |
826 | } |
827 | if (data == NULL((void*)0)) { |
828 | raise_memory_error(fa->nd, fa->dimensions, descr); |
829 | goto fail; |
830 | } |
831 | fa->flags |= NPY_ARRAY_OWNDATA0x0004; |
832 | } |
833 | else { |
834 | /* |
835 | * If data is passed in, this object won't own it by default. |
836 | * Caller must arrange for this to be reset if truly desired |
837 | */ |
838 | fa->flags &= ~NPY_ARRAY_OWNDATA0x0004; |
839 | } |
840 | fa->data = data; |
841 | |
842 | /* |
843 | * Always update the aligned flag. Not owned data or input strides may |
844 | * not be aligned. Also on some platforms (debian sparc) malloc does not |
845 | * provide enough alignment for long double types. |
846 | */ |
847 | PyArray_UpdateFlags((PyArrayObject *)fa, NPY_ARRAY_ALIGNED0x0100); |
848 | |
849 | /* Set the base object. It's important to do it here so that |
850 | * __array_finalize__ below receives it |
851 | */ |
852 | if (base != NULL((void*)0)) { |
853 | Py_INCREF(base)_Py_INCREF(((PyObject*)(base))); |
854 | if (PyArray_SetBaseObject((PyArrayObject *)fa, base) < 0) { |
855 | goto fail; |
856 | } |
857 | } |
858 | |
859 | /* |
860 | * call the __array_finalize__ method if a subtype was requested. |
861 | * If obj is NULL use Py_None for the Python callback. |
862 | */ |
863 | if (subtype != &PyArray_Type) { |
864 | PyObject *res, *func; |
865 | |
866 | func = PyObject_GetAttr((PyObject *)fa, npy_ma_str_array_finalize); |
867 | if (func == NULL((void*)0)) { |
868 | goto fail; |
869 | } |
870 | else if (func == Py_None(&_Py_NoneStruct)) { |
871 | Py_DECREF(func)_Py_DECREF(((PyObject*)(func))); |
872 | } |
873 | else { |
874 | if (PyCapsule_CheckExact(func)((((PyObject*)(func))->ob_type) == &PyCapsule_Type)) { |
875 | /* A C-function is stored here */ |
876 | PyArray_FinalizeFunc *cfunc; |
877 | cfunc = PyCapsule_GetPointer(func, NULL((void*)0)); |
878 | Py_DECREF(func)_Py_DECREF(((PyObject*)(func))); |
879 | if (cfunc == NULL((void*)0)) { |
880 | goto fail; |
881 | } |
882 | if (cfunc((PyArrayObject *)fa, obj) < 0) { |
883 | goto fail; |
884 | } |
885 | } |
886 | else { |
887 | if (obj == NULL((void*)0)) { |
888 | obj = Py_None(&_Py_NoneStruct); |
889 | } |
890 | res = PyObject_CallFunctionObjArgs(func, obj, NULL((void*)0)); |
891 | Py_DECREF(func)_Py_DECREF(((PyObject*)(func))); |
892 | if (res == NULL((void*)0)) { |
893 | goto fail; |
894 | } |
895 | else { |
896 | Py_DECREF(res)_Py_DECREF(((PyObject*)(res))); |
897 | } |
898 | } |
899 | } |
900 | } |
901 | return (PyObject *)fa; |
902 | |
903 | fail: |
904 | Py_DECREF(fa)_Py_DECREF(((PyObject*)(fa))); |
905 | return NULL((void*)0); |
906 | } |
907 | |
908 | |
909 | /*NUMPY_API |
910 | * Generic new array creation routine. |
911 | * |
912 | * steals a reference to descr. On failure or when dtype->subarray is |
913 | * true, dtype will be decrefed. |
914 | */ |
915 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
916 | PyArray_NewFromDescr( |
917 | PyTypeObject *subtype, PyArray_Descr *descr, |
918 | int nd, npy_intp const *dims, npy_intp const *strides, void *data, |
919 | int flags, PyObject *obj) |
920 | { |
921 | return PyArray_NewFromDescrAndBase( |
922 | subtype, descr, |
923 | nd, dims, strides, data, |
924 | flags, obj, NULL((void*)0)); |
925 | } |
926 | |
927 | /* |
928 | * Sets the base object using PyArray_SetBaseObject |
929 | */ |
930 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
931 | PyArray_NewFromDescrAndBase( |
932 | PyTypeObject *subtype, PyArray_Descr *descr, |
933 | int nd, npy_intp const *dims, npy_intp const *strides, void *data, |
934 | int flags, PyObject *obj, PyObject *base) |
935 | { |
936 | return PyArray_NewFromDescr_int(subtype, descr, nd, |
937 | dims, strides, data, |
938 | flags, obj, base, 0, 0); |
939 | } |
940 | |
941 | /* |
942 | * Creates a new array with the same shape as the provided one, |
943 | * with possible memory layout order, data type and shape changes. |
944 | * |
945 | * prototype - The array the new one should be like. |
946 | * order - NPY_CORDER - C-contiguous result. |
947 | * NPY_FORTRANORDER - Fortran-contiguous result. |
948 | * NPY_ANYORDER - Fortran if prototype is Fortran, C otherwise. |
949 | * NPY_KEEPORDER - Keeps the axis ordering of prototype. |
950 | * dtype - If not NULL, overrides the data type of the result. |
951 | * ndim - If not -1, overrides the shape of the result. |
952 | * dims - If ndim is not -1, overrides the shape of the result. |
953 | * subok - If 1, use the prototype's array subtype, otherwise |
954 | * always create a base-class array. |
955 | * |
956 | * NOTE: If dtype is not NULL, steals the dtype reference. On failure or when |
957 | * dtype->subarray is true, dtype will be decrefed. |
958 | */ |
959 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
960 | PyArray_NewLikeArrayWithShape(PyArrayObject *prototype, NPY_ORDER order, |
961 | PyArray_Descr *dtype, int ndim, npy_intp const *dims, int subok) |
962 | { |
963 | PyObject *ret = NULL((void*)0); |
964 | |
965 | if (ndim == -1) { |
966 | ndim = PyArray_NDIM(prototype); |
967 | dims = PyArray_DIMS(prototype); |
968 | } |
969 | else if (order == NPY_KEEPORDER && (ndim != PyArray_NDIM(prototype))) { |
970 | order = NPY_CORDER; |
971 | } |
972 | |
973 | /* If no override data type, use the one from the prototype */ |
974 | if (dtype == NULL((void*)0)) { |
975 | dtype = PyArray_DESCR(prototype); |
976 | Py_INCREF(dtype)_Py_INCREF(((PyObject*)(dtype))); |
977 | } |
978 | |
979 | /* Handle ANYORDER and simple KEEPORDER cases */ |
980 | switch (order) { |
981 | case NPY_ANYORDER: |
982 | order = PyArray_ISFORTRAN(prototype)(PyArray_CHKFLAGS(prototype, 0x0002) && (!PyArray_CHKFLAGS (prototype, 0x0001))) ? |
983 | NPY_FORTRANORDER : NPY_CORDER; |
984 | break; |
985 | case NPY_KEEPORDER: |
986 | if (PyArray_IS_C_CONTIGUOUS(prototype)PyArray_CHKFLAGS((prototype), 0x0001) || ndim <= 1) { |
987 | order = NPY_CORDER; |
988 | break; |
989 | } |
990 | else if (PyArray_IS_F_CONTIGUOUS(prototype)PyArray_CHKFLAGS((prototype), 0x0002)) { |
991 | order = NPY_FORTRANORDER; |
992 | break; |
993 | } |
994 | break; |
995 | default: |
996 | break; |
997 | } |
998 | |
999 | /* If it's not KEEPORDER, this is simple */ |
1000 | if (order != NPY_KEEPORDER) { |
1001 | ret = PyArray_NewFromDescr(subok ? Py_TYPE(prototype)(((PyObject*)(prototype))->ob_type) : &PyArray_Type, |
1002 | dtype, |
1003 | ndim, |
1004 | dims, |
1005 | NULL((void*)0), |
1006 | NULL((void*)0), |
1007 | order, |
1008 | subok ? (PyObject *)prototype : NULL((void*)0)); |
1009 | } |
1010 | /* KEEPORDER needs some analysis of the strides */ |
1011 | else { |
1012 | npy_intp strides[NPY_MAXDIMS32], stride; |
1013 | npy_stride_sort_item strideperm[NPY_MAXDIMS32]; |
1014 | int idim; |
1015 | |
1016 | PyArray_CreateSortedStridePerm(ndim, |
1017 | PyArray_STRIDES(prototype), |
1018 | strideperm); |
1019 | |
1020 | /* Build the new strides */ |
1021 | stride = dtype->elsize; |
1022 | for (idim = ndim-1; idim >= 0; --idim) { |
1023 | npy_intp i_perm = strideperm[idim].perm; |
1024 | strides[i_perm] = stride; |
1025 | stride *= dims[i_perm]; |
1026 | } |
1027 | |
1028 | /* Finally, allocate the array */ |
1029 | ret = PyArray_NewFromDescr(subok ? Py_TYPE(prototype)(((PyObject*)(prototype))->ob_type) : &PyArray_Type, |
1030 | dtype, |
1031 | ndim, |
1032 | dims, |
1033 | strides, |
1034 | NULL((void*)0), |
1035 | 0, |
1036 | subok ? (PyObject *)prototype : NULL((void*)0)); |
1037 | } |
1038 | |
1039 | return ret; |
1040 | } |
1041 | |
1042 | /*NUMPY_API |
1043 | * Creates a new array with the same shape as the provided one, |
1044 | * with possible memory layout order and data type changes. |
1045 | * |
1046 | * prototype - The array the new one should be like. |
1047 | * order - NPY_CORDER - C-contiguous result. |
1048 | * NPY_FORTRANORDER - Fortran-contiguous result. |
1049 | * NPY_ANYORDER - Fortran if prototype is Fortran, C otherwise. |
1050 | * NPY_KEEPORDER - Keeps the axis ordering of prototype. |
1051 | * dtype - If not NULL, overrides the data type of the result. |
1052 | * subok - If 1, use the prototype's array subtype, otherwise |
1053 | * always create a base-class array. |
1054 | * |
1055 | * NOTE: If dtype is not NULL, steals the dtype reference. On failure or when |
1056 | * dtype->subarray is true, dtype will be decrefed. |
1057 | */ |
1058 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
1059 | PyArray_NewLikeArray(PyArrayObject *prototype, NPY_ORDER order, |
1060 | PyArray_Descr *dtype, int subok) |
1061 | { |
1062 | return PyArray_NewLikeArrayWithShape(prototype, order, dtype, -1, NULL((void*)0), subok); |
1063 | } |
1064 | |
1065 | /*NUMPY_API |
1066 | * Generic new array creation routine. |
1067 | */ |
1068 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
1069 | PyArray_New( |
1070 | PyTypeObject *subtype, int nd, npy_intp const *dims, int type_num, |
1071 | npy_intp const *strides, void *data, int itemsize, int flags, |
1072 | PyObject *obj) |
1073 | { |
1074 | PyArray_Descr *descr; |
1075 | PyObject *new; |
1076 | |
1077 | descr = PyArray_DescrFromType(type_num); |
1078 | if (descr == NULL((void*)0)) { |
1079 | return NULL((void*)0); |
1080 | } |
1081 | if (PyDataType_ISUNSIZED(descr)((descr)->elsize == 0 && !(((PyArray_Descr *)(descr ))->names != ((void*)0)))) { |
1082 | if (itemsize < 1) { |
1083 | PyErr_SetString(PyExc_ValueError, |
1084 | "data type must provide an itemsize"); |
1085 | Py_DECREF(descr)_Py_DECREF(((PyObject*)(descr))); |
1086 | return NULL((void*)0); |
1087 | } |
1088 | PyArray_DESCR_REPLACE(descr)do { PyArray_Descr *_new_; _new_ = PyArray_DescrNew(descr); _Py_XDECREF (((PyObject*)(descr))); descr = _new_; } while(0); |
1089 | descr->elsize = itemsize; |
1090 | } |
1091 | new = PyArray_NewFromDescr(subtype, descr, nd, dims, strides, |
1092 | data, flags, obj); |
1093 | return new; |
1094 | } |
1095 | |
1096 | |
1097 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyArray_Descr * |
1098 | _dtype_from_buffer_3118(PyObject *memoryview) |
1099 | { |
1100 | PyArray_Descr *descr; |
1101 | Py_buffer *view = PyMemoryView_GET_BUFFER(memoryview)(&((PyMemoryViewObject *)(memoryview))->view); |
1102 | if (view->format != NULL((void*)0)) { |
1103 | descr = _descriptor_from_pep3118_format(view->format); |
1104 | if (descr == NULL((void*)0)) { |
1105 | return NULL((void*)0); |
1106 | } |
1107 | } |
1108 | else { |
1109 | /* If no format is specified, just assume a byte array |
1110 | * TODO: void would make more sense here, as it wouldn't null |
1111 | * terminate. |
1112 | */ |
1113 | descr = PyArray_DescrNewFromType(NPY_STRING); |
1114 | descr->elsize = view->itemsize; |
1115 | } |
1116 | return descr; |
1117 | } |
1118 | |
1119 | |
1120 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
1121 | _array_from_buffer_3118(PyObject *memoryview) |
1122 | { |
1123 | /* PEP 3118 */ |
1124 | Py_buffer *view; |
1125 | PyArray_Descr *descr = NULL((void*)0); |
1126 | PyObject *r = NULL((void*)0); |
1127 | int nd, flags; |
1128 | Py_ssize_t d; |
1129 | npy_intp shape[NPY_MAXDIMS32], strides[NPY_MAXDIMS32]; |
1130 | |
1131 | view = PyMemoryView_GET_BUFFER(memoryview)(&((PyMemoryViewObject *)(memoryview))->view); |
1132 | nd = view->ndim; |
1133 | descr = _dtype_from_buffer_3118(memoryview); |
1134 | |
1135 | if (descr == NULL((void*)0)) { |
1136 | return NULL((void*)0); |
1137 | } |
1138 | |
1139 | /* Sanity check */ |
1140 | if (descr->elsize != view->itemsize) { |
1141 | /* Ctypes has bugs in its PEP3118 implementation, which we need to |
1142 | * work around. |
1143 | * |
1144 | * bpo-10746 |
1145 | * bpo-32780 |
1146 | * bpo-32782 |
1147 | * |
1148 | * Note that even if the above are fixed in main, we have to drop the |
1149 | * early patch versions of python to actually make use of the fixes. |
1150 | */ |
1151 | if (!npy_ctypes_check(Py_TYPE(view->obj)(((PyObject*)(view->obj))->ob_type))) { |
1152 | /* This object has no excuse for a broken PEP3118 buffer */ |
1153 | PyErr_Format( |
1154 | PyExc_RuntimeError, |
1155 | "Item size %zd for PEP 3118 buffer format " |
1156 | "string %s does not match the dtype %c item size %d.", |
1157 | view->itemsize, view->format, descr->type, |
1158 | descr->elsize); |
1159 | Py_DECREF(descr)_Py_DECREF(((PyObject*)(descr))); |
1160 | return NULL((void*)0); |
1161 | } |
1162 | |
1163 | if (PyErr_Warn(PyErr_WarnEx(PyExc_RuntimeWarning, "A builtin ctypes object gave a PEP3118 format " "string that does not match its itemsize, so a " "best-guess will be made of the data type. " "Newer versions of python may behave correctly.", 1) |
1164 | PyExc_RuntimeWarning,PyErr_WarnEx(PyExc_RuntimeWarning, "A builtin ctypes object gave a PEP3118 format " "string that does not match its itemsize, so a " "best-guess will be made of the data type. " "Newer versions of python may behave correctly.", 1) |
1165 | "A builtin ctypes object gave a PEP3118 format "PyErr_WarnEx(PyExc_RuntimeWarning, "A builtin ctypes object gave a PEP3118 format " "string that does not match its itemsize, so a " "best-guess will be made of the data type. " "Newer versions of python may behave correctly.", 1) |
1166 | "string that does not match its itemsize, so a "PyErr_WarnEx(PyExc_RuntimeWarning, "A builtin ctypes object gave a PEP3118 format " "string that does not match its itemsize, so a " "best-guess will be made of the data type. " "Newer versions of python may behave correctly.", 1) |
1167 | "best-guess will be made of the data type. "PyErr_WarnEx(PyExc_RuntimeWarning, "A builtin ctypes object gave a PEP3118 format " "string that does not match its itemsize, so a " "best-guess will be made of the data type. " "Newer versions of python may behave correctly.", 1) |
1168 | "Newer versions of python may behave correctly.")PyErr_WarnEx(PyExc_RuntimeWarning, "A builtin ctypes object gave a PEP3118 format " "string that does not match its itemsize, so a " "best-guess will be made of the data type. " "Newer versions of python may behave correctly.", 1) < 0) { |
1169 | Py_DECREF(descr)_Py_DECREF(((PyObject*)(descr))); |
1170 | return NULL((void*)0); |
1171 | } |
1172 | |
1173 | /* Thankfully, np.dtype(ctypes_type) works in most cases. |
1174 | * For an array input, this produces a dtype containing all the |
1175 | * dimensions, so the array is now 0d. |
1176 | */ |
1177 | nd = 0; |
1178 | Py_DECREF(descr)_Py_DECREF(((PyObject*)(descr))); |
1179 | descr = (PyArray_Descr *)PyObject_CallFunctionObjArgs( |
1180 | (PyObject *)&PyArrayDescr_Type(*(PyTypeObject *)(&PyArrayDescr_TypeFull)), Py_TYPE(view->obj)(((PyObject*)(view->obj))->ob_type), NULL((void*)0)); |
1181 | if (descr == NULL((void*)0)) { |
1182 | return NULL((void*)0); |
1183 | } |
1184 | if (descr->elsize != view->len) { |
1185 | PyErr_SetString( |
1186 | PyExc_RuntimeError, |
1187 | "For the given ctypes object, neither the item size " |
1188 | "computed from the PEP 3118 buffer format nor from " |
1189 | "converting the type to a np.dtype matched the actual " |
1190 | "size. This is a bug both in python and numpy"); |
1191 | Py_DECREF(descr)_Py_DECREF(((PyObject*)(descr))); |
1192 | return NULL((void*)0); |
1193 | } |
1194 | } |
1195 | |
1196 | if (view->shape != NULL((void*)0)) { |
1197 | int k; |
1198 | if (nd > NPY_MAXDIMS32 || nd < 0) { |
1199 | PyErr_Format(PyExc_RuntimeError, |
1200 | "PEP3118 dimensions do not satisfy 0 <= ndim <= NPY_MAXDIMS"); |
1201 | goto fail; |
1202 | } |
1203 | for (k = 0; k < nd; ++k) { |
1204 | shape[k] = view->shape[k]; |
1205 | } |
1206 | if (view->strides != NULL((void*)0)) { |
1207 | for (k = 0; k < nd; ++k) { |
1208 | strides[k] = view->strides[k]; |
1209 | } |
1210 | } |
1211 | else { |
1212 | d = view->len; |
1213 | for (k = 0; k < nd; ++k) { |
1214 | if (view->shape[k] != 0) { |
1215 | d /= view->shape[k]; |
1216 | } |
1217 | strides[k] = d; |
1218 | } |
1219 | } |
1220 | } |
1221 | else { |
1222 | if (nd == 1) { |
1223 | shape[0] = view->len / view->itemsize; |
1224 | strides[0] = view->itemsize; |
1225 | } |
1226 | else if (nd > 1) { |
1227 | PyErr_SetString(PyExc_RuntimeError, |
1228 | "ndim computed from the PEP 3118 buffer format " |
1229 | "is greater than 1, but shape is NULL."); |
1230 | goto fail; |
1231 | } |
1232 | } |
1233 | |
1234 | flags = NPY_ARRAY_BEHAVED(0x0100 | 0x0400) & (view->readonly ? ~NPY_ARRAY_WRITEABLE0x0400 : ~0); |
1235 | r = PyArray_NewFromDescrAndBase( |
1236 | &PyArray_Type, descr, |
1237 | nd, shape, strides, view->buf, |
1238 | flags, NULL((void*)0), memoryview); |
1239 | return r; |
1240 | |
1241 | |
1242 | fail: |
1243 | Py_XDECREF(r)_Py_XDECREF(((PyObject*)(r))); |
1244 | Py_XDECREF(descr)_Py_XDECREF(((PyObject*)(descr))); |
1245 | return NULL((void*)0); |
1246 | |
1247 | } |
1248 | |
1249 | |
1250 | /** |
1251 | * Attempts to extract an array from an array-like object. |
1252 | * |
1253 | * array-like is defined as either |
1254 | * |
1255 | * * an object implementing the PEP 3118 buffer interface; |
1256 | * * an object with __array_struct__ or __array_interface__ attributes; |
1257 | * * an object with an __array__ function. |
1258 | * |
1259 | * @param op The object to convert to an array |
1260 | * @param requested_type a requested dtype instance, may be NULL; The result |
1261 | * DType may be used, but is not enforced. |
1262 | * @param writeable whether the result must be writeable. |
1263 | * @param context Unused parameter, must be NULL (should be removed later). |
1264 | * |
1265 | * @returns The array object, Py_NotImplemented if op is not array-like, |
1266 | * or NULL with an error set. (A new reference to Py_NotImplemented |
1267 | * is returned.) |
1268 | */ |
1269 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
1270 | _array_from_array_like(PyObject *op, |
1271 | PyArray_Descr *requested_dtype, npy_bool writeable, PyObject *context) { |
1272 | PyObject* tmp; |
1273 | |
1274 | /* |
1275 | * If op supports the PEP 3118 buffer interface. |
1276 | * We skip bytes and unicode since they are considered scalars. Unicode |
1277 | * would fail but bytes would be incorrectly converted to a uint8 array. |
1278 | */ |
1279 | if (!PyBytes_Check(op)((((((PyObject*)(op))->ob_type))->tp_flags & ((1UL << 27))) != 0) && !PyUnicode_Check(op)((((((PyObject*)(op))->ob_type))->tp_flags & ((1UL << 28))) != 0)) { |
1280 | PyObject *memoryview = PyMemoryView_FromObject(op); |
1281 | if (memoryview == NULL((void*)0)) { |
1282 | PyErr_Clear(); |
1283 | } |
1284 | else { |
1285 | tmp = _array_from_buffer_3118(memoryview); |
1286 | Py_DECREF(memoryview)_Py_DECREF(((PyObject*)(memoryview))); |
1287 | if (tmp == NULL((void*)0)) { |
1288 | return NULL((void*)0); |
1289 | } |
1290 | |
1291 | if (writeable |
1292 | && PyArray_FailUnlessWriteable( |
1293 | (PyArrayObject *)tmp, "PEP 3118 buffer") < 0) { |
1294 | Py_DECREF(tmp)_Py_DECREF(((PyObject*)(tmp))); |
1295 | return NULL((void*)0); |
1296 | } |
1297 | |
1298 | return tmp; |
1299 | } |
1300 | } |
1301 | |
1302 | /* |
1303 | * If op supports the __array_struct__ or __array_interface__ interface. |
1304 | */ |
1305 | tmp = PyArray_FromStructInterface(op); |
1306 | if (tmp == NULL((void*)0)) { |
1307 | return NULL((void*)0); |
1308 | } |
1309 | if (tmp == Py_NotImplemented(&_Py_NotImplementedStruct)) { |
1310 | /* Until the return, NotImplemented is always a borrowed reference*/ |
1311 | tmp = PyArray_FromInterface(op); |
1312 | if (tmp == NULL((void*)0)) { |
1313 | return NULL((void*)0); |
1314 | } |
1315 | } |
1316 | |
1317 | /* |
1318 | * If op supplies the __array__ function. |
1319 | * The documentation says this should produce a copy, so |
1320 | * we skip this method if writeable is true, because the intent |
1321 | * of writeable is to modify the operand. |
1322 | * XXX: If the implementation is wrong, and/or if actual |
1323 | * usage requires this behave differently, |
1324 | * this should be changed! |
1325 | */ |
1326 | if (!writeable && tmp == Py_NotImplemented(&_Py_NotImplementedStruct)) { |
1327 | tmp = PyArray_FromArrayAttr(op, requested_dtype, context); |
1328 | if (tmp == NULL((void*)0)) { |
1329 | return NULL((void*)0); |
1330 | } |
1331 | } |
1332 | |
1333 | if (tmp != Py_NotImplemented(&_Py_NotImplementedStruct)) { |
1334 | if (writeable && |
1335 | PyArray_FailUnlessWriteable((PyArrayObject *)tmp, |
1336 | "array interface object") < 0) { |
1337 | Py_DECREF(tmp)_Py_DECREF(((PyObject*)(tmp))); |
1338 | return NULL((void*)0); |
1339 | } |
1340 | return tmp; |
1341 | } |
1342 | |
1343 | /* Until here Py_NotImplemented was borrowed */ |
1344 | Py_INCREF(Py_NotImplemented)_Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct)))); |
1345 | return Py_NotImplemented(&_Py_NotImplementedStruct); |
1346 | } |
1347 | |
1348 | |
1349 | /*NUMPY_API*/ |
1350 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int |
1351 | PyArray_GetArrayParamsFromObject(PyObject *NPY_UNUSED(op)(__NPY_UNUSED_TAGGEDop) __attribute__ ((__unused__)), |
1352 | PyArray_Descr *NPY_UNUSED(requested_dtype)(__NPY_UNUSED_TAGGEDrequested_dtype) __attribute__ ((__unused__ )), |
1353 | npy_bool NPY_UNUSED(writeable)(__NPY_UNUSED_TAGGEDwriteable) __attribute__ ((__unused__)), |
1354 | PyArray_Descr **NPY_UNUSED(out_dtype)(__NPY_UNUSED_TAGGEDout_dtype) __attribute__ ((__unused__)), |
1355 | int *NPY_UNUSED(out_ndim)(__NPY_UNUSED_TAGGEDout_ndim) __attribute__ ((__unused__)), npy_intp *NPY_UNUSED(out_dims)(__NPY_UNUSED_TAGGEDout_dims) __attribute__ ((__unused__)), |
1356 | PyArrayObject **NPY_UNUSED(out_arr)(__NPY_UNUSED_TAGGEDout_arr) __attribute__ ((__unused__)), PyObject *NPY_UNUSED(context)(__NPY_UNUSED_TAGGEDcontext) __attribute__ ((__unused__))) |
1357 | { |
1358 | /* Deprecated in NumPy 1.19, removed in NumPy 1.20. */ |
1359 | PyErr_SetString(PyExc_RuntimeError, |
1360 | "PyArray_GetArrayParamsFromObject() C-API function is removed " |
1361 | "`PyArray_FromAny()` should be used at this time. New C-API " |
1362 | "may be exposed in the future (please do request this if it " |
1363 | "would help you)."); |
1364 | return -1; |
1365 | } |
1366 | |
1367 | |
1368 | /* |
1369 | * This function is a legacy implementation to retain subarray dtype |
1370 | * behaviour in array coercion. The behaviour here makes sense if tuples |
1371 | * of matching dimensionality are being coerced. Due to the difficulty |
1372 | * that the result is ill-defined for lists of array-likes, this is deprecated. |
1373 | * |
1374 | * WARNING: Do not use this function, it exists purely to support a deprecated |
1375 | * code path. |
1376 | */ |
1377 | static int |
1378 | setArrayFromSequence(PyArrayObject *a, PyObject *s, |
1379 | int dim, PyArrayObject * dst) |
1380 | { |
1381 | Py_ssize_t i, slen; |
1382 | int res = -1; |
1383 | |
1384 | /* first recursion, view equal destination */ |
1385 | if (dst == NULL((void*)0)) |
1386 | dst = a; |
1387 | |
1388 | /* |
1389 | * This code is to ensure that the sequence access below will |
1390 | * return a lower-dimensional sequence. |
1391 | */ |
1392 | |
1393 | /* INCREF on entry DECREF on exit */ |
1394 | Py_INCREF(s)_Py_INCREF(((PyObject*)(s))); |
1395 | |
1396 | PyObject *seq = NULL((void*)0); |
1397 | |
1398 | if (PyArray_Check(s)((((PyObject*)(s))->ob_type) == (&PyArray_Type) || PyType_IsSubtype ((((PyObject*)(s))->ob_type), (&PyArray_Type)))) { |
1399 | if (!(PyArray_CheckExact(s)(((PyObject*)(s))->ob_type == &PyArray_Type))) { |
1400 | /* |
1401 | * make sure a base-class array is used so that the dimensionality |
1402 | * reduction assumption is correct. |
1403 | */ |
1404 | /* This will DECREF(s) if replaced */ |
1405 | s = PyArray_EnsureArray(s); |
1406 | if (s == NULL((void*)0)) { |
1407 | goto fail; |
1408 | } |
1409 | } |
1410 | |
1411 | /* dst points to correct array subsection */ |
1412 | if (PyArray_CopyInto(dst, (PyArrayObject *)s) < 0) { |
1413 | goto fail; |
1414 | } |
1415 | |
1416 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))); |
1417 | return 0; |
1418 | } |
1419 | |
1420 | if (dim > PyArray_NDIM(a)) { |
1421 | PyErr_Format(PyExc_ValueError, |
1422 | "setArrayFromSequence: sequence/array dimensions mismatch."); |
1423 | goto fail; |
1424 | } |
1425 | |
1426 | /* Try __array__ before using s as a sequence */ |
1427 | PyObject *tmp = _array_from_array_like(s, NULL((void*)0), 0, NULL((void*)0)); |
1428 | if (tmp == NULL((void*)0)) { |
1429 | goto fail; |
1430 | } |
1431 | else if (tmp == Py_NotImplemented(&_Py_NotImplementedStruct)) { |
1432 | Py_DECREF(tmp)_Py_DECREF(((PyObject*)(tmp))); |
1433 | } |
1434 | else { |
1435 | int r = PyArray_CopyInto(dst, (PyArrayObject *)tmp); |
1436 | Py_DECREF(tmp)_Py_DECREF(((PyObject*)(tmp))); |
1437 | if (r < 0) { |
1438 | goto fail; |
1439 | } |
1440 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))); |
1441 | return 0; |
1442 | } |
1443 | |
1444 | seq = PySequence_Fast(s, "Could not convert object to sequence"); |
1445 | if (seq == NULL((void*)0)) { |
1446 | goto fail; |
1447 | } |
1448 | slen = PySequence_Fast_GET_SIZE(seq)(((((((PyObject*)(seq))->ob_type))->tp_flags & ((1UL << 25))) != 0) ? (((void) (0)), (((PyVarObject*)(seq)) ->ob_size)) : (((PyVarObject*)((((void) (0)), (PyTupleObject *)(seq))))->ob_size)); |
1449 | |
1450 | /* |
1451 | * Either the dimensions match, or the sequence has length 1 and can |
1452 | * be broadcast to the destination. |
1453 | */ |
1454 | if (slen != PyArray_DIMS(a)[dim] && slen != 1) { |
1455 | PyErr_Format(PyExc_ValueError, |
1456 | "cannot copy sequence with size %zd to array axis " |
1457 | "with dimension %" NPY_INTP_FMT"ld", slen, PyArray_DIMS(a)[dim]); |
1458 | goto fail; |
1459 | } |
1460 | |
1461 | /* Broadcast the one element from the sequence to all the outputs */ |
1462 | if (slen == 1) { |
1463 | PyObject *o = PySequence_Fast_GET_ITEM(seq, 0)(((((((PyObject*)(seq))->ob_type))->tp_flags & ((1UL << 25))) != 0) ? (((PyListObject *)(seq))->ob_item[ 0]) : ((((void) (0)), (PyTupleObject *)(seq))->ob_item[0]) ); |
1464 | npy_intp alen = PyArray_DIM(a, dim); |
1465 | |
1466 | for (i = 0; i < alen; i++) { |
1467 | if ((PyArray_NDIM(a) - dim) > 1) { |
1468 | PyArrayObject * tmp = |
1469 | (PyArrayObject *)array_item_asarray(dst, i); |
1470 | if (tmp == NULL((void*)0)) { |
1471 | goto fail; |
1472 | } |
1473 | |
1474 | res = setArrayFromSequence(a, o, dim+1, tmp); |
1475 | Py_DECREF(tmp)_Py_DECREF(((PyObject*)(tmp))); |
1476 | } |
1477 | else { |
1478 | char * b = (PyArray_BYTES(dst) + i * PyArray_STRIDES(dst)[0]); |
1479 | res = PyArray_SETITEM(dst, b, o); |
1480 | } |
1481 | if (res < 0) { |
1482 | goto fail; |
1483 | } |
1484 | } |
1485 | } |
1486 | /* Copy element by element */ |
1487 | else { |
1488 | for (i = 0; i < slen; i++) { |
1489 | PyObject * o = PySequence_Fast_GET_ITEM(seq, i)(((((((PyObject*)(seq))->ob_type))->tp_flags & ((1UL << 25))) != 0) ? (((PyListObject *)(seq))->ob_item[ i]) : ((((void) (0)), (PyTupleObject *)(seq))->ob_item[i]) ); |
1490 | if ((PyArray_NDIM(a) - dim) > 1) { |
1491 | PyArrayObject * tmp = |
1492 | (PyArrayObject *)array_item_asarray(dst, i); |
1493 | if (tmp == NULL((void*)0)) { |
1494 | goto fail; |
1495 | } |
1496 | |
1497 | res = setArrayFromSequence(a, o, dim+1, tmp); |
1498 | Py_DECREF(tmp)_Py_DECREF(((PyObject*)(tmp))); |
1499 | } |
1500 | else { |
1501 | char * b = (PyArray_BYTES(dst) + i * PyArray_STRIDES(dst)[0]); |
1502 | res = PyArray_SETITEM(dst, b, o); |
1503 | } |
1504 | if (res < 0) { |
1505 | goto fail; |
1506 | } |
1507 | } |
1508 | } |
1509 | |
1510 | Py_DECREF(seq)_Py_DECREF(((PyObject*)(seq))); |
1511 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))); |
1512 | return 0; |
1513 | |
1514 | fail: |
1515 | Py_XDECREF(seq)_Py_XDECREF(((PyObject*)(seq))); |
1516 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))); |
1517 | return res; |
1518 | } |
1519 | |
1520 | |
1521 | |
1522 | /*NUMPY_API |
1523 | * Does not check for NPY_ARRAY_ENSURECOPY and NPY_ARRAY_NOTSWAPPED in flags |
1524 | * Steals a reference to newtype --- which can be NULL |
1525 | */ |
1526 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
1527 | PyArray_FromAny(PyObject *op, PyArray_Descr *newtype, int min_depth, |
1528 | int max_depth, int flags, PyObject *context) |
1529 | { |
1530 | /* |
1531 | * This is the main code to make a NumPy array from a Python |
1532 | * Object. It is called from many different places. |
1533 | */ |
1534 | PyArrayObject *arr = NULL((void*)0), *ret; |
1535 | PyArray_Descr *dtype = NULL((void*)0); |
1536 | coercion_cache_obj *cache = NULL((void*)0); |
1537 | int ndim = 0; |
1538 | npy_intp dims[NPY_MAXDIMS32]; |
1539 | |
1540 | if (context != NULL((void*)0)) { |
1541 | PyErr_SetString(PyExc_RuntimeError, "'context' must be NULL"); |
1542 | return NULL((void*)0); |
1543 | } |
1544 | |
1545 | PyArray_Descr *fixed_descriptor; |
1546 | PyArray_DTypeMeta *fixed_DType; |
1547 | if (PyArray_ExtractDTypeAndDescriptor((PyObject *)newtype, |
1548 | &fixed_descriptor, &fixed_DType) < 0) { |
1549 | Py_XDECREF(newtype)_Py_XDECREF(((PyObject*)(newtype))); |
1550 | return NULL((void*)0); |
1551 | } |
1552 | Py_XDECREF(newtype)_Py_XDECREF(((PyObject*)(newtype))); |
1553 | |
1554 | ndim = PyArray_DiscoverDTypeAndShape(op, |
1555 | NPY_MAXDIMS32, dims, &cache, fixed_DType, fixed_descriptor, &dtype); |
1556 | |
1557 | Py_XDECREF(fixed_descriptor)_Py_XDECREF(((PyObject*)(fixed_descriptor))); |
1558 | Py_XDECREF(fixed_DType)_Py_XDECREF(((PyObject*)(fixed_DType))); |
1559 | if (ndim < 0) { |
1560 | return NULL((void*)0); |
1561 | } |
1562 | |
1563 | if (NPY_UNLIKELY(fixed_descriptor != NULL && PyDataType_HASSUBARRAY(dtype))__builtin_expect(!!(fixed_descriptor != ((void*)0) && ((dtype)->subarray != ((void*)0))), 0)) { |
1564 | /* |
1565 | * When a subarray dtype was passed in, its dimensions are appended |
1566 | * to the array dimension (causing a dimension mismatch). |
1567 | * There is a problem with that, because if we coerce from non-arrays |
1568 | * we do this correctly by element (as defined by tuples), but for |
1569 | * arrays we first append the dimensions and then assign to the base |
1570 | * dtype and then assign which causes the problem. |
1571 | * |
1572 | * Thus, we check if there is an array included, in that case we |
1573 | * give a FutureWarning. |
1574 | * When the warning is removed, PyArray_Pack will have to ensure |
1575 | * that that it does not append the dimensions when creating the |
1576 | * subarrays to assign `arr[0] = obj[0]`. |
1577 | */ |
1578 | int includes_array = 0; |
1579 | if (cache != NULL((void*)0)) { |
1580 | /* This is not ideal, but it is a pretty special case */ |
1581 | coercion_cache_obj *next = cache; |
1582 | while (next != NULL((void*)0)) { |
1583 | if (!next->sequence) { |
1584 | includes_array = 1; |
1585 | break; |
1586 | } |
1587 | next = next->next; |
1588 | } |
1589 | } |
1590 | if (includes_array) { |
1591 | npy_free_coercion_cache(cache); |
1592 | |
1593 | ret = (PyArrayObject *) PyArray_NewFromDescr( |
1594 | &PyArray_Type, dtype, ndim, dims, NULL((void*)0), NULL((void*)0), |
1595 | flags & NPY_ARRAY_F_CONTIGUOUS0x0002, NULL((void*)0)); |
1596 | if (ret == NULL((void*)0)) { |
1597 | return NULL((void*)0); |
1598 | } |
1599 | assert(PyArray_NDIM(ret) != ndim)((void) (0)); |
1600 | |
1601 | /* NumPy 1.20, 2020-10-01 */ |
1602 | if (DEPRECATE_FUTUREWARNING(PyErr_WarnEx(PyExc_FutureWarning,"creating an array with a subarray dtype will behave " "differently when the `np.array()` (or `asarray`, etc.) " "call includes an array or array object.\n" "If you are converting a single array or a list of arrays," "you can opt-in to the future behaviour using:\n" " np.array(arr, dtype=np.dtype(['f', dtype]))['f']\n" " np.array([arr1, arr2], dtype=np.dtype(['f', dtype]))['f']\n" "\n" "By including a new field and indexing it after the " "conversion.\n" "This may lead to a different result or to current failures " "succeeding. (FutureWarning since NumPy 1.20)",1) |
1603 | "creating an array with a subarray dtype will behave "PyErr_WarnEx(PyExc_FutureWarning,"creating an array with a subarray dtype will behave " "differently when the `np.array()` (or `asarray`, etc.) " "call includes an array or array object.\n" "If you are converting a single array or a list of arrays," "you can opt-in to the future behaviour using:\n" " np.array(arr, dtype=np.dtype(['f', dtype]))['f']\n" " np.array([arr1, arr2], dtype=np.dtype(['f', dtype]))['f']\n" "\n" "By including a new field and indexing it after the " "conversion.\n" "This may lead to a different result or to current failures " "succeeding. (FutureWarning since NumPy 1.20)",1) |
1604 | "differently when the `np.array()` (or `asarray`, etc.) "PyErr_WarnEx(PyExc_FutureWarning,"creating an array with a subarray dtype will behave " "differently when the `np.array()` (or `asarray`, etc.) " "call includes an array or array object.\n" "If you are converting a single array or a list of arrays," "you can opt-in to the future behaviour using:\n" " np.array(arr, dtype=np.dtype(['f', dtype]))['f']\n" " np.array([arr1, arr2], dtype=np.dtype(['f', dtype]))['f']\n" "\n" "By including a new field and indexing it after the " "conversion.\n" "This may lead to a different result or to current failures " "succeeding. (FutureWarning since NumPy 1.20)",1) |
1605 | "call includes an array or array object.\n"PyErr_WarnEx(PyExc_FutureWarning,"creating an array with a subarray dtype will behave " "differently when the `np.array()` (or `asarray`, etc.) " "call includes an array or array object.\n" "If you are converting a single array or a list of arrays," "you can opt-in to the future behaviour using:\n" " np.array(arr, dtype=np.dtype(['f', dtype]))['f']\n" " np.array([arr1, arr2], dtype=np.dtype(['f', dtype]))['f']\n" "\n" "By including a new field and indexing it after the " "conversion.\n" "This may lead to a different result or to current failures " "succeeding. (FutureWarning since NumPy 1.20)",1) |
1606 | "If you are converting a single array or a list of arrays,"PyErr_WarnEx(PyExc_FutureWarning,"creating an array with a subarray dtype will behave " "differently when the `np.array()` (or `asarray`, etc.) " "call includes an array or array object.\n" "If you are converting a single array or a list of arrays," "you can opt-in to the future behaviour using:\n" " np.array(arr, dtype=np.dtype(['f', dtype]))['f']\n" " np.array([arr1, arr2], dtype=np.dtype(['f', dtype]))['f']\n" "\n" "By including a new field and indexing it after the " "conversion.\n" "This may lead to a different result or to current failures " "succeeding. (FutureWarning since NumPy 1.20)",1) |
1607 | "you can opt-in to the future behaviour using:\n"PyErr_WarnEx(PyExc_FutureWarning,"creating an array with a subarray dtype will behave " "differently when the `np.array()` (or `asarray`, etc.) " "call includes an array or array object.\n" "If you are converting a single array or a list of arrays," "you can opt-in to the future behaviour using:\n" " np.array(arr, dtype=np.dtype(['f', dtype]))['f']\n" " np.array([arr1, arr2], dtype=np.dtype(['f', dtype]))['f']\n" "\n" "By including a new field and indexing it after the " "conversion.\n" "This may lead to a different result or to current failures " "succeeding. (FutureWarning since NumPy 1.20)",1) |
1608 | " np.array(arr, dtype=np.dtype(['f', dtype]))['f']\n"PyErr_WarnEx(PyExc_FutureWarning,"creating an array with a subarray dtype will behave " "differently when the `np.array()` (or `asarray`, etc.) " "call includes an array or array object.\n" "If you are converting a single array or a list of arrays," "you can opt-in to the future behaviour using:\n" " np.array(arr, dtype=np.dtype(['f', dtype]))['f']\n" " np.array([arr1, arr2], dtype=np.dtype(['f', dtype]))['f']\n" "\n" "By including a new field and indexing it after the " "conversion.\n" "This may lead to a different result or to current failures " "succeeding. (FutureWarning since NumPy 1.20)",1) |
1609 | " np.array([arr1, arr2], dtype=np.dtype(['f', dtype]))['f']\n"PyErr_WarnEx(PyExc_FutureWarning,"creating an array with a subarray dtype will behave " "differently when the `np.array()` (or `asarray`, etc.) " "call includes an array or array object.\n" "If you are converting a single array or a list of arrays," "you can opt-in to the future behaviour using:\n" " np.array(arr, dtype=np.dtype(['f', dtype]))['f']\n" " np.array([arr1, arr2], dtype=np.dtype(['f', dtype]))['f']\n" "\n" "By including a new field and indexing it after the " "conversion.\n" "This may lead to a different result or to current failures " "succeeding. (FutureWarning since NumPy 1.20)",1) |
1610 | "\n"PyErr_WarnEx(PyExc_FutureWarning,"creating an array with a subarray dtype will behave " "differently when the `np.array()` (or `asarray`, etc.) " "call includes an array or array object.\n" "If you are converting a single array or a list of arrays," "you can opt-in to the future behaviour using:\n" " np.array(arr, dtype=np.dtype(['f', dtype]))['f']\n" " np.array([arr1, arr2], dtype=np.dtype(['f', dtype]))['f']\n" "\n" "By including a new field and indexing it after the " "conversion.\n" "This may lead to a different result or to current failures " "succeeding. (FutureWarning since NumPy 1.20)",1) |
1611 | "By including a new field and indexing it after the "PyErr_WarnEx(PyExc_FutureWarning,"creating an array with a subarray dtype will behave " "differently when the `np.array()` (or `asarray`, etc.) " "call includes an array or array object.\n" "If you are converting a single array or a list of arrays," "you can opt-in to the future behaviour using:\n" " np.array(arr, dtype=np.dtype(['f', dtype]))['f']\n" " np.array([arr1, arr2], dtype=np.dtype(['f', dtype]))['f']\n" "\n" "By including a new field and indexing it after the " "conversion.\n" "This may lead to a different result or to current failures " "succeeding. (FutureWarning since NumPy 1.20)",1) |
1612 | "conversion.\n"PyErr_WarnEx(PyExc_FutureWarning,"creating an array with a subarray dtype will behave " "differently when the `np.array()` (or `asarray`, etc.) " "call includes an array or array object.\n" "If you are converting a single array or a list of arrays," "you can opt-in to the future behaviour using:\n" " np.array(arr, dtype=np.dtype(['f', dtype]))['f']\n" " np.array([arr1, arr2], dtype=np.dtype(['f', dtype]))['f']\n" "\n" "By including a new field and indexing it after the " "conversion.\n" "This may lead to a different result or to current failures " "succeeding. (FutureWarning since NumPy 1.20)",1) |
1613 | "This may lead to a different result or to current failures "PyErr_WarnEx(PyExc_FutureWarning,"creating an array with a subarray dtype will behave " "differently when the `np.array()` (or `asarray`, etc.) " "call includes an array or array object.\n" "If you are converting a single array or a list of arrays," "you can opt-in to the future behaviour using:\n" " np.array(arr, dtype=np.dtype(['f', dtype]))['f']\n" " np.array([arr1, arr2], dtype=np.dtype(['f', dtype]))['f']\n" "\n" "By including a new field and indexing it after the " "conversion.\n" "This may lead to a different result or to current failures " "succeeding. (FutureWarning since NumPy 1.20)",1) |
1614 | "succeeding. (FutureWarning since NumPy 1.20)")PyErr_WarnEx(PyExc_FutureWarning,"creating an array with a subarray dtype will behave " "differently when the `np.array()` (or `asarray`, etc.) " "call includes an array or array object.\n" "If you are converting a single array or a list of arrays," "you can opt-in to the future behaviour using:\n" " np.array(arr, dtype=np.dtype(['f', dtype]))['f']\n" " np.array([arr1, arr2], dtype=np.dtype(['f', dtype]))['f']\n" "\n" "By including a new field and indexing it after the " "conversion.\n" "This may lead to a different result or to current failures " "succeeding. (FutureWarning since NumPy 1.20)",1) < 0) { |
1615 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
1616 | return NULL((void*)0); |
1617 | } |
1618 | |
1619 | if (setArrayFromSequence(ret, op, 0, NULL((void*)0)) < 0) { |
1620 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
1621 | return NULL((void*)0); |
1622 | } |
1623 | return (PyObject *)ret; |
1624 | } |
1625 | } |
1626 | |
1627 | if (dtype == NULL((void*)0)) { |
1628 | dtype = PyArray_DescrFromType(NPY_DEFAULT_TYPENPY_DOUBLE); |
1629 | } |
1630 | |
1631 | if (min_depth != 0 && ndim < min_depth) { |
1632 | PyErr_SetString(PyExc_ValueError, |
1633 | "object of too small depth for desired array"); |
1634 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
1635 | npy_free_coercion_cache(cache); |
1636 | return NULL((void*)0); |
1637 | } |
1638 | if (max_depth != 0 && ndim > max_depth) { |
1639 | PyErr_SetString(PyExc_ValueError, |
1640 | "object too deep for desired array"); |
1641 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
1642 | npy_free_coercion_cache(cache); |
1643 | return NULL((void*)0); |
1644 | } |
1645 | |
1646 | /* Got the correct parameters, but the cache may already hold the result */ |
1647 | if (cache != NULL((void*)0) && !(cache->sequence)) { |
1648 | /* |
1649 | * There is only a single array-like and it was converted, it |
1650 | * may still have the incorrect type, but that is handled below. |
1651 | */ |
1652 | assert(cache->converted_obj == op)((void) (0)); |
1653 | arr = (PyArrayObject *)(cache->arr_or_sequence); |
1654 | /* we may need to cast or assert flags (e.g. copy) */ |
1655 | PyObject *res = PyArray_FromArray(arr, dtype, flags); |
1656 | npy_unlink_coercion_cache(cache); |
1657 | return res; |
1658 | } |
1659 | else if (cache == NULL((void*)0) && PyArray_IsScalar(op, Void)(((((PyObject*)(op))->ob_type) == (&PyVoidArrType_Type ) || PyType_IsSubtype((((PyObject*)(op))->ob_type), (& PyVoidArrType_Type)))) && |
1660 | !(((PyVoidScalarObject *)op)->flags & NPY_ARRAY_OWNDATA0x0004) && |
1661 | newtype == NULL((void*)0)) { |
1662 | /* |
1663 | * Special case, we return a *view* into void scalars, mainly to |
1664 | * allow things similar to the "reversed" assignment: |
1665 | * arr[indx]["field"] = val # instead of arr["field"][indx] = val |
1666 | * |
1667 | * It is unclear that this is necessary in this particular code path. |
1668 | * Note that this path is only activated when the user did _not_ |
1669 | * provide a dtype (newtype is NULL). |
1670 | */ |
1671 | assert(ndim == 0)((void) (0)); |
1672 | |
1673 | return PyArray_NewFromDescrAndBase( |
1674 | &PyArray_Type, dtype, |
1675 | 0, NULL((void*)0), NULL((void*)0), |
1676 | ((PyVoidScalarObject *)op)->obval, |
1677 | ((PyVoidScalarObject *)op)->flags, |
1678 | NULL((void*)0), op); |
1679 | } |
1680 | else if (cache == 0 && newtype != NULL((void*)0) && |
1681 | PyDataType_ISSIGNED(newtype)(((((PyArray_Descr*)(newtype))->type_num) == NPY_BYTE) || ( (((PyArray_Descr*)(newtype))->type_num) == NPY_SHORT) || ( (((PyArray_Descr*)(newtype))->type_num) == NPY_INT) || ((( (PyArray_Descr*)(newtype))->type_num) == NPY_LONG) || (((( PyArray_Descr*)(newtype))->type_num) == NPY_LONGLONG)) && PyArray_IsScalar(op, Generic)(((((PyObject*)(op))->ob_type) == (&PyGenericArrType_Type ) || PyType_IsSubtype((((PyObject*)(op))->ob_type), (& PyGenericArrType_Type))))) { |
1682 | assert(ndim == 0)((void) (0)); |
1683 | /* |
1684 | * This is an (possible) inconsistency where: |
1685 | * |
1686 | * np.array(np.float64(np.nan), dtype=np.int64) |
1687 | * |
1688 | * behaves differently from: |
1689 | * |
1690 | * np.array([np.float64(np.nan)], dtype=np.int64) |
1691 | * arr1d_int64[0] = np.float64(np.nan) |
1692 | * np.array(np.array(np.nan), dtype=np.int64) |
1693 | * |
1694 | * by not raising an error instead of using typical casting. |
1695 | * The error is desirable, but to always error seems like a |
1696 | * larger change to be considered at some other time and it is |
1697 | * undesirable that 0-D arrays behave differently from scalars. |
1698 | * This retains the behaviour, largely due to issues in pandas |
1699 | * which relied on a try/except (although hopefully that will |
1700 | * have a better solution at some point): |
1701 | * https://github.com/pandas-dev/pandas/issues/35481 |
1702 | */ |
1703 | return PyArray_FromScalar(op, dtype); |
1704 | } |
1705 | |
1706 | /* There was no array (or array-like) passed in directly. */ |
1707 | if ((flags & NPY_ARRAY_WRITEBACKIFCOPY0x2000) || |
1708 | (flags & NPY_ARRAY_UPDATEIFCOPY0x1000)) { |
1709 | PyErr_SetString(PyExc_TypeError, |
1710 | "WRITEBACKIFCOPY used for non-array input."); |
1711 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
1712 | npy_free_coercion_cache(cache); |
1713 | return NULL((void*)0); |
1714 | } |
1715 | |
1716 | /* Create a new array and copy the data */ |
1717 | Py_INCREF(dtype)_Py_INCREF(((PyObject*)(dtype))); /* hold on in case of a subarray that is replaced */ |
1718 | ret = (PyArrayObject *)PyArray_NewFromDescr( |
1719 | &PyArray_Type, dtype, ndim, dims, NULL((void*)0), NULL((void*)0), |
1720 | flags&NPY_ARRAY_F_CONTIGUOUS0x0002, NULL((void*)0)); |
1721 | if (ret == NULL((void*)0)) { |
1722 | npy_free_coercion_cache(cache); |
1723 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
1724 | return NULL((void*)0); |
1725 | } |
1726 | if (ndim == PyArray_NDIM(ret)) { |
1727 | /* |
1728 | * Appending of dimensions did not occur, so use the actual dtype |
1729 | * below. This is relevant for S0 or U0 which can be replaced with |
1730 | * S1 or U1, although that should likely change. |
1731 | */ |
1732 | Py_SETREF(dtype, PyArray_DESCR(ret))do { PyObject *_py_tmp = ((PyObject*)(dtype)); (dtype) = (PyArray_DESCR (ret)); _Py_DECREF(((PyObject*)(_py_tmp))); } while (0); |
1733 | Py_INCREF(dtype)_Py_INCREF(((PyObject*)(dtype))); |
1734 | } |
1735 | |
1736 | if (cache == NULL((void*)0)) { |
1737 | /* This is a single item. Set it directly. */ |
1738 | assert(ndim == 0)((void) (0)); |
1739 | |
1740 | if (PyArray_Pack(dtype, PyArray_BYTES(ret), op) < 0) { |
1741 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
1742 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
1743 | return NULL((void*)0); |
1744 | } |
1745 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
1746 | return (PyObject *)ret; |
1747 | } |
1748 | assert(ndim != 0)((void) (0)); |
1749 | assert(op == cache->converted_obj)((void) (0)); |
1750 | |
1751 | /* Decrease the number of dimensions to the detected ones */ |
1752 | int out_ndim = PyArray_NDIM(ret); |
1753 | PyArray_Descr *out_descr = PyArray_DESCR(ret); |
1754 | ((PyArrayObject_fields *)ret)->nd = ndim; |
1755 | ((PyArrayObject_fields *)ret)->descr = dtype; |
1756 | |
1757 | int success = PyArray_AssignFromCache(ret, cache); |
1758 | |
1759 | ((PyArrayObject_fields *)ret)->nd = out_ndim; |
1760 | ((PyArrayObject_fields *)ret)->descr = out_descr; |
1761 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
1762 | if (success < 0) { |
1763 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
1764 | return NULL((void*)0); |
1765 | } |
1766 | return (PyObject *)ret; |
1767 | } |
1768 | |
1769 | /* |
1770 | * flags is any of |
1771 | * NPY_ARRAY_C_CONTIGUOUS (formerly CONTIGUOUS), |
1772 | * NPY_ARRAY_F_CONTIGUOUS (formerly FORTRAN), |
1773 | * NPY_ARRAY_ALIGNED, |
1774 | * NPY_ARRAY_WRITEABLE, |
1775 | * NPY_ARRAY_NOTSWAPPED, |
1776 | * NPY_ARRAY_ENSURECOPY, |
1777 | * NPY_ARRAY_UPDATEIFCOPY, |
1778 | * NPY_ARRAY_WRITEBACKIFCOPY, |
1779 | * NPY_ARRAY_FORCECAST, |
1780 | * NPY_ARRAY_ENSUREARRAY, |
1781 | * NPY_ARRAY_ELEMENTSTRIDES |
1782 | * |
1783 | * or'd (|) together |
1784 | * |
1785 | * Any of these flags present means that the returned array should |
1786 | * guarantee that aspect of the array. Otherwise the returned array |
1787 | * won't guarantee it -- it will depend on the object as to whether or |
1788 | * not it has such features. |
1789 | * |
1790 | * Note that NPY_ARRAY_ENSURECOPY is enough |
1791 | * to guarantee NPY_ARRAY_C_CONTIGUOUS, NPY_ARRAY_ALIGNED and |
1792 | * NPY_ARRAY_WRITEABLE and therefore it is redundant to include |
1793 | * those as well. |
1794 | * |
1795 | * NPY_ARRAY_BEHAVED == NPY_ARRAY_ALIGNED | NPY_ARRAY_WRITEABLE |
1796 | * NPY_ARRAY_CARRAY = NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_BEHAVED |
1797 | * NPY_ARRAY_FARRAY = NPY_ARRAY_F_CONTIGUOUS | NPY_ARRAY_BEHAVED |
1798 | * |
1799 | * NPY_ARRAY_F_CONTIGUOUS can be set in the FLAGS to request a FORTRAN array. |
1800 | * Fortran arrays are always behaved (aligned, |
1801 | * notswapped, and writeable) and not (C) CONTIGUOUS (if > 1d). |
1802 | * |
1803 | * NPY_ARRAY_UPDATEIFCOPY is deprecated in favor of |
1804 | * NPY_ARRAY_WRITEBACKIFCOPY in 1.14 |
1805 | |
1806 | * NPY_ARRAY_WRITEBACKIFCOPY flag sets this flag in the returned |
1807 | * array if a copy is made and the base argument points to the (possibly) |
1808 | * misbehaved array. Before returning to python, PyArray_ResolveWritebackIfCopy |
1809 | * must be called to update the contents of the original array from the copy. |
1810 | * |
1811 | * NPY_ARRAY_FORCECAST will cause a cast to occur regardless of whether or not |
1812 | * it is safe. |
1813 | * |
1814 | * context is passed through to PyArray_GetArrayParamsFromObject |
1815 | */ |
1816 | |
1817 | /*NUMPY_API |
1818 | * steals a reference to descr -- accepts NULL |
1819 | */ |
1820 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
1821 | PyArray_CheckFromAny(PyObject *op, PyArray_Descr *descr, int min_depth, |
1822 | int max_depth, int requires, PyObject *context) |
1823 | { |
1824 | PyObject *obj; |
1825 | if (requires & NPY_ARRAY_NOTSWAPPED0x0200) { |
1826 | if (!descr && PyArray_Check(op)((((PyObject*)(op))->ob_type) == (&PyArray_Type) || PyType_IsSubtype ((((PyObject*)(op))->ob_type), (&PyArray_Type))) && |
1827 | PyArray_ISBYTESWAPPED((PyArrayObject* )op)(!((PyArray_DESCR((PyArrayObject* )op)->byteorder) != '>' ))) { |
1828 | descr = PyArray_DescrNew(PyArray_DESCR((PyArrayObject *)op)); |
1829 | } |
1830 | else if (descr && !PyArray_ISNBO(descr->byteorder)((descr->byteorder) != '>')) { |
1831 | PyArray_DESCR_REPLACE(descr)do { PyArray_Descr *_new_; _new_ = PyArray_DescrNew(descr); _Py_XDECREF (((PyObject*)(descr))); descr = _new_; } while(0); |
1832 | } |
1833 | if (descr && descr->byteorder != NPY_IGNORE'|') { |
1834 | descr->byteorder = NPY_NATIVE'='; |
1835 | } |
1836 | } |
1837 | |
1838 | obj = PyArray_FromAny(op, descr, min_depth, max_depth, requires, context); |
1839 | if (obj == NULL((void*)0)) { |
1840 | return NULL((void*)0); |
1841 | } |
1842 | if ((requires & NPY_ARRAY_ELEMENTSTRIDES0x0080) && |
1843 | !PyArray_ElementStrides(obj)) { |
1844 | PyObject *ret; |
1845 | ret = PyArray_NewCopy((PyArrayObject *)obj, NPY_ANYORDER); |
1846 | Py_DECREF(obj)_Py_DECREF(((PyObject*)(obj))); |
1847 | obj = ret; |
1848 | } |
1849 | return obj; |
1850 | } |
1851 | |
1852 | |
1853 | /*NUMPY_API |
1854 | * steals reference to newtype --- acc. NULL |
1855 | */ |
1856 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
1857 | PyArray_FromArray(PyArrayObject *arr, PyArray_Descr *newtype, int flags) |
1858 | { |
1859 | |
1860 | PyArrayObject *ret = NULL((void*)0); |
1861 | int copy = 0; |
1862 | int arrflags; |
1863 | PyArray_Descr *oldtype; |
1864 | NPY_CASTING casting = NPY_SAFE_CASTING; |
1865 | |
1866 | oldtype = PyArray_DESCR(arr); |
1867 | if (newtype == NULL((void*)0)) { |
1868 | /* |
1869 | * Check if object is of array with Null newtype. |
1870 | * If so return it directly instead of checking for casting. |
1871 | */ |
1872 | if (flags == 0) { |
1873 | Py_INCREF(arr)_Py_INCREF(((PyObject*)(arr))); |
1874 | return (PyObject *)arr; |
1875 | } |
1876 | newtype = oldtype; |
1877 | Py_INCREF(oldtype)_Py_INCREF(((PyObject*)(oldtype))); |
1878 | } |
1879 | else if (PyDataType_ISUNSIZED(newtype)((newtype)->elsize == 0 && !(((PyArray_Descr *)(newtype ))->names != ((void*)0)))) { |
1880 | PyArray_DESCR_REPLACE(newtype)do { PyArray_Descr *_new_; _new_ = PyArray_DescrNew(newtype); _Py_XDECREF(((PyObject*)(newtype))); newtype = _new_; } while (0); |
1881 | if (newtype == NULL((void*)0)) { |
1882 | return NULL((void*)0); |
1883 | } |
1884 | newtype->elsize = oldtype->elsize; |
1885 | } |
1886 | |
1887 | /* If the casting if forced, use the 'unsafe' casting rule */ |
1888 | if (flags & NPY_ARRAY_FORCECAST0x0010) { |
1889 | casting = NPY_UNSAFE_CASTING; |
1890 | } |
1891 | |
1892 | /* Raise an error if the casting rule isn't followed */ |
1893 | if (!PyArray_CanCastArrayTo(arr, newtype, casting)) { |
1894 | PyErr_Clear(); |
1895 | npy_set_invalid_cast_error( |
1896 | PyArray_DESCR(arr), newtype, casting, PyArray_NDIM(arr) == 0); |
1897 | Py_DECREF(newtype)_Py_DECREF(((PyObject*)(newtype))); |
1898 | return NULL((void*)0); |
1899 | } |
1900 | |
1901 | arrflags = PyArray_FLAGS(arr); |
1902 | /* If a guaranteed copy was requested */ |
1903 | copy = (flags & NPY_ARRAY_ENSURECOPY0x0020) || |
1904 | /* If C contiguous was requested, and arr is not */ |
1905 | ((flags & NPY_ARRAY_C_CONTIGUOUS0x0001) && |
1906 | (!(arrflags & NPY_ARRAY_C_CONTIGUOUS0x0001))) || |
1907 | /* If an aligned array was requested, and arr is not */ |
1908 | ((flags & NPY_ARRAY_ALIGNED0x0100) && |
1909 | (!(arrflags & NPY_ARRAY_ALIGNED0x0100))) || |
1910 | /* If a Fortran contiguous array was requested, and arr is not */ |
1911 | ((flags & NPY_ARRAY_F_CONTIGUOUS0x0002) && |
1912 | (!(arrflags & NPY_ARRAY_F_CONTIGUOUS0x0002))) || |
1913 | /* If a writeable array was requested, and arr is not */ |
1914 | ((flags & NPY_ARRAY_WRITEABLE0x0400) && |
1915 | (!(arrflags & NPY_ARRAY_WRITEABLE0x0400))) || |
1916 | !PyArray_EquivTypes(oldtype, newtype); |
1917 | |
1918 | if (copy) { |
1919 | NPY_ORDER order = NPY_KEEPORDER; |
1920 | int subok = 1; |
1921 | |
1922 | /* Set the order for the copy being made based on the flags */ |
1923 | if (flags & NPY_ARRAY_F_CONTIGUOUS0x0002) { |
1924 | order = NPY_FORTRANORDER; |
1925 | } |
1926 | else if (flags & NPY_ARRAY_C_CONTIGUOUS0x0001) { |
1927 | order = NPY_CORDER; |
1928 | } |
1929 | |
1930 | if ((flags & NPY_ARRAY_ENSUREARRAY0x0040)) { |
1931 | subok = 0; |
1932 | } |
1933 | ret = (PyArrayObject *)PyArray_NewLikeArray(arr, order, |
1934 | newtype, subok); |
1935 | if (ret == NULL((void*)0)) { |
1936 | return NULL((void*)0); |
1937 | } |
1938 | |
1939 | if (PyArray_CopyInto(ret, arr) < 0) { |
1940 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
1941 | return NULL((void*)0); |
1942 | } |
1943 | |
1944 | if (flags & NPY_ARRAY_UPDATEIFCOPY0x1000) { |
1945 | /* This is the ONLY place the NPY_ARRAY_UPDATEIFCOPY flag |
1946 | * is still used. |
1947 | * Can be deleted once the flag itself is removed |
1948 | */ |
1949 | |
1950 | /* 2017-Nov-10 1.14 */ |
1951 | if (DEPRECATE(PyErr_WarnEx(PyExc_DeprecationWarning,"NPY_ARRAY_UPDATEIFCOPY, NPY_ARRAY_INOUT_ARRAY, and " "NPY_ARRAY_INOUT_FARRAY are deprecated, use NPY_WRITEBACKIFCOPY, " "NPY_ARRAY_INOUT_ARRAY2, or NPY_ARRAY_INOUT_FARRAY2 respectively " "instead, and call PyArray_ResolveWritebackIfCopy before the " "array is deallocated, i.e. before the last call to Py_DECREF." ,1) |
1952 | "NPY_ARRAY_UPDATEIFCOPY, NPY_ARRAY_INOUT_ARRAY, and "PyErr_WarnEx(PyExc_DeprecationWarning,"NPY_ARRAY_UPDATEIFCOPY, NPY_ARRAY_INOUT_ARRAY, and " "NPY_ARRAY_INOUT_FARRAY are deprecated, use NPY_WRITEBACKIFCOPY, " "NPY_ARRAY_INOUT_ARRAY2, or NPY_ARRAY_INOUT_FARRAY2 respectively " "instead, and call PyArray_ResolveWritebackIfCopy before the " "array is deallocated, i.e. before the last call to Py_DECREF." ,1) |
1953 | "NPY_ARRAY_INOUT_FARRAY are deprecated, use NPY_WRITEBACKIFCOPY, "PyErr_WarnEx(PyExc_DeprecationWarning,"NPY_ARRAY_UPDATEIFCOPY, NPY_ARRAY_INOUT_ARRAY, and " "NPY_ARRAY_INOUT_FARRAY are deprecated, use NPY_WRITEBACKIFCOPY, " "NPY_ARRAY_INOUT_ARRAY2, or NPY_ARRAY_INOUT_FARRAY2 respectively " "instead, and call PyArray_ResolveWritebackIfCopy before the " "array is deallocated, i.e. before the last call to Py_DECREF." ,1) |
1954 | "NPY_ARRAY_INOUT_ARRAY2, or NPY_ARRAY_INOUT_FARRAY2 respectively "PyErr_WarnEx(PyExc_DeprecationWarning,"NPY_ARRAY_UPDATEIFCOPY, NPY_ARRAY_INOUT_ARRAY, and " "NPY_ARRAY_INOUT_FARRAY are deprecated, use NPY_WRITEBACKIFCOPY, " "NPY_ARRAY_INOUT_ARRAY2, or NPY_ARRAY_INOUT_FARRAY2 respectively " "instead, and call PyArray_ResolveWritebackIfCopy before the " "array is deallocated, i.e. before the last call to Py_DECREF." ,1) |
1955 | "instead, and call PyArray_ResolveWritebackIfCopy before the "PyErr_WarnEx(PyExc_DeprecationWarning,"NPY_ARRAY_UPDATEIFCOPY, NPY_ARRAY_INOUT_ARRAY, and " "NPY_ARRAY_INOUT_FARRAY are deprecated, use NPY_WRITEBACKIFCOPY, " "NPY_ARRAY_INOUT_ARRAY2, or NPY_ARRAY_INOUT_FARRAY2 respectively " "instead, and call PyArray_ResolveWritebackIfCopy before the " "array is deallocated, i.e. before the last call to Py_DECREF." ,1) |
1956 | "array is deallocated, i.e. before the last call to Py_DECREF.")PyErr_WarnEx(PyExc_DeprecationWarning,"NPY_ARRAY_UPDATEIFCOPY, NPY_ARRAY_INOUT_ARRAY, and " "NPY_ARRAY_INOUT_FARRAY are deprecated, use NPY_WRITEBACKIFCOPY, " "NPY_ARRAY_INOUT_ARRAY2, or NPY_ARRAY_INOUT_FARRAY2 respectively " "instead, and call PyArray_ResolveWritebackIfCopy before the " "array is deallocated, i.e. before the last call to Py_DECREF." ,1) < 0) { |
1957 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
1958 | return NULL((void*)0); |
1959 | } |
1960 | Py_INCREF(arr)_Py_INCREF(((PyObject*)(arr))); |
1961 | if (PyArray_SetWritebackIfCopyBase(ret, arr) < 0) { |
1962 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
1963 | return NULL((void*)0); |
1964 | } |
1965 | PyArray_ENABLEFLAGS(ret, NPY_ARRAY_UPDATEIFCOPY0x1000); |
1966 | PyArray_CLEARFLAGS(ret, NPY_ARRAY_WRITEBACKIFCOPY0x2000); |
1967 | } |
1968 | else if (flags & NPY_ARRAY_WRITEBACKIFCOPY0x2000) { |
1969 | Py_INCREF(arr)_Py_INCREF(((PyObject*)(arr))); |
1970 | if (PyArray_SetWritebackIfCopyBase(ret, arr) < 0) { |
1971 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
1972 | return NULL((void*)0); |
1973 | } |
1974 | } |
1975 | } |
1976 | /* |
1977 | * If no copy then take an appropriate view if necessary, or |
1978 | * just return a reference to ret itself. |
1979 | */ |
1980 | else { |
1981 | int needview = ((flags & NPY_ARRAY_ENSUREARRAY0x0040) && |
1982 | !PyArray_CheckExact(arr)(((PyObject*)(arr))->ob_type == &PyArray_Type)); |
1983 | |
1984 | Py_DECREF(newtype)_Py_DECREF(((PyObject*)(newtype))); |
1985 | if (needview) { |
1986 | PyTypeObject *subtype = NULL((void*)0); |
1987 | |
1988 | if (flags & NPY_ARRAY_ENSUREARRAY0x0040) { |
1989 | subtype = &PyArray_Type; |
1990 | } |
1991 | |
1992 | ret = (PyArrayObject *)PyArray_View(arr, NULL((void*)0), subtype); |
1993 | if (ret == NULL((void*)0)) { |
1994 | return NULL((void*)0); |
1995 | } |
1996 | } |
1997 | else { |
1998 | Py_INCREF(arr)_Py_INCREF(((PyObject*)(arr))); |
1999 | ret = arr; |
2000 | } |
2001 | } |
2002 | |
2003 | return (PyObject *)ret; |
2004 | } |
2005 | |
2006 | /*NUMPY_API */ |
2007 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
2008 | PyArray_FromStructInterface(PyObject *input) |
2009 | { |
2010 | PyArray_Descr *thetype = NULL((void*)0); |
2011 | PyArrayInterface *inter; |
2012 | PyObject *attr; |
2013 | char endian = NPY_NATBYTE'<'; |
2014 | |
2015 | attr = PyArray_LookupSpecial_OnInstance(input, "__array_struct__"); |
2016 | if (attr == NULL((void*)0)) { |
2017 | if (PyErr_Occurred()) { |
2018 | return NULL((void*)0); |
2019 | } else { |
2020 | return Py_NotImplemented(&_Py_NotImplementedStruct); |
2021 | } |
2022 | } |
2023 | if (!PyCapsule_CheckExact(attr)((((PyObject*)(attr))->ob_type) == &PyCapsule_Type)) { |
2024 | if (PyType_Check(input)((((((PyObject*)(input))->ob_type))->tp_flags & ((1UL << 31))) != 0) && PyObject_HasAttrString(attr, "__get__")) { |
2025 | /* |
2026 | * If the input is a class `attr` should be a property-like object. |
2027 | * This cannot be interpreted as an array, but is a valid. |
2028 | * (Needed due to the lookup being on the instance rather than type) |
2029 | */ |
2030 | Py_DECREF(attr)_Py_DECREF(((PyObject*)(attr))); |
2031 | return Py_NotImplemented(&_Py_NotImplementedStruct); |
2032 | } |
2033 | goto fail; |
2034 | } |
2035 | inter = PyCapsule_GetPointer(attr, NULL((void*)0)); |
2036 | if (inter == NULL((void*)0)) { |
2037 | goto fail; |
2038 | } |
2039 | if (inter->two != 2) { |
2040 | goto fail; |
2041 | } |
2042 | if ((inter->flags & NPY_ARRAY_NOTSWAPPED0x0200) != NPY_ARRAY_NOTSWAPPED0x0200) { |
2043 | endian = NPY_OPPBYTE'>'; |
2044 | inter->flags &= ~NPY_ARRAY_NOTSWAPPED0x0200; |
2045 | } |
2046 | |
2047 | if (inter->flags & NPY_ARR_HAS_DESCR0x0800) { |
2048 | if (PyArray_DescrConverter(inter->descr, &thetype) == NPY_FAIL0) { |
2049 | thetype = NULL((void*)0); |
2050 | PyErr_Clear(); |
2051 | } |
2052 | } |
2053 | |
2054 | if (thetype == NULL((void*)0)) { |
2055 | PyObject *type_str = PyUnicode_FromFormat( |
2056 | "%c%c%d", endian, inter->typekind, inter->itemsize); |
2057 | if (type_str == NULL((void*)0)) { |
2058 | Py_DECREF(attr)_Py_DECREF(((PyObject*)(attr))); |
2059 | return NULL((void*)0); |
2060 | } |
2061 | int ok = PyArray_DescrConverter(type_str, &thetype); |
2062 | Py_DECREF(type_str)_Py_DECREF(((PyObject*)(type_str))); |
2063 | if (ok != NPY_SUCCEED1) { |
2064 | Py_DECREF(attr)_Py_DECREF(((PyObject*)(attr))); |
2065 | return NULL((void*)0); |
2066 | } |
2067 | } |
2068 | |
2069 | PyObject *ret = PyArray_NewFromDescrAndBase( |
2070 | &PyArray_Type, thetype, |
2071 | inter->nd, inter->shape, inter->strides, inter->data, |
2072 | inter->flags, NULL((void*)0), input); |
2073 | Py_DECREF(attr)_Py_DECREF(((PyObject*)(attr))); |
2074 | return ret; |
2075 | |
2076 | fail: |
2077 | PyErr_SetString(PyExc_ValueError, "invalid __array_struct__"); |
2078 | Py_DECREF(attr)_Py_DECREF(((PyObject*)(attr))); |
2079 | return NULL((void*)0); |
2080 | } |
2081 | |
2082 | /* |
2083 | * Checks if the object in descr is the default 'descr' member for the |
2084 | * __array_interface__ dictionary with 'typestr' member typestr. |
2085 | */ |
2086 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int |
2087 | _is_default_descr(PyObject *descr, PyObject *typestr) { |
2088 | if (!PyList_Check(descr)((((((PyObject*)(descr))->ob_type))->tp_flags & ((1UL << 25))) != 0) || PyList_GET_SIZE(descr)(((void) (0)), (((PyVarObject*)(descr))->ob_size)) != 1) { |
2089 | return 0; |
2090 | } |
2091 | PyObject *tuple = PyList_GET_ITEM(descr, 0)(((PyListObject *)(descr))->ob_item[0]); |
2092 | if (!(PyTuple_Check(tuple)((((((PyObject*)(tuple))->ob_type))->tp_flags & ((1UL << 26))) != 0) && PyTuple_GET_SIZE(tuple)(((PyVarObject*)((((void) (0)), (PyTupleObject *)(tuple))))-> ob_size) == 2)) { |
2093 | return 0; |
2094 | } |
2095 | PyObject *name = PyTuple_GET_ITEM(tuple, 0)((((void) (0)), (PyTupleObject *)(tuple))->ob_item[0]); |
2096 | if (!(PyUnicode_Check(name)((((((PyObject*)(name))->ob_type))->tp_flags & ((1UL << 28))) != 0) && PyUnicode_GetLength(name) == 0)) { |
2097 | return 0; |
2098 | } |
2099 | PyObject *typestr2 = PyTuple_GET_ITEM(tuple, 1)((((void) (0)), (PyTupleObject *)(tuple))->ob_item[1]); |
2100 | return PyObject_RichCompareBool(typestr, typestr2, Py_EQ2); |
2101 | } |
2102 | |
2103 | |
2104 | /* |
2105 | * A helper function to transition away from ignoring errors during |
2106 | * special attribute lookups during array coercion. |
2107 | */ |
2108 | static NPY_INLINEinline int |
2109 | deprecated_lookup_error_clearing(PyTypeObject *type, char *attribute) |
2110 | { |
2111 | PyObject *exc_type, *exc_value, *traceback; |
2112 | PyErr_Fetch(&exc_type, &exc_value, &traceback); |
2113 | |
2114 | /* DEPRECATED 2021-05-12, NumPy 1.21. */ |
2115 | int res = PyErr_WarnFormat(PyExc_DeprecationWarning, 1, |
2116 | "An exception was ignored while fetching the attribute `%s` from " |
2117 | "an object of type '%s'. With the exception of `AttributeError` " |
2118 | "NumPy will always raise this exception in the future. Raise this " |
2119 | "deprecation warning to see the original exception. " |
2120 | "(Warning added NumPy 1.21)", attribute, type->tp_name); |
2121 | |
2122 | if (res < 0) { |
2123 | npy_PyErr_ChainExceptionsCause(exc_type, exc_value, traceback); |
2124 | return -1; |
2125 | } |
2126 | else { |
2127 | /* `PyErr_Fetch` cleared the original error, delete the references */ |
2128 | Py_DECREF(exc_type)_Py_DECREF(((PyObject*)(exc_type))); |
2129 | Py_XDECREF(exc_value)_Py_XDECREF(((PyObject*)(exc_value))); |
2130 | Py_XDECREF(traceback)_Py_XDECREF(((PyObject*)(traceback))); |
2131 | return 0; |
2132 | } |
2133 | } |
2134 | |
2135 | |
2136 | /*NUMPY_API*/ |
2137 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
2138 | PyArray_FromInterface(PyObject *origin) |
2139 | { |
2140 | PyObject *iface = NULL((void*)0); |
2141 | PyObject *attr = NULL((void*)0); |
2142 | PyObject *base = NULL((void*)0); |
2143 | PyArrayObject *ret; |
2144 | PyArray_Descr *dtype = NULL((void*)0); |
2145 | char *data = NULL((void*)0); |
2146 | Py_buffer view; |
2147 | int i, n; |
2148 | npy_intp dims[NPY_MAXDIMS32], strides[NPY_MAXDIMS32]; |
2149 | int dataflags = NPY_ARRAY_BEHAVED(0x0100 | 0x0400); |
2150 | |
2151 | iface = PyArray_LookupSpecial_OnInstance(origin, "__array_interface__"); |
2152 | |
2153 | if (iface == NULL((void*)0)) { |
2154 | if (PyErr_Occurred()) { |
2155 | if (PyErr_ExceptionMatches(PyExc_RecursionError) || |
2156 | PyErr_ExceptionMatches(PyExc_MemoryError)) { |
2157 | /* RecursionError and MemoryError are considered fatal */ |
2158 | return NULL((void*)0); |
2159 | } |
2160 | if (deprecated_lookup_error_clearing( |
2161 | Py_TYPE(origin)(((PyObject*)(origin))->ob_type), "__array_interface__") < 0) { |
2162 | return NULL((void*)0); |
2163 | } |
2164 | } |
2165 | return Py_NotImplemented(&_Py_NotImplementedStruct); |
2166 | } |
2167 | if (!PyDict_Check(iface)((((((PyObject*)(iface))->ob_type))->tp_flags & ((1UL << 29))) != 0)) { |
2168 | if (PyType_Check(origin)((((((PyObject*)(origin))->ob_type))->tp_flags & (( 1UL << 31))) != 0) && PyObject_HasAttrString(iface, "__get__")) { |
2169 | /* |
2170 | * If the input is a class `iface` should be a property-like object. |
2171 | * This cannot be interpreted as an array, but is a valid. |
2172 | * (Needed due to the lookup being on the instance rather than type) |
2173 | */ |
2174 | Py_DECREF(iface)_Py_DECREF(((PyObject*)(iface))); |
2175 | return Py_NotImplemented(&_Py_NotImplementedStruct); |
2176 | } |
2177 | |
2178 | Py_DECREF(iface)_Py_DECREF(((PyObject*)(iface))); |
2179 | PyErr_SetString(PyExc_ValueError, |
2180 | "Invalid __array_interface__ value, must be a dict"); |
2181 | return NULL((void*)0); |
2182 | } |
2183 | |
2184 | /* Get type string from interface specification */ |
2185 | attr = _PyDict_GetItemStringWithError(iface, "typestr"); |
2186 | if (attr == NULL((void*)0)) { |
2187 | Py_DECREF(iface)_Py_DECREF(((PyObject*)(iface))); |
2188 | if (!PyErr_Occurred()) { |
2189 | PyErr_SetString(PyExc_ValueError, |
2190 | "Missing __array_interface__ typestr"); |
2191 | } |
2192 | return NULL((void*)0); |
2193 | } |
2194 | |
2195 | /* allow bytes for backwards compatibility */ |
2196 | if (!PyBytes_Check(attr)((((((PyObject*)(attr))->ob_type))->tp_flags & ((1UL << 27))) != 0) && !PyUnicode_Check(attr)((((((PyObject*)(attr))->ob_type))->tp_flags & ((1UL << 28))) != 0)) { |
2197 | PyErr_SetString(PyExc_TypeError, |
2198 | "__array_interface__ typestr must be a string"); |
2199 | goto fail; |
2200 | } |
2201 | |
2202 | /* Get dtype from type string */ |
2203 | if (PyArray_DescrConverter(attr, &dtype) != NPY_SUCCEED1) { |
2204 | goto fail; |
2205 | } |
2206 | |
2207 | /* |
2208 | * If the dtype is NPY_VOID, see if there is extra information in |
2209 | * the 'descr' attribute. |
2210 | */ |
2211 | if (dtype->type_num == NPY_VOID) { |
2212 | PyObject *descr = _PyDict_GetItemStringWithError(iface, "descr"); |
2213 | if (descr == NULL((void*)0) && PyErr_Occurred()) { |
2214 | goto fail; |
2215 | } |
2216 | PyArray_Descr *new_dtype = NULL((void*)0); |
2217 | if (descr != NULL((void*)0)) { |
2218 | int is_default = _is_default_descr(descr, attr); |
2219 | if (is_default < 0) { |
2220 | goto fail; |
2221 | } |
2222 | if (!is_default) { |
2223 | if (PyArray_DescrConverter2(descr, &new_dtype) != NPY_SUCCEED1) { |
2224 | goto fail; |
2225 | } |
2226 | if (new_dtype != NULL((void*)0)) { |
2227 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
2228 | dtype = new_dtype; |
2229 | } |
2230 | } |
2231 | |
2232 | } |
2233 | |
2234 | } |
2235 | |
2236 | /* Get shape tuple from interface specification */ |
2237 | attr = _PyDict_GetItemStringWithError(iface, "shape"); |
2238 | if (attr == NULL((void*)0)) { |
2239 | if (PyErr_Occurred()) { |
2240 | return NULL((void*)0); |
2241 | } |
2242 | /* Shape must be specified when 'data' is specified */ |
2243 | PyObject *data = _PyDict_GetItemStringWithError(iface, "data"); |
2244 | if (data == NULL((void*)0) && PyErr_Occurred()) { |
2245 | return NULL((void*)0); |
2246 | } |
2247 | else if (data != NULL((void*)0)) { |
2248 | Py_DECREF(iface)_Py_DECREF(((PyObject*)(iface))); |
2249 | PyErr_SetString(PyExc_ValueError, |
2250 | "Missing __array_interface__ shape"); |
2251 | return NULL((void*)0); |
2252 | } |
2253 | /* Assume shape as scalar otherwise */ |
2254 | else { |
2255 | /* NOTE: pointers to data and base should be NULL */ |
2256 | n = dims[0] = 0; |
2257 | } |
2258 | } |
2259 | /* Make sure 'shape' is a tuple */ |
2260 | else if (!PyTuple_Check(attr)((((((PyObject*)(attr))->ob_type))->tp_flags & ((1UL << 26))) != 0)) { |
2261 | PyErr_SetString(PyExc_TypeError, |
2262 | "shape must be a tuple"); |
2263 | goto fail; |
2264 | } |
2265 | /* Get dimensions from shape tuple */ |
2266 | else { |
2267 | n = PyTuple_GET_SIZE(attr)(((PyVarObject*)((((void) (0)), (PyTupleObject *)(attr))))-> ob_size); |
2268 | for (i = 0; i < n; i++) { |
2269 | PyObject *tmp = PyTuple_GET_ITEM(attr, i)((((void) (0)), (PyTupleObject *)(attr))->ob_item[i]); |
2270 | dims[i] = PyArray_PyIntAsIntp(tmp); |
2271 | if (error_converting(dims[i])(((dims[i]) == -1) && PyErr_Occurred())) { |
2272 | goto fail; |
2273 | } |
2274 | } |
2275 | } |
2276 | |
2277 | /* Get data buffer from interface specification */ |
2278 | attr = _PyDict_GetItemStringWithError(iface, "data"); |
2279 | if (attr == NULL((void*)0) && PyErr_Occurred()){ |
2280 | return NULL((void*)0); |
2281 | } |
2282 | |
2283 | /* Case for data access through pointer */ |
2284 | if (attr && PyTuple_Check(attr)((((((PyObject*)(attr))->ob_type))->tp_flags & ((1UL << 26))) != 0)) { |
2285 | PyObject *dataptr; |
2286 | if (PyTuple_GET_SIZE(attr)(((PyVarObject*)((((void) (0)), (PyTupleObject *)(attr))))-> ob_size) != 2) { |
2287 | PyErr_SetString(PyExc_TypeError, |
2288 | "__array_interface__ data must be a 2-tuple with " |
2289 | "(data pointer integer, read-only flag)"); |
2290 | goto fail; |
2291 | } |
2292 | dataptr = PyTuple_GET_ITEM(attr, 0)((((void) (0)), (PyTupleObject *)(attr))->ob_item[0]); |
2293 | if (PyLong_Check(dataptr)((((((PyObject*)(dataptr))->ob_type))->tp_flags & ( (1UL << 24))) != 0)) { |
2294 | data = PyLong_AsVoidPtr(dataptr); |
2295 | if (data == NULL((void*)0) && PyErr_Occurred()) { |
2296 | goto fail; |
2297 | } |
2298 | } |
2299 | else { |
2300 | PyErr_SetString(PyExc_TypeError, |
2301 | "first element of __array_interface__ data tuple " |
2302 | "must be an integer."); |
2303 | goto fail; |
2304 | } |
2305 | if (PyObject_IsTrue(PyTuple_GET_ITEM(attr,1)((((void) (0)), (PyTupleObject *)(attr))->ob_item[1]))) { |
2306 | dataflags &= ~NPY_ARRAY_WRITEABLE0x0400; |
2307 | } |
2308 | base = origin; |
2309 | } |
2310 | |
2311 | /* Case for data access through buffer */ |
2312 | else if (attr) { |
2313 | if (attr != Py_None(&_Py_NoneStruct)) { |
2314 | base = attr; |
2315 | } |
2316 | else { |
2317 | base = origin; |
2318 | } |
2319 | if (PyObject_GetBuffer(base, &view, |
2320 | PyBUF_WRITABLE0x0001|PyBUF_SIMPLE0) < 0) { |
2321 | PyErr_Clear(); |
2322 | if (PyObject_GetBuffer(base, &view, |
2323 | PyBUF_SIMPLE0) < 0) { |
2324 | goto fail; |
2325 | } |
2326 | dataflags &= ~NPY_ARRAY_WRITEABLE0x0400; |
2327 | } |
2328 | data = (char *)view.buf; |
2329 | /* |
2330 | * In Python 3 both of the deprecated functions PyObject_AsWriteBuffer and |
2331 | * PyObject_AsReadBuffer that this code replaces release the buffer. It is |
2332 | * up to the object that supplies the buffer to guarantee that the buffer |
2333 | * sticks around after the release. |
2334 | */ |
2335 | PyBuffer_Release(&view); |
2336 | |
2337 | /* Get offset number from interface specification */ |
2338 | attr = _PyDict_GetItemStringWithError(iface, "offset"); |
2339 | if (attr == NULL((void*)0) && PyErr_Occurred()) { |
2340 | goto fail; |
2341 | } |
2342 | else if (attr) { |
2343 | npy_longlong num = PyLong_AsLongLong(attr); |
2344 | if (error_converting(num)(((num) == -1) && PyErr_Occurred())) { |
2345 | PyErr_SetString(PyExc_TypeError, |
2346 | "__array_interface__ offset must be an integer"); |
2347 | goto fail; |
2348 | } |
2349 | data += num; |
2350 | } |
2351 | } |
2352 | |
2353 | ret = (PyArrayObject *)PyArray_NewFromDescrAndBase( |
2354 | &PyArray_Type, dtype, |
2355 | n, dims, NULL((void*)0), data, |
2356 | dataflags, NULL((void*)0), base); |
2357 | /* |
2358 | * Ref to dtype was stolen by PyArray_NewFromDescrAndBase |
2359 | * Prevent DECREFing dtype in fail codepath by setting to NULL |
2360 | */ |
2361 | dtype = NULL((void*)0); |
2362 | if (ret == NULL((void*)0)) { |
2363 | goto fail; |
2364 | } |
2365 | if (data == NULL((void*)0)) { |
2366 | if (PyArray_SIZE(ret)PyArray_MultiplyList(PyArray_DIMS(ret), PyArray_NDIM(ret)) > 1) { |
2367 | PyErr_SetString(PyExc_ValueError, |
2368 | "cannot coerce scalar to array with size > 1"); |
2369 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
2370 | goto fail; |
2371 | } |
2372 | if (PyArray_SETITEM(ret, PyArray_DATA(ret), origin) < 0) { |
2373 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
2374 | goto fail; |
2375 | } |
2376 | } |
2377 | attr = _PyDict_GetItemStringWithError(iface, "strides"); |
2378 | if (attr == NULL((void*)0) && PyErr_Occurred()){ |
2379 | return NULL((void*)0); |
2380 | } |
2381 | if (attr != NULL((void*)0) && attr != Py_None(&_Py_NoneStruct)) { |
2382 | if (!PyTuple_Check(attr)((((((PyObject*)(attr))->ob_type))->tp_flags & ((1UL << 26))) != 0)) { |
2383 | PyErr_SetString(PyExc_TypeError, |
2384 | "strides must be a tuple"); |
2385 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
2386 | goto fail; |
2387 | } |
2388 | if (n != PyTuple_GET_SIZE(attr)(((PyVarObject*)((((void) (0)), (PyTupleObject *)(attr))))-> ob_size)) { |
2389 | PyErr_SetString(PyExc_ValueError, |
2390 | "mismatch in length of strides and shape"); |
2391 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
2392 | goto fail; |
2393 | } |
2394 | for (i = 0; i < n; i++) { |
2395 | PyObject *tmp = PyTuple_GET_ITEM(attr, i)((((void) (0)), (PyTupleObject *)(attr))->ob_item[i]); |
2396 | strides[i] = PyArray_PyIntAsIntp(tmp); |
2397 | if (error_converting(strides[i])(((strides[i]) == -1) && PyErr_Occurred())) { |
2398 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
2399 | goto fail; |
2400 | } |
2401 | } |
2402 | if (n) { |
2403 | memcpy(PyArray_STRIDES(ret), strides, n*sizeof(npy_intp)); |
2404 | } |
2405 | } |
2406 | PyArray_UpdateFlags(ret, NPY_ARRAY_UPDATE_ALL(0x0001 | 0x0002 | 0x0100)); |
2407 | Py_DECREF(iface)_Py_DECREF(((PyObject*)(iface))); |
2408 | return (PyObject *)ret; |
2409 | |
2410 | fail: |
2411 | Py_XDECREF(dtype)_Py_XDECREF(((PyObject*)(dtype))); |
2412 | Py_XDECREF(iface)_Py_XDECREF(((PyObject*)(iface))); |
2413 | return NULL((void*)0); |
2414 | } |
2415 | |
2416 | /*NUMPY_API |
2417 | */ |
2418 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
2419 | PyArray_FromArrayAttr(PyObject *op, PyArray_Descr *typecode, PyObject *context) |
2420 | { |
2421 | PyObject *new; |
2422 | PyObject *array_meth; |
2423 | |
2424 | if (context != NULL((void*)0)) { |
2425 | PyErr_SetString(PyExc_RuntimeError, "'context' must be NULL"); |
2426 | return NULL((void*)0); |
2427 | } |
2428 | array_meth = PyArray_LookupSpecial_OnInstance(op, "__array__"); |
2429 | if (array_meth == NULL((void*)0)) { |
2430 | if (PyErr_Occurred()) { |
2431 | if (PyErr_ExceptionMatches(PyExc_RecursionError) || |
2432 | PyErr_ExceptionMatches(PyExc_MemoryError)) { |
2433 | /* RecursionError and MemoryError are considered fatal */ |
2434 | return NULL((void*)0); |
2435 | } |
2436 | if (deprecated_lookup_error_clearing( |
2437 | Py_TYPE(op)(((PyObject*)(op))->ob_type), "__array__") < 0) { |
2438 | return NULL((void*)0); |
2439 | } |
2440 | } |
2441 | return Py_NotImplemented(&_Py_NotImplementedStruct); |
2442 | } |
2443 | if (PyType_Check(op)((((((PyObject*)(op))->ob_type))->tp_flags & ((1UL << 31))) != 0) && PyObject_HasAttrString(array_meth, "__get__")) { |
2444 | /* |
2445 | * If the input is a class `array_meth` may be a property-like object. |
2446 | * This cannot be interpreted as an array (called), but is a valid. |
2447 | * Trying `array_meth.__call__()` on this should not be useful. |
2448 | * (Needed due to the lookup being on the instance rather than type) |
2449 | */ |
2450 | Py_DECREF(array_meth)_Py_DECREF(((PyObject*)(array_meth))); |
2451 | return Py_NotImplemented(&_Py_NotImplementedStruct); |
2452 | } |
2453 | if (typecode == NULL((void*)0)) { |
2454 | new = PyObject_CallFunction_PyObject_CallFunction_SizeT(array_meth, NULL((void*)0)); |
2455 | } |
2456 | else { |
2457 | new = PyObject_CallFunction_PyObject_CallFunction_SizeT(array_meth, "O", typecode); |
2458 | } |
2459 | Py_DECREF(array_meth)_Py_DECREF(((PyObject*)(array_meth))); |
2460 | if (new == NULL((void*)0)) { |
2461 | return NULL((void*)0); |
2462 | } |
2463 | if (!PyArray_Check(new)((((PyObject*)(new))->ob_type) == (&PyArray_Type) || PyType_IsSubtype ((((PyObject*)(new))->ob_type), (&PyArray_Type)))) { |
2464 | PyErr_SetString(PyExc_ValueError, |
2465 | "object __array__ method not " \ |
2466 | "producing an array"); |
2467 | Py_DECREF(new)_Py_DECREF(((PyObject*)(new))); |
2468 | return NULL((void*)0); |
2469 | } |
2470 | return new; |
2471 | } |
2472 | |
2473 | /*NUMPY_API |
2474 | * new reference -- accepts NULL for mintype |
2475 | */ |
2476 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyArray_Descr * |
2477 | PyArray_DescrFromObject(PyObject *op, PyArray_Descr *mintype) |
2478 | { |
2479 | PyArray_Descr *dtype; |
2480 | |
2481 | dtype = mintype; |
2482 | Py_XINCREF(dtype)_Py_XINCREF(((PyObject*)(dtype))); |
2483 | |
2484 | if (PyArray_DTypeFromObject(op, NPY_MAXDIMS32, &dtype) < 0) { |
2485 | return NULL((void*)0); |
2486 | } |
2487 | |
2488 | if (dtype == NULL((void*)0)) { |
2489 | return PyArray_DescrFromType(NPY_DEFAULT_TYPENPY_DOUBLE); |
2490 | } |
2491 | else { |
2492 | return dtype; |
2493 | } |
2494 | } |
2495 | |
2496 | /* These are also old calls (should use PyArray_NewFromDescr) */ |
2497 | |
2498 | /* They all zero-out the memory as previously done */ |
2499 | |
2500 | /* steals reference to descr -- and enforces native byteorder on it.*/ |
2501 | |
2502 | /*NUMPY_API |
2503 | Deprecated, use PyArray_NewFromDescr instead. |
2504 | */ |
2505 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
2506 | PyArray_FromDimsAndDataAndDescr(int NPY_UNUSED(nd)(__NPY_UNUSED_TAGGEDnd) __attribute__ ((__unused__)), int *NPY_UNUSED(d)(__NPY_UNUSED_TAGGEDd) __attribute__ ((__unused__)), |
2507 | PyArray_Descr *descr, |
2508 | char *NPY_UNUSED(data)(__NPY_UNUSED_TAGGEDdata) __attribute__ ((__unused__))) |
2509 | { |
2510 | PyErr_SetString(PyExc_NotImplementedError, |
2511 | "PyArray_FromDimsAndDataAndDescr: use PyArray_NewFromDescr."); |
2512 | Py_DECREF(descr)_Py_DECREF(((PyObject*)(descr))); |
2513 | return NULL((void*)0); |
2514 | } |
2515 | |
2516 | /*NUMPY_API |
2517 | Deprecated, use PyArray_SimpleNew instead. |
2518 | */ |
2519 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
2520 | PyArray_FromDims(int NPY_UNUSED(nd)(__NPY_UNUSED_TAGGEDnd) __attribute__ ((__unused__)), int *NPY_UNUSED(d)(__NPY_UNUSED_TAGGEDd) __attribute__ ((__unused__)), int NPY_UNUSED(type)(__NPY_UNUSED_TAGGEDtype) __attribute__ ((__unused__))) |
2521 | { |
2522 | PyErr_SetString(PyExc_NotImplementedError, |
2523 | "PyArray_FromDims: use PyArray_SimpleNew."); |
2524 | return NULL((void*)0); |
2525 | } |
2526 | |
2527 | /* end old calls */ |
2528 | |
2529 | /*NUMPY_API |
2530 | * This is a quick wrapper around |
2531 | * PyArray_FromAny(op, NULL, 0, 0, NPY_ARRAY_ENSUREARRAY, NULL) |
2532 | * that special cases Arrays and PyArray_Scalars up front |
2533 | * It *steals a reference* to the object |
2534 | * It also guarantees that the result is PyArray_Type |
2535 | * Because it decrefs op if any conversion needs to take place |
2536 | * so it can be used like PyArray_EnsureArray(some_function(...)) |
2537 | */ |
2538 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
2539 | PyArray_EnsureArray(PyObject *op) |
2540 | { |
2541 | PyObject *new; |
2542 | |
2543 | if ((op == NULL((void*)0)) || (PyArray_CheckExact(op)(((PyObject*)(op))->ob_type == &PyArray_Type))) { |
2544 | new = op; |
2545 | Py_XINCREF(new)_Py_XINCREF(((PyObject*)(new))); |
2546 | } |
2547 | else if (PyArray_Check(op)((((PyObject*)(op))->ob_type) == (&PyArray_Type) || PyType_IsSubtype ((((PyObject*)(op))->ob_type), (&PyArray_Type)))) { |
2548 | new = PyArray_View((PyArrayObject *)op, NULL((void*)0), &PyArray_Type); |
2549 | } |
2550 | else if (PyArray_IsScalar(op, Generic)(((((PyObject*)(op))->ob_type) == (&PyGenericArrType_Type ) || PyType_IsSubtype((((PyObject*)(op))->ob_type), (& PyGenericArrType_Type))))) { |
2551 | new = PyArray_FromScalar(op, NULL((void*)0)); |
2552 | } |
2553 | else { |
2554 | new = PyArray_FROM_OF(op, NPY_ARRAY_ENSUREARRAY)PyArray_CheckFromAny(op, ((void*)0), 0, 0, 0x0040, ((void*)0) ); |
2555 | } |
2556 | Py_XDECREF(op)_Py_XDECREF(((PyObject*)(op))); |
2557 | return new; |
2558 | } |
2559 | |
2560 | /*NUMPY_API*/ |
2561 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
2562 | PyArray_EnsureAnyArray(PyObject *op) |
2563 | { |
2564 | if (op && PyArray_Check(op)((((PyObject*)(op))->ob_type) == (&PyArray_Type) || PyType_IsSubtype ((((PyObject*)(op))->ob_type), (&PyArray_Type)))) { |
2565 | return op; |
2566 | } |
2567 | return PyArray_EnsureArray(op); |
2568 | } |
2569 | |
2570 | /* |
2571 | * Private implementation of PyArray_CopyAnyInto with an additional order |
2572 | * parameter. |
2573 | */ |
2574 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int |
2575 | PyArray_CopyAsFlat(PyArrayObject *dst, PyArrayObject *src, NPY_ORDER order) |
2576 | { |
2577 | NpyIter *dst_iter, *src_iter; |
2578 | |
2579 | NpyIter_IterNextFunc *dst_iternext, *src_iternext; |
2580 | char **dst_dataptr, **src_dataptr; |
2581 | npy_intp dst_stride, src_stride; |
2582 | npy_intp *dst_countptr, *src_countptr; |
2583 | npy_uint32 baseflags; |
2584 | |
2585 | npy_intp dst_count, src_count, count; |
2586 | npy_intp dst_size, src_size; |
2587 | int needs_api; |
2588 | |
2589 | NPY_BEGIN_THREADS_DEFPyThreadState *_save=((void*)0);; |
2590 | |
2591 | if (PyArray_FailUnlessWriteable(dst, "destination array") < 0) { |
2592 | return -1; |
2593 | } |
2594 | |
2595 | /* |
2596 | * If the shapes match and a particular order is forced |
2597 | * for both, use the more efficient CopyInto |
2598 | */ |
2599 | if (order != NPY_ANYORDER && order != NPY_KEEPORDER && |
2600 | PyArray_NDIM(dst) == PyArray_NDIM(src) && |
2601 | PyArray_CompareLists(PyArray_DIMS(dst), PyArray_DIMS(src), |
2602 | PyArray_NDIM(dst))) { |
2603 | return PyArray_CopyInto(dst, src); |
2604 | } |
2605 | |
2606 | dst_size = PyArray_SIZE(dst)PyArray_MultiplyList(PyArray_DIMS(dst), PyArray_NDIM(dst)); |
2607 | src_size = PyArray_SIZE(src)PyArray_MultiplyList(PyArray_DIMS(src), PyArray_NDIM(src)); |
2608 | if (dst_size != src_size) { |
2609 | PyErr_Format(PyExc_ValueError, |
2610 | "cannot copy from array of size %" NPY_INTP_FMT"ld" " into an array " |
2611 | "of size %" NPY_INTP_FMT"ld", src_size, dst_size); |
2612 | return -1; |
2613 | } |
2614 | |
2615 | /* Zero-sized arrays require nothing be done */ |
2616 | if (dst_size == 0) { |
2617 | return 0; |
2618 | } |
2619 | |
2620 | baseflags = NPY_ITER_EXTERNAL_LOOP0x00000008 | |
2621 | NPY_ITER_DONT_NEGATE_STRIDES0x00001000 | |
2622 | NPY_ITER_REFS_OK0x00000020; |
2623 | |
2624 | /* |
2625 | * This copy is based on matching C-order traversals of src and dst. |
2626 | * By using two iterators, we can find maximal sub-chunks that |
2627 | * can be processed at once. |
2628 | */ |
2629 | dst_iter = NpyIter_New(dst, NPY_ITER_WRITEONLY0x00040000 | baseflags, |
2630 | order, |
2631 | NPY_NO_CASTING, |
2632 | NULL((void*)0)); |
2633 | if (dst_iter == NULL((void*)0)) { |
2634 | return -1; |
2635 | } |
2636 | src_iter = NpyIter_New(src, NPY_ITER_READONLY0x00020000 | baseflags, |
2637 | order, |
2638 | NPY_NO_CASTING, |
2639 | NULL((void*)0)); |
2640 | if (src_iter == NULL((void*)0)) { |
2641 | NpyIter_Deallocate(dst_iter); |
2642 | return -1; |
2643 | } |
2644 | |
2645 | /* Get all the values needed for the inner loop */ |
2646 | dst_iternext = NpyIter_GetIterNext(dst_iter, NULL((void*)0)); |
2647 | dst_dataptr = NpyIter_GetDataPtrArray(dst_iter); |
2648 | /* Since buffering is disabled, we can cache the stride */ |
2649 | dst_stride = NpyIter_GetInnerStrideArray(dst_iter)[0]; |
2650 | dst_countptr = NpyIter_GetInnerLoopSizePtr(dst_iter); |
2651 | |
2652 | src_iternext = NpyIter_GetIterNext(src_iter, NULL((void*)0)); |
2653 | src_dataptr = NpyIter_GetDataPtrArray(src_iter); |
2654 | /* Since buffering is disabled, we can cache the stride */ |
2655 | src_stride = NpyIter_GetInnerStrideArray(src_iter)[0]; |
2656 | src_countptr = NpyIter_GetInnerLoopSizePtr(src_iter); |
2657 | |
2658 | if (dst_iternext == NULL((void*)0) || src_iternext == NULL((void*)0)) { |
2659 | NpyIter_Deallocate(dst_iter); |
2660 | NpyIter_Deallocate(src_iter); |
2661 | return -1; |
2662 | } |
2663 | |
2664 | needs_api = NpyIter_IterationNeedsAPI(dst_iter) || |
2665 | NpyIter_IterationNeedsAPI(src_iter); |
2666 | |
2667 | /* |
2668 | * Because buffering is disabled in the iterator, the inner loop |
2669 | * strides will be the same throughout the iteration loop. Thus, |
2670 | * we can pass them to this function to take advantage of |
2671 | * contiguous strides, etc. |
2672 | */ |
2673 | NPY_cast_info cast_info; |
2674 | if (PyArray_GetDTypeTransferFunction( |
2675 | IsUintAligned(src) && IsAligned(src) && |
2676 | IsUintAligned(dst) && IsAligned(dst), |
2677 | src_stride, dst_stride, |
2678 | PyArray_DESCR(src), PyArray_DESCR(dst), |
2679 | 0, |
2680 | &cast_info, &needs_api) != NPY_SUCCEED1) { |
2681 | NpyIter_Deallocate(dst_iter); |
2682 | NpyIter_Deallocate(src_iter); |
2683 | return -1; |
2684 | } |
2685 | |
2686 | if (!needs_api) { |
2687 | NPY_BEGIN_THREADSdo {_save = PyEval_SaveThread();} while (0);; |
2688 | } |
2689 | |
2690 | dst_count = *dst_countptr; |
2691 | src_count = *src_countptr; |
2692 | char *args[2] = {src_dataptr[0], dst_dataptr[0]}; |
2693 | npy_intp strides[2] = {src_stride, dst_stride}; |
2694 | |
2695 | int res = 0; |
2696 | for(;;) { |
2697 | /* Transfer the biggest amount that fits both */ |
2698 | count = (src_count < dst_count) ? src_count : dst_count; |
2699 | if (cast_info.func(&cast_info.context, |
2700 | args, &count, strides, cast_info.auxdata) < 0) { |
2701 | res = -1; |
2702 | break; |
2703 | } |
2704 | |
2705 | /* If we exhausted the dst block, refresh it */ |
2706 | if (dst_count == count) { |
2707 | res = dst_iternext(dst_iter); |
2708 | if (!res) { |
2709 | break; |
2710 | } |
2711 | dst_count = *dst_countptr; |
2712 | args[1] = dst_dataptr[0]; |
2713 | } |
2714 | else { |
2715 | dst_count -= count; |
2716 | args[1] += count*dst_stride; |
2717 | } |
2718 | |
2719 | /* If we exhausted the src block, refresh it */ |
2720 | if (src_count == count) { |
2721 | res = src_iternext(src_iter); |
2722 | if (!res) { |
2723 | break; |
2724 | } |
2725 | src_count = *src_countptr; |
2726 | args[0] = src_dataptr[0]; |
2727 | } |
2728 | else { |
2729 | src_count -= count; |
2730 | args[0] += count*src_stride; |
2731 | } |
2732 | } |
2733 | |
2734 | NPY_END_THREADSdo { if (_save) { PyEval_RestoreThread(_save); _save = ((void *)0);} } while (0);; |
2735 | |
2736 | NPY_cast_info_xfree(&cast_info); |
2737 | NpyIter_Deallocate(dst_iter); |
2738 | NpyIter_Deallocate(src_iter); |
2739 | if (res > 0) { |
2740 | /* The iteration stopped successfully, do not report an error */ |
2741 | return 0; |
2742 | } |
2743 | return res; |
2744 | } |
2745 | |
2746 | /*NUMPY_API |
2747 | * Copy an Array into another array -- memory must not overlap |
2748 | * Does not require src and dest to have "broadcastable" shapes |
2749 | * (only the same number of elements). |
2750 | * |
2751 | * TODO: For NumPy 2.0, this could accept an order parameter which |
2752 | * only allows NPY_CORDER and NPY_FORDER. Could also rename |
2753 | * this to CopyAsFlat to make the name more intuitive. |
2754 | * |
2755 | * Returns 0 on success, -1 on error. |
2756 | */ |
2757 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int |
2758 | PyArray_CopyAnyInto(PyArrayObject *dst, PyArrayObject *src) |
2759 | { |
2760 | return PyArray_CopyAsFlat(dst, src, NPY_CORDER); |
2761 | } |
2762 | |
2763 | /*NUMPY_API |
2764 | * Copy an Array into another array. |
2765 | * Broadcast to the destination shape if necessary. |
2766 | * |
2767 | * Returns 0 on success, -1 on failure. |
2768 | */ |
2769 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int |
2770 | PyArray_CopyInto(PyArrayObject *dst, PyArrayObject *src) |
2771 | { |
2772 | return PyArray_AssignArray(dst, src, NULL((void*)0), NPY_UNSAFE_CASTING); |
2773 | } |
2774 | |
2775 | /*NUMPY_API |
2776 | * Move the memory of one array into another, allowing for overlapping data. |
2777 | * |
2778 | * Returns 0 on success, negative on failure. |
2779 | */ |
2780 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int |
2781 | PyArray_MoveInto(PyArrayObject *dst, PyArrayObject *src) |
2782 | { |
2783 | return PyArray_AssignArray(dst, src, NULL((void*)0), NPY_UNSAFE_CASTING); |
2784 | } |
2785 | |
2786 | /*NUMPY_API |
2787 | * PyArray_CheckAxis |
2788 | * |
2789 | * check that axis is valid |
2790 | * convert 0-d arrays to 1-d arrays |
2791 | */ |
2792 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
2793 | PyArray_CheckAxis(PyArrayObject *arr, int *axis, int flags) |
2794 | { |
2795 | PyObject *temp1, *temp2; |
2796 | int n = PyArray_NDIM(arr); |
2797 | |
2798 | if (*axis == NPY_MAXDIMS32 || n == 0) { |
2799 | if (n != 1) { |
2800 | temp1 = PyArray_Ravel(arr,0); |
2801 | if (temp1 == NULL((void*)0)) { |
2802 | *axis = 0; |
2803 | return NULL((void*)0); |
2804 | } |
2805 | if (*axis == NPY_MAXDIMS32) { |
2806 | *axis = PyArray_NDIM((PyArrayObject *)temp1)-1; |
2807 | } |
2808 | } |
2809 | else { |
2810 | temp1 = (PyObject *)arr; |
2811 | Py_INCREF(temp1)_Py_INCREF(((PyObject*)(temp1))); |
2812 | *axis = 0; |
2813 | } |
2814 | if (!flags && *axis == 0) { |
2815 | return temp1; |
2816 | } |
2817 | } |
2818 | else { |
2819 | temp1 = (PyObject *)arr; |
2820 | Py_INCREF(temp1)_Py_INCREF(((PyObject*)(temp1))); |
2821 | } |
2822 | if (flags) { |
2823 | temp2 = PyArray_CheckFromAny((PyObject *)temp1, NULL((void*)0), |
2824 | 0, 0, flags, NULL((void*)0)); |
2825 | Py_DECREF(temp1)_Py_DECREF(((PyObject*)(temp1))); |
2826 | if (temp2 == NULL((void*)0)) { |
2827 | return NULL((void*)0); |
2828 | } |
2829 | } |
2830 | else { |
2831 | temp2 = (PyObject *)temp1; |
2832 | } |
2833 | n = PyArray_NDIM((PyArrayObject *)temp2); |
2834 | if (check_and_adjust_axis(axis, n) < 0) { |
2835 | Py_DECREF(temp2)_Py_DECREF(((PyObject*)(temp2))); |
2836 | return NULL((void*)0); |
2837 | } |
2838 | return temp2; |
2839 | } |
2840 | |
2841 | /*NUMPY_API |
2842 | * Zeros |
2843 | * |
2844 | * steals a reference to type. On failure or when dtype->subarray is |
2845 | * true, dtype will be decrefed. |
2846 | * accepts NULL type |
2847 | */ |
2848 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
2849 | PyArray_Zeros(int nd, npy_intp const *dims, PyArray_Descr *type, int is_f_order) |
2850 | { |
2851 | PyArrayObject *ret; |
2852 | |
2853 | if (!type) { |
2854 | type = PyArray_DescrFromType(NPY_DEFAULT_TYPENPY_DOUBLE); |
2855 | } |
2856 | |
2857 | ret = (PyArrayObject *)PyArray_NewFromDescr_int( |
2858 | &PyArray_Type, type, |
2859 | nd, dims, NULL((void*)0), NULL((void*)0), |
2860 | is_f_order, NULL((void*)0), NULL((void*)0), |
2861 | 1, 0); |
2862 | |
2863 | if (ret == NULL((void*)0)) { |
2864 | return NULL((void*)0); |
2865 | } |
2866 | |
2867 | /* handle objects */ |
2868 | if (PyDataType_REFCHK(PyArray_DESCR(ret))(((PyArray_DESCR(ret))->flags & (0x01)) == (0x01))) { |
2869 | if (_zerofill(ret) < 0) { |
2870 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
2871 | return NULL((void*)0); |
2872 | } |
2873 | } |
2874 | |
2875 | |
2876 | return (PyObject *)ret; |
2877 | |
2878 | } |
2879 | |
2880 | /*NUMPY_API |
2881 | * Empty |
2882 | * |
2883 | * accepts NULL type |
2884 | * steals a reference to type |
2885 | */ |
2886 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
2887 | PyArray_Empty(int nd, npy_intp const *dims, PyArray_Descr *type, int is_f_order) |
2888 | { |
2889 | PyArrayObject *ret; |
2890 | |
2891 | if (!type) type = PyArray_DescrFromType(NPY_DEFAULT_TYPENPY_DOUBLE); |
2892 | |
2893 | /* |
2894 | * PyArray_NewFromDescr steals a ref, |
2895 | * but we need to look at type later. |
2896 | * */ |
2897 | Py_INCREF(type)_Py_INCREF(((PyObject*)(type))); |
2898 | |
2899 | ret = (PyArrayObject *)PyArray_NewFromDescr(&PyArray_Type, |
2900 | type, nd, dims, |
2901 | NULL((void*)0), NULL((void*)0), |
2902 | is_f_order, NULL((void*)0)); |
2903 | if (ret != NULL((void*)0) && PyDataType_REFCHK(type)(((type)->flags & (0x01)) == (0x01))) { |
2904 | PyArray_FillObjectArray(ret, Py_None(&_Py_NoneStruct)); |
2905 | if (PyErr_Occurred()) { |
2906 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
2907 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); |
2908 | return NULL((void*)0); |
2909 | } |
2910 | } |
2911 | |
2912 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); |
2913 | return (PyObject *)ret; |
2914 | } |
2915 | |
2916 | /* |
2917 | * Like ceil(value), but check for overflow. |
2918 | * |
2919 | * Return 0 on success, -1 on failure. In case of failure, set a PyExc_Overflow |
2920 | * exception |
2921 | */ |
2922 | static npy_intp |
2923 | _arange_safe_ceil_to_intp(double value) |
2924 | { |
2925 | double ivalue; |
2926 | |
2927 | ivalue = npy_ceil(value); |
2928 | /* condition inverted to handle NaN */ |
2929 | if (npy_isnan(ivalue)) { |
2930 | PyErr_SetString(PyExc_ValueError, |
2931 | "arange: cannot compute length"); |
2932 | return -1; |
2933 | } |
2934 | if (!((double)NPY_MIN_INTP(-9223372036854775807L -1L) <= ivalue && ivalue <= (double)NPY_MAX_INTP9223372036854775807L)) { |
2935 | PyErr_SetString(PyExc_OverflowError, |
2936 | "arange: overflow while computing length"); |
2937 | return -1; |
2938 | } |
2939 | |
2940 | return (npy_intp)ivalue; |
2941 | } |
2942 | |
2943 | |
2944 | /*NUMPY_API |
2945 | Arange, |
2946 | */ |
2947 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
2948 | PyArray_Arange(double start, double stop, double step, int type_num) |
2949 | { |
2950 | npy_intp length; |
2951 | PyArrayObject *range; |
2952 | PyArray_ArrFuncs *funcs; |
2953 | PyObject *obj; |
2954 | int ret; |
2955 | double delta, tmp_len; |
2956 | NPY_BEGIN_THREADS_DEFPyThreadState *_save=((void*)0);; |
2957 | |
2958 | delta = stop - start; |
2959 | tmp_len = delta/step; |
2960 | |
2961 | /* Underflow and divide-by-inf check */ |
2962 | if (tmp_len == 0.0 && delta != 0.0) { |
2963 | if (npy_signbit(tmp_len)) { |
2964 | length = 0; |
2965 | } |
2966 | else { |
2967 | length = 1; |
2968 | } |
2969 | } |
2970 | else { |
2971 | length = _arange_safe_ceil_to_intp(tmp_len); |
2972 | if (error_converting(length)(((length) == -1) && PyErr_Occurred())) { |
2973 | return NULL((void*)0); |
2974 | } |
2975 | } |
2976 | |
2977 | if (length <= 0) { |
2978 | length = 0; |
2979 | return PyArray_New(&PyArray_Type, 1, &length, type_num, |
2980 | NULL((void*)0), NULL((void*)0), 0, 0, NULL((void*)0)); |
2981 | } |
2982 | range = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &length, type_num, |
2983 | NULL((void*)0), NULL((void*)0), 0, 0, NULL((void*)0)); |
2984 | if (range == NULL((void*)0)) { |
2985 | return NULL((void*)0); |
2986 | } |
2987 | funcs = PyArray_DESCR(range)->f; |
2988 | |
2989 | /* |
2990 | * place start in the buffer and the next value in the second position |
2991 | * if length > 2, then call the inner loop, otherwise stop |
2992 | */ |
2993 | obj = PyFloat_FromDouble(start); |
2994 | ret = funcs->setitem(obj, PyArray_DATA(range), range); |
2995 | Py_DECREF(obj)_Py_DECREF(((PyObject*)(obj))); |
2996 | if (ret < 0) { |
2997 | goto fail; |
2998 | } |
2999 | if (length == 1) { |
3000 | return (PyObject *)range; |
3001 | } |
3002 | obj = PyFloat_FromDouble(start + step); |
3003 | ret = funcs->setitem(obj, PyArray_BYTES(range)+PyArray_ITEMSIZE(range), |
3004 | range); |
3005 | Py_DECREF(obj)_Py_DECREF(((PyObject*)(obj))); |
3006 | if (ret < 0) { |
3007 | goto fail; |
3008 | } |
3009 | if (length == 2) { |
3010 | return (PyObject *)range; |
3011 | } |
3012 | if (!funcs->fill) { |
3013 | PyErr_SetString(PyExc_ValueError, |
3014 | "no fill-function for data-type."); |
3015 | Py_DECREF(range)_Py_DECREF(((PyObject*)(range))); |
3016 | return NULL((void*)0); |
3017 | } |
3018 | NPY_BEGIN_THREADS_DESCR(PyArray_DESCR(range))do {if (!(((((PyArray_DESCR(range)))->flags & (0x10)) == (0x10)))) do {_save = PyEval_SaveThread();} while (0);;} while (0);; |
3019 | funcs->fill(PyArray_DATA(range), length, range); |
3020 | NPY_END_THREADSdo { if (_save) { PyEval_RestoreThread(_save); _save = ((void *)0);} } while (0);; |
3021 | if (PyErr_Occurred()) { |
3022 | goto fail; |
3023 | } |
3024 | return (PyObject *)range; |
3025 | |
3026 | fail: |
3027 | Py_DECREF(range)_Py_DECREF(((PyObject*)(range))); |
3028 | return NULL((void*)0); |
3029 | } |
3030 | |
3031 | /* |
3032 | * the formula is len = (intp) ceil((stop - start) / step); |
3033 | */ |
3034 | static npy_intp |
3035 | _calc_length(PyObject *start, PyObject *stop, PyObject *step, PyObject **next, int cmplx) |
3036 | { |
3037 | npy_intp len, tmp; |
3038 | PyObject *zero, *val; |
3039 | int next_is_nonzero, val_is_zero; |
3040 | double value; |
3041 | |
3042 | *next = PyNumber_Subtract(stop, start); |
3043 | if (!(*next)) { |
3044 | if (PyTuple_Check(stop)((((((PyObject*)(stop))->ob_type))->tp_flags & ((1UL << 26))) != 0)) { |
3045 | PyErr_Clear(); |
3046 | PyErr_SetString(PyExc_TypeError, |
3047 | "arange: scalar arguments expected "\ |
3048 | "instead of a tuple."); |
3049 | } |
3050 | return -1; |
3051 | } |
3052 | |
3053 | zero = PyLong_FromLong(0); |
3054 | if (!zero) { |
3055 | Py_DECREF(*next)_Py_DECREF(((PyObject*)(*next))); |
3056 | *next = NULL((void*)0); |
3057 | return -1; |
3058 | } |
3059 | |
3060 | next_is_nonzero = PyObject_RichCompareBool(*next, zero, Py_NE3); |
3061 | if (next_is_nonzero == -1) { |
3062 | Py_DECREF(zero)_Py_DECREF(((PyObject*)(zero))); |
3063 | Py_DECREF(*next)_Py_DECREF(((PyObject*)(*next))); |
3064 | *next = NULL((void*)0); |
3065 | return -1; |
3066 | } |
3067 | val = PyNumber_TrueDivide(*next, step); |
3068 | Py_DECREF(*next)_Py_DECREF(((PyObject*)(*next))); |
3069 | *next = NULL((void*)0); |
3070 | |
3071 | if (!val) { |
3072 | Py_DECREF(zero)_Py_DECREF(((PyObject*)(zero))); |
3073 | return -1; |
3074 | } |
3075 | |
3076 | val_is_zero = PyObject_RichCompareBool(val, zero, Py_EQ2); |
3077 | Py_DECREF(zero)_Py_DECREF(((PyObject*)(zero))); |
3078 | if (val_is_zero == -1) { |
3079 | Py_DECREF(val)_Py_DECREF(((PyObject*)(val))); |
3080 | return -1; |
3081 | } |
3082 | |
3083 | if (cmplx && PyComplex_Check(val)((((PyObject*)(val))->ob_type) == (&PyComplex_Type) || PyType_IsSubtype((((PyObject*)(val))->ob_type), (&PyComplex_Type )))) { |
3084 | value = PyComplex_RealAsDouble(val); |
3085 | if (error_converting(value)(((value) == -1) && PyErr_Occurred())) { |
3086 | Py_DECREF(val)_Py_DECREF(((PyObject*)(val))); |
3087 | return -1; |
3088 | } |
3089 | len = _arange_safe_ceil_to_intp(value); |
3090 | if (error_converting(len)(((len) == -1) && PyErr_Occurred())) { |
3091 | Py_DECREF(val)_Py_DECREF(((PyObject*)(val))); |
3092 | return -1; |
3093 | } |
3094 | value = PyComplex_ImagAsDouble(val); |
3095 | Py_DECREF(val)_Py_DECREF(((PyObject*)(val))); |
3096 | if (error_converting(value)(((value) == -1) && PyErr_Occurred())) { |
3097 | return -1; |
3098 | } |
3099 | tmp = _arange_safe_ceil_to_intp(value); |
3100 | if (error_converting(tmp)(((tmp) == -1) && PyErr_Occurred())) { |
3101 | return -1; |
3102 | } |
3103 | len = PyArray_MIN(len, tmp)(((len)<(tmp))?(len):(tmp)); |
3104 | } |
3105 | else { |
3106 | value = PyFloat_AsDouble(val); |
3107 | Py_DECREF(val)_Py_DECREF(((PyObject*)(val))); |
3108 | if (error_converting(value)(((value) == -1) && PyErr_Occurred())) { |
3109 | return -1; |
3110 | } |
3111 | |
3112 | /* Underflow and divide-by-inf check */ |
3113 | if (val_is_zero && next_is_nonzero) { |
3114 | if (npy_signbit(value)) { |
3115 | len = 0; |
3116 | } |
3117 | else { |
3118 | len = 1; |
3119 | } |
3120 | } |
3121 | else { |
3122 | len = _arange_safe_ceil_to_intp(value); |
3123 | if (error_converting(len)(((len) == -1) && PyErr_Occurred())) { |
3124 | return -1; |
3125 | } |
3126 | } |
3127 | } |
3128 | |
3129 | if (len > 0) { |
3130 | *next = PyNumber_Add(start, step); |
3131 | if (!*next) { |
3132 | return -1; |
3133 | } |
3134 | } |
3135 | return len; |
3136 | } |
3137 | |
3138 | /*NUMPY_API |
3139 | * |
3140 | * ArangeObj, |
3141 | * |
3142 | * this doesn't change the references |
3143 | */ |
3144 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
3145 | PyArray_ArangeObj(PyObject *start, PyObject *stop, PyObject *step, PyArray_Descr *dtype) |
3146 | { |
3147 | PyArrayObject *range; |
3148 | PyArray_ArrFuncs *funcs; |
3149 | PyObject *next, *err; |
3150 | npy_intp length; |
3151 | PyArray_Descr *native = NULL((void*)0); |
3152 | int swap; |
3153 | NPY_BEGIN_THREADS_DEFPyThreadState *_save=((void*)0);; |
3154 | |
3155 | /* Datetime arange is handled specially */ |
3156 | if ((dtype != NULL((void*)0) && (dtype->type_num == NPY_DATETIME || |
3157 | dtype->type_num == NPY_TIMEDELTA)) || |
3158 | (dtype == NULL((void*)0) && (is_any_numpy_datetime_or_timedelta(start) || |
3159 | is_any_numpy_datetime_or_timedelta(stop) || |
3160 | is_any_numpy_datetime_or_timedelta(step)))) { |
3161 | return (PyObject *)datetime_arange(start, stop, step, dtype); |
3162 | } |
3163 | |
3164 | if (!dtype) { |
3165 | PyArray_Descr *deftype; |
3166 | PyArray_Descr *newtype; |
3167 | |
3168 | /* intentionally made to be at least NPY_LONG */ |
3169 | deftype = PyArray_DescrFromType(NPY_LONG); |
3170 | newtype = PyArray_DescrFromObject(start, deftype); |
3171 | Py_DECREF(deftype)_Py_DECREF(((PyObject*)(deftype))); |
3172 | if (newtype == NULL((void*)0)) { |
3173 | return NULL((void*)0); |
3174 | } |
3175 | deftype = newtype; |
3176 | if (stop && stop != Py_None(&_Py_NoneStruct)) { |
3177 | newtype = PyArray_DescrFromObject(stop, deftype); |
3178 | Py_DECREF(deftype)_Py_DECREF(((PyObject*)(deftype))); |
3179 | if (newtype == NULL((void*)0)) { |
3180 | return NULL((void*)0); |
3181 | } |
3182 | deftype = newtype; |
3183 | } |
3184 | if (step && step != Py_None(&_Py_NoneStruct)) { |
3185 | newtype = PyArray_DescrFromObject(step, deftype); |
3186 | Py_DECREF(deftype)_Py_DECREF(((PyObject*)(deftype))); |
3187 | if (newtype == NULL((void*)0)) { |
3188 | return NULL((void*)0); |
3189 | } |
3190 | deftype = newtype; |
3191 | } |
3192 | dtype = deftype; |
3193 | } |
3194 | else { |
3195 | Py_INCREF(dtype)_Py_INCREF(((PyObject*)(dtype))); |
3196 | } |
3197 | if (!step || step == Py_None(&_Py_NoneStruct)) { |
3198 | step = PyLong_FromLong(1); |
3199 | } |
3200 | else { |
3201 | Py_XINCREF(step)_Py_XINCREF(((PyObject*)(step))); |
3202 | } |
3203 | if (!stop || stop == Py_None(&_Py_NoneStruct)) { |
3204 | stop = start; |
3205 | start = PyLong_FromLong(0); |
3206 | } |
3207 | else { |
3208 | Py_INCREF(start)_Py_INCREF(((PyObject*)(start))); |
3209 | } |
3210 | /* calculate the length and next = start + step*/ |
3211 | length = _calc_length(start, stop, step, &next, |
3212 | PyTypeNum_ISCOMPLEX(dtype->type_num)(((dtype->type_num) >= NPY_CFLOAT) && ((dtype-> type_num) <= NPY_CLONGDOUBLE))); |
3213 | err = PyErr_Occurred(); |
3214 | if (err) { |
3215 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
3216 | if (err && PyErr_GivenExceptionMatches(err, PyExc_OverflowError)) { |
3217 | PyErr_SetString(PyExc_ValueError, "Maximum allowed size exceeded"); |
3218 | } |
3219 | goto fail; |
3220 | } |
3221 | if (length <= 0) { |
3222 | length = 0; |
3223 | range = (PyArrayObject *)PyArray_SimpleNewFromDescr(1, &length, dtype)PyArray_NewFromDescr(&PyArray_Type, dtype, 1, &length , ((void*)0), ((void*)0), 0, ((void*)0)); |
3224 | Py_DECREF(step)_Py_DECREF(((PyObject*)(step))); |
3225 | Py_DECREF(start)_Py_DECREF(((PyObject*)(start))); |
3226 | return (PyObject *)range; |
3227 | } |
3228 | |
3229 | /* |
3230 | * If dtype is not in native byte-order then get native-byte |
3231 | * order version. And then swap on the way out. |
3232 | */ |
3233 | if (!PyArray_ISNBO(dtype->byteorder)((dtype->byteorder) != '>')) { |
3234 | native = PyArray_DescrNewByteorder(dtype, NPY_NATBYTE'<'); |
3235 | swap = 1; |
3236 | } |
3237 | else { |
3238 | native = dtype; |
3239 | swap = 0; |
3240 | } |
3241 | |
3242 | range = (PyArrayObject *)PyArray_SimpleNewFromDescr(1, &length, native)PyArray_NewFromDescr(&PyArray_Type, native, 1, &length , ((void*)0), ((void*)0), 0, ((void*)0)); |
3243 | if (range == NULL((void*)0)) { |
3244 | goto fail; |
3245 | } |
3246 | |
3247 | /* |
3248 | * place start in the buffer and the next value in the second position |
3249 | * if length > 2, then call the inner loop, otherwise stop |
3250 | */ |
3251 | funcs = PyArray_DESCR(range)->f; |
3252 | if (funcs->setitem(start, PyArray_DATA(range), range) < 0) { |
3253 | goto fail; |
3254 | } |
3255 | if (length == 1) { |
3256 | goto finish; |
3257 | } |
3258 | if (funcs->setitem(next, PyArray_BYTES(range)+PyArray_ITEMSIZE(range), |
3259 | range) < 0) { |
3260 | goto fail; |
3261 | } |
3262 | if (length == 2) { |
3263 | goto finish; |
3264 | } |
3265 | if (!funcs->fill) { |
3266 | PyErr_SetString(PyExc_ValueError, "no fill-function for data-type."); |
3267 | Py_DECREF(range)_Py_DECREF(((PyObject*)(range))); |
3268 | goto fail; |
3269 | } |
3270 | NPY_BEGIN_THREADS_DESCR(PyArray_DESCR(range))do {if (!(((((PyArray_DESCR(range)))->flags & (0x10)) == (0x10)))) do {_save = PyEval_SaveThread();} while (0);;} while (0);; |
3271 | funcs->fill(PyArray_DATA(range), length, range); |
3272 | NPY_END_THREADSdo { if (_save) { PyEval_RestoreThread(_save); _save = ((void *)0);} } while (0);; |
3273 | if (PyErr_Occurred()) { |
3274 | goto fail; |
3275 | } |
3276 | finish: |
3277 | /* TODO: This swapping could be handled on the fly by the nditer */ |
3278 | if (swap) { |
3279 | PyObject *new; |
3280 | new = PyArray_Byteswap(range, 1); |
3281 | Py_DECREF(new)_Py_DECREF(((PyObject*)(new))); |
3282 | Py_DECREF(PyArray_DESCR(range))_Py_DECREF(((PyObject*)(PyArray_DESCR(range)))); |
3283 | /* steals the reference */ |
3284 | ((PyArrayObject_fields *)range)->descr = dtype; |
3285 | } |
3286 | Py_DECREF(start)_Py_DECREF(((PyObject*)(start))); |
3287 | Py_DECREF(step)_Py_DECREF(((PyObject*)(step))); |
3288 | Py_DECREF(next)_Py_DECREF(((PyObject*)(next))); |
3289 | return (PyObject *)range; |
3290 | |
3291 | fail: |
3292 | Py_DECREF(start)_Py_DECREF(((PyObject*)(start))); |
3293 | Py_DECREF(step)_Py_DECREF(((PyObject*)(step))); |
3294 | Py_XDECREF(next)_Py_XDECREF(((PyObject*)(next))); |
3295 | return NULL((void*)0); |
3296 | } |
3297 | |
3298 | /* This array creation function does not steal the reference to dtype. */ |
3299 | static PyArrayObject * |
3300 | array_fromfile_binary(FILE *fp, PyArray_Descr *dtype, npy_intp num, size_t *nread) |
3301 | { |
3302 | PyArrayObject *r; |
3303 | npy_off_toff_t start, numbytes; |
3304 | int elsize; |
3305 | |
3306 | if (num < 0) { |
3307 | int fail = 0; |
3308 | start = npy_ftellftello(fp); |
3309 | if (start < 0) { |
3310 | fail = 1; |
3311 | } |
3312 | if (npy_fseekfseeko(fp, 0, SEEK_END2) < 0) { |
3313 | fail = 1; |
3314 | } |
3315 | numbytes = npy_ftellftello(fp); |
3316 | if (numbytes < 0) { |
3317 | fail = 1; |
3318 | } |
3319 | numbytes -= start; |
3320 | if (npy_fseekfseeko(fp, start, SEEK_SET0) < 0) { |
3321 | fail = 1; |
3322 | } |
3323 | if (fail) { |
3324 | PyErr_SetString(PyExc_IOError, |
3325 | "could not seek in file"); |
3326 | return NULL((void*)0); |
3327 | } |
3328 | num = numbytes / dtype->elsize; |
3329 | } |
3330 | |
3331 | /* |
3332 | * Array creation may move sub-array dimensions from the dtype to array |
3333 | * dimensions, so we need to use the original element size when reading. |
3334 | */ |
3335 | elsize = dtype->elsize; |
3336 | |
3337 | Py_INCREF(dtype)_Py_INCREF(((PyObject*)(dtype))); /* do not steal the original dtype. */ |
3338 | r = (PyArrayObject *)PyArray_NewFromDescr(&PyArray_Type, dtype, 1, &num, |
3339 | NULL((void*)0), NULL((void*)0), 0, NULL((void*)0)); |
3340 | if (r == NULL((void*)0)) { |
3341 | return NULL((void*)0); |
3342 | } |
3343 | |
3344 | NPY_BEGIN_ALLOW_THREADS{ PyThreadState *_save; _save = PyEval_SaveThread();; |
3345 | *nread = fread(PyArray_DATA(r), elsize, num, fp); |
3346 | NPY_END_ALLOW_THREADSPyEval_RestoreThread(_save); }; |
3347 | return r; |
3348 | } |
3349 | |
3350 | /* |
3351 | * Create an array by reading from the given stream, using the passed |
3352 | * next_element and skip_separator functions. |
3353 | * Does not steal the reference to dtype. |
3354 | */ |
3355 | #define FROM_BUFFER_SIZE 4096 |
3356 | static PyArrayObject * |
3357 | array_from_text(PyArray_Descr *dtype, npy_intp num, char const *sep, size_t *nread, |
3358 | void *stream, next_element next, skip_separator skip_sep, |
3359 | void *stream_data) |
3360 | { |
3361 | PyArrayObject *r; |
3362 | npy_intp i; |
3363 | char *dptr, *clean_sep, *tmp; |
3364 | int err = 0; |
3365 | int stop_reading_flag = 0; /* -1 means end reached; -2 a parsing error */ |
3366 | npy_intp thisbuf = 0; |
3367 | npy_intp size; |
3368 | npy_intp bytes, totalbytes; |
3369 | |
3370 | size = (num >= 0) ? num : FROM_BUFFER_SIZE; |
3371 | |
3372 | /* |
3373 | * Array creation may move sub-array dimensions from the dtype to array |
3374 | * dimensions, so we need to use the original dtype when reading. |
3375 | */ |
3376 | Py_INCREF(dtype)_Py_INCREF(((PyObject*)(dtype))); |
3377 | |
3378 | r = (PyArrayObject *) |
3379 | PyArray_NewFromDescr(&PyArray_Type, dtype, 1, &size, |
3380 | NULL((void*)0), NULL((void*)0), 0, NULL((void*)0)); |
3381 | if (r == NULL((void*)0)) { |
3382 | return NULL((void*)0); |
3383 | } |
3384 | |
3385 | clean_sep = swab_separator(sep); |
3386 | if (clean_sep == NULL((void*)0)) { |
3387 | err = 1; |
3388 | goto fail; |
3389 | } |
3390 | |
3391 | NPY_BEGIN_ALLOW_THREADS{ PyThreadState *_save; _save = PyEval_SaveThread();; |
3392 | totalbytes = bytes = size * dtype->elsize; |
3393 | dptr = PyArray_DATA(r); |
3394 | for (i = 0; num < 0 || i < num; i++) { |
3395 | stop_reading_flag = next(&stream, dptr, dtype, stream_data); |
3396 | if (stop_reading_flag < 0) { |
3397 | break; |
3398 | } |
3399 | *nread += 1; |
3400 | thisbuf += 1; |
3401 | dptr += dtype->elsize; |
3402 | if (num < 0 && thisbuf == size) { |
3403 | totalbytes += bytes; |
3404 | tmp = PyDataMem_RENEW(PyArray_DATA(r), totalbytes); |
3405 | if (tmp == NULL((void*)0)) { |
3406 | err = 1; |
3407 | break; |
3408 | } |
3409 | ((PyArrayObject_fields *)r)->data = tmp; |
3410 | dptr = tmp + (totalbytes - bytes); |
3411 | thisbuf = 0; |
3412 | } |
3413 | stop_reading_flag = skip_sep(&stream, clean_sep, stream_data); |
3414 | if (stop_reading_flag < 0) { |
3415 | if (num == i + 1) { |
3416 | /* if we read as much as requested sep is optional */ |
3417 | stop_reading_flag = -1; |
3418 | } |
3419 | break; |
3420 | } |
3421 | } |
3422 | if (num < 0) { |
3423 | const size_t nsize = PyArray_MAX(*nread,1)(((*nread)>(1))?(*nread):(1))*dtype->elsize; |
3424 | |
3425 | if (nsize != 0) { |
3426 | tmp = PyDataMem_RENEW(PyArray_DATA(r), nsize); |
3427 | if (tmp == NULL((void*)0)) { |
3428 | err = 1; |
3429 | } |
3430 | else { |
3431 | PyArray_DIMS(r)[0] = *nread; |
3432 | ((PyArrayObject_fields *)r)->data = tmp; |
3433 | } |
3434 | } |
3435 | } |
3436 | NPY_END_ALLOW_THREADSPyEval_RestoreThread(_save); }; |
3437 | |
3438 | free(clean_sep); |
3439 | |
3440 | if (stop_reading_flag == -2) { |
3441 | if (PyErr_Occurred()) { |
3442 | /* If an error is already set (unlikely), do not create new one */ |
3443 | Py_DECREF(r)_Py_DECREF(((PyObject*)(r))); |
3444 | return NULL((void*)0); |
3445 | } |
3446 | /* 2019-09-12, NumPy 1.18 */ |
3447 | if (DEPRECATE(PyErr_WarnEx(PyExc_DeprecationWarning,"string or file could not be read to its end due to unmatched " "data; this will raise a ValueError in the future.",1) |
3448 | "string or file could not be read to its end due to unmatched "PyErr_WarnEx(PyExc_DeprecationWarning,"string or file could not be read to its end due to unmatched " "data; this will raise a ValueError in the future.",1) |
3449 | "data; this will raise a ValueError in the future.")PyErr_WarnEx(PyExc_DeprecationWarning,"string or file could not be read to its end due to unmatched " "data; this will raise a ValueError in the future.",1) < 0) { |
3450 | goto fail; |
3451 | } |
3452 | } |
3453 | |
3454 | fail: |
3455 | if (err == 1) { |
3456 | PyErr_NoMemory(); |
3457 | } |
3458 | if (PyErr_Occurred()) { |
3459 | Py_DECREF(r)_Py_DECREF(((PyObject*)(r))); |
3460 | return NULL((void*)0); |
3461 | } |
3462 | return r; |
3463 | } |
3464 | #undef FROM_BUFFER_SIZE |
3465 | |
3466 | /*NUMPY_API |
3467 | * |
3468 | * Given a ``FILE *`` pointer ``fp``, and a ``PyArray_Descr``, return an |
3469 | * array corresponding to the data encoded in that file. |
3470 | * |
3471 | * The reference to `dtype` is stolen (it is possible that the passed in |
3472 | * dtype is not held on to). |
3473 | * |
3474 | * The number of elements to read is given as ``num``; if it is < 0, then |
3475 | * then as many as possible are read. |
3476 | * |
3477 | * If ``sep`` is NULL or empty, then binary data is assumed, else |
3478 | * text data, with ``sep`` as the separator between elements. Whitespace in |
3479 | * the separator matches any length of whitespace in the text, and a match |
3480 | * for whitespace around the separator is added. |
3481 | * |
3482 | * For memory-mapped files, use the buffer interface. No more data than |
3483 | * necessary is read by this routine. |
3484 | */ |
3485 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
3486 | PyArray_FromFile(FILE *fp, PyArray_Descr *dtype, npy_intp num, char *sep) |
3487 | { |
3488 | PyArrayObject *ret; |
3489 | size_t nread = 0; |
3490 | |
3491 | if (PyDataType_REFCHK(dtype)(((dtype)->flags & (0x01)) == (0x01))) { |
3492 | PyErr_SetString(PyExc_ValueError, |
3493 | "Cannot read into object array"); |
3494 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
3495 | return NULL((void*)0); |
3496 | } |
3497 | if (dtype->elsize == 0) { |
3498 | /* Nothing to read, just create an empty array of the requested type */ |
3499 | return PyArray_NewFromDescr_int( |
3500 | &PyArray_Type, dtype, |
3501 | 1, &num, NULL((void*)0), NULL((void*)0), |
3502 | 0, NULL((void*)0), NULL((void*)0), |
3503 | 0, 1); |
3504 | } |
3505 | if ((sep == NULL((void*)0)) || (strlen(sep) == 0)) { |
3506 | ret = array_fromfile_binary(fp, dtype, num, &nread); |
3507 | } |
3508 | else { |
3509 | if (dtype->f->scanfunc == NULL((void*)0)) { |
3510 | PyErr_SetString(PyExc_ValueError, |
3511 | "Unable to read character files of that array type"); |
3512 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
3513 | return NULL((void*)0); |
3514 | } |
3515 | ret = array_from_text(dtype, num, sep, &nread, fp, |
3516 | (next_element) fromfile_next_element, |
3517 | (skip_separator) fromfile_skip_separator, NULL((void*)0)); |
3518 | } |
3519 | if (ret == NULL((void*)0)) { |
3520 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
3521 | return NULL((void*)0); |
3522 | } |
3523 | if (((npy_intp) nread) < num) { |
3524 | /* |
3525 | * Realloc memory for smaller number of elements, use original dtype |
3526 | * which may have include a subarray (and is used for `nread`). |
3527 | */ |
3528 | const size_t nsize = PyArray_MAX(nread,1)(((nread)>(1))?(nread):(1)) * dtype->elsize; |
3529 | char *tmp; |
3530 | |
3531 | if ((tmp = PyDataMem_RENEW(PyArray_DATA(ret), nsize)) == NULL((void*)0)) { |
3532 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
3533 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); |
3534 | return PyErr_NoMemory(); |
3535 | } |
3536 | ((PyArrayObject_fields *)ret)->data = tmp; |
3537 | PyArray_DIMS(ret)[0] = nread; |
3538 | } |
3539 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
3540 | return (PyObject *)ret; |
3541 | } |
3542 | |
3543 | /*NUMPY_API*/ |
3544 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
3545 | PyArray_FromBuffer(PyObject *buf, PyArray_Descr *type, |
3546 | npy_intp count, npy_intp offset) |
3547 | { |
3548 | PyArrayObject *ret; |
3549 | char *data; |
3550 | Py_buffer view; |
3551 | Py_ssize_t ts; |
3552 | npy_intp s, n; |
3553 | int itemsize; |
3554 | int writeable = 1; |
3555 | |
3556 | |
3557 | if (PyDataType_REFCHK(type)(((type)->flags & (0x01)) == (0x01))) { |
3558 | PyErr_SetString(PyExc_ValueError, |
3559 | "cannot create an OBJECT array from memory"\ |
3560 | " buffer"); |
3561 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); |
3562 | return NULL((void*)0); |
3563 | } |
3564 | if (PyDataType_ISUNSIZED(type)((type)->elsize == 0 && !(((PyArray_Descr *)(type) )->names != ((void*)0)))) { |
3565 | PyErr_SetString(PyExc_ValueError, |
3566 | "itemsize cannot be zero in type"); |
3567 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); |
3568 | return NULL((void*)0); |
3569 | } |
3570 | |
3571 | if (PyObject_GetBuffer(buf, &view, PyBUF_WRITABLE0x0001|PyBUF_SIMPLE0) < 0) { |
3572 | writeable = 0; |
3573 | PyErr_Clear(); |
3574 | if (PyObject_GetBuffer(buf, &view, PyBUF_SIMPLE0) < 0) { |
3575 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); |
3576 | return NULL((void*)0); |
3577 | } |
3578 | } |
3579 | data = (char *)view.buf; |
3580 | ts = view.len; |
3581 | /* |
3582 | * In Python 3 both of the deprecated functions PyObject_AsWriteBuffer and |
3583 | * PyObject_AsReadBuffer that this code replaces release the buffer. It is |
3584 | * up to the object that supplies the buffer to guarantee that the buffer |
3585 | * sticks around after the release. |
3586 | */ |
3587 | PyBuffer_Release(&view); |
3588 | |
3589 | if ((offset < 0) || (offset > ts)) { |
3590 | PyErr_Format(PyExc_ValueError, |
3591 | "offset must be non-negative and no greater than buffer "\ |
3592 | "length (%" NPY_INTP_FMT"ld" ")", (npy_intp)ts); |
3593 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); |
3594 | return NULL((void*)0); |
3595 | } |
3596 | |
3597 | data += offset; |
3598 | s = (npy_intp)ts - offset; |
3599 | n = (npy_intp)count; |
3600 | itemsize = type->elsize; |
3601 | if (n < 0) { |
3602 | if (itemsize == 0) { |
3603 | PyErr_SetString(PyExc_ValueError, |
3604 | "cannot determine count if itemsize is 0"); |
3605 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); |
3606 | return NULL((void*)0); |
3607 | } |
3608 | if (s % itemsize != 0) { |
3609 | PyErr_SetString(PyExc_ValueError, |
3610 | "buffer size must be a multiple"\ |
3611 | " of element size"); |
3612 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); |
3613 | return NULL((void*)0); |
3614 | } |
3615 | n = s/itemsize; |
3616 | } |
3617 | else { |
3618 | if (s < n*itemsize) { |
3619 | PyErr_SetString(PyExc_ValueError, |
3620 | "buffer is smaller than requested"\ |
3621 | " size"); |
3622 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); |
3623 | return NULL((void*)0); |
3624 | } |
3625 | } |
3626 | |
3627 | ret = (PyArrayObject *)PyArray_NewFromDescrAndBase( |
3628 | &PyArray_Type, type, |
3629 | 1, &n, NULL((void*)0), data, |
3630 | NPY_ARRAY_DEFAULT((0x0001 | (0x0100 | 0x0400))), NULL((void*)0), buf); |
3631 | if (ret == NULL((void*)0)) { |
3632 | return NULL((void*)0); |
3633 | } |
3634 | |
3635 | if (!writeable) { |
3636 | PyArray_CLEARFLAGS(ret, NPY_ARRAY_WRITEABLE0x0400); |
3637 | } |
3638 | return (PyObject *)ret; |
3639 | } |
3640 | |
3641 | /*NUMPY_API |
3642 | * |
3643 | * Given a pointer to a string ``data``, a string length ``slen``, and |
3644 | * a ``PyArray_Descr``, return an array corresponding to the data |
3645 | * encoded in that string. |
3646 | * |
3647 | * If the dtype is NULL, the default array type is used (double). |
3648 | * If non-null, the reference is stolen. |
3649 | * |
3650 | * If ``slen`` is < 0, then the end of string is used for text data. |
3651 | * It is an error for ``slen`` to be < 0 for binary data (since embedded NULLs |
3652 | * would be the norm). |
3653 | * |
3654 | * The number of elements to read is given as ``num``; if it is < 0, then |
3655 | * then as many as possible are read. |
3656 | * |
3657 | * If ``sep`` is NULL or empty, then binary data is assumed, else |
3658 | * text data, with ``sep`` as the separator between elements. Whitespace in |
3659 | * the separator matches any length of whitespace in the text, and a match |
3660 | * for whitespace around the separator is added. |
3661 | */ |
3662 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
3663 | PyArray_FromString(char *data, npy_intp slen, PyArray_Descr *dtype, |
3664 | npy_intp num, char *sep) |
3665 | { |
3666 | int itemsize; |
3667 | PyArrayObject *ret; |
3668 | npy_bool binary; |
3669 | |
3670 | if (dtype == NULL((void*)0)) { |
3671 | dtype=PyArray_DescrFromType(NPY_DEFAULT_TYPENPY_DOUBLE); |
3672 | if (dtype == NULL((void*)0)) { |
3673 | return NULL((void*)0); |
3674 | } |
3675 | } |
3676 | if (PyDataType_FLAGCHK(dtype, NPY_ITEM_IS_POINTER)(((dtype)->flags & (0x04)) == (0x04)) || |
3677 | PyDataType_REFCHK(dtype)(((dtype)->flags & (0x01)) == (0x01))) { |
3678 | PyErr_SetString(PyExc_ValueError, |
3679 | "Cannot create an object array from" \ |
3680 | " a string"); |
3681 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
3682 | return NULL((void*)0); |
3683 | } |
3684 | itemsize = dtype->elsize; |
3685 | if (itemsize == 0) { |
3686 | PyErr_SetString(PyExc_ValueError, "zero-valued itemsize"); |
3687 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
3688 | return NULL((void*)0); |
3689 | } |
3690 | |
3691 | binary = ((sep == NULL((void*)0)) || (strlen(sep) == 0)); |
3692 | if (binary) { |
3693 | if (num < 0 ) { |
3694 | if (slen % itemsize != 0) { |
3695 | PyErr_SetString(PyExc_ValueError, |
3696 | "string size must be a "\ |
3697 | "multiple of element size"); |
3698 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
3699 | return NULL((void*)0); |
3700 | } |
3701 | num = slen/itemsize; |
3702 | } |
3703 | else { |
3704 | if (slen < num*itemsize) { |
3705 | PyErr_SetString(PyExc_ValueError, |
3706 | "string is smaller than " \ |
3707 | "requested size"); |
3708 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
3709 | return NULL((void*)0); |
3710 | } |
3711 | } |
3712 | /* |
3713 | * NewFromDescr may replace dtype to absorb subarray shape |
3714 | * into the array, so get size beforehand. |
3715 | */ |
3716 | npy_intp size_to_copy = num*dtype->elsize; |
3717 | ret = (PyArrayObject *) |
3718 | PyArray_NewFromDescr(&PyArray_Type, dtype, |
3719 | 1, &num, NULL((void*)0), NULL((void*)0), |
3720 | 0, NULL((void*)0)); |
3721 | if (ret == NULL((void*)0)) { |
3722 | return NULL((void*)0); |
3723 | } |
3724 | memcpy(PyArray_DATA(ret), data, size_to_copy); |
3725 | } |
3726 | else { |
3727 | /* read from character-based string */ |
3728 | size_t nread = 0; |
3729 | char *end; |
3730 | |
3731 | if (dtype->f->fromstr == NULL((void*)0)) { |
3732 | PyErr_SetString(PyExc_ValueError, |
3733 | "don't know how to read " \ |
3734 | "character strings with that " \ |
3735 | "array type"); |
3736 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
3737 | return NULL((void*)0); |
3738 | } |
3739 | if (slen < 0) { |
3740 | end = NULL((void*)0); |
3741 | } |
3742 | else { |
3743 | end = data + slen; |
3744 | } |
3745 | ret = array_from_text(dtype, num, sep, &nread, |
3746 | data, |
3747 | (next_element) fromstr_next_element, |
3748 | (skip_separator) fromstr_skip_separator, |
3749 | end); |
3750 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); |
3751 | } |
3752 | return (PyObject *)ret; |
3753 | } |
3754 | |
3755 | /*NUMPY_API |
3756 | * |
3757 | * steals a reference to dtype (which cannot be NULL) |
3758 | */ |
3759 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * |
3760 | PyArray_FromIter(PyObject *obj, PyArray_Descr *dtype, npy_intp count) |
3761 | { |
3762 | PyObject *value; |
3763 | PyObject *iter = PyObject_GetIter(obj); |
3764 | PyArrayObject *ret = NULL((void*)0); |
3765 | npy_intp i, elsize, elcount; |
3766 | char *item, *new_data; |
3767 | |
3768 | if (iter == NULL((void*)0)) { |
3769 | goto done; |
3770 | } |
3771 | if (PyDataType_ISUNSIZED(dtype)((dtype)->elsize == 0 && !(((PyArray_Descr *)(dtype ))->names != ((void*)0)))) { |
3772 | PyErr_SetString(PyExc_ValueError, |
3773 | "Must specify length when using variable-size data-type."); |
3774 | goto done; |
3775 | } |
3776 | if (count < 0) { |
3777 | elcount = PyObject_LengthHint(obj, 0); |
3778 | if (elcount < 0) { |
3779 | goto done; |
3780 | } |
3781 | } |
3782 | else { |
3783 | elcount = count; |
3784 | } |
3785 | |
3786 | elsize = dtype->elsize; |
3787 | |
3788 | /* |
3789 | * We would need to alter the memory RENEW code to decrement any |
3790 | * reference counts before throwing away any memory. |
3791 | */ |
3792 | if (PyDataType_REFCHK(dtype)(((dtype)->flags & (0x01)) == (0x01))) { |
3793 | PyErr_SetString(PyExc_ValueError, |
3794 | "cannot create object arrays from iterator"); |
3795 | goto done; |
3796 | } |
3797 | |
3798 | ret = (PyArrayObject *)PyArray_NewFromDescr(&PyArray_Type, dtype, 1, |
3799 | &elcount, NULL((void*)0),NULL((void*)0), 0, NULL((void*)0)); |
3800 | dtype = NULL((void*)0); |
3801 | if (ret == NULL((void*)0)) { |
3802 | goto done; |
3803 | } |
3804 | for (i = 0; (i < count || count == -1) && |
3805 | (value = PyIter_Next(iter)); i++) { |
3806 | if (i >= elcount && elsize != 0) { |
3807 | npy_intp nbytes; |
3808 | /* |
3809 | Grow PyArray_DATA(ret): |
3810 | this is similar for the strategy for PyListObject, but we use |
3811 | 50% overallocation => 0, 4, 8, 14, 23, 36, 56, 86 ... |
3812 | */ |
3813 | elcount = (i >> 1) + (i < 4 ? 4 : 2) + i; |
3814 | if (!npy_mul_with_overflow_intp(&nbytes, elcount, elsize)) { |
3815 | new_data = PyDataMem_RENEW(PyArray_DATA(ret), nbytes); |
3816 | } |
3817 | else { |
3818 | new_data = NULL((void*)0); |
3819 | } |
3820 | if (new_data == NULL((void*)0)) { |
3821 | PyErr_SetString(PyExc_MemoryError, |
3822 | "cannot allocate array memory"); |
3823 | Py_DECREF(value)_Py_DECREF(((PyObject*)(value))); |
3824 | goto done; |
3825 | } |
3826 | ((PyArrayObject_fields *)ret)->data = new_data; |
3827 | } |
3828 | PyArray_DIMS(ret)[0] = i + 1; |
3829 | |
3830 | if (((item = index2ptr(ret, i)) == NULL((void*)0)) || |
3831 | PyArray_SETITEM(ret, item, value) == -1) { |
3832 | Py_DECREF(value)_Py_DECREF(((PyObject*)(value))); |
3833 | goto done; |
3834 | } |
3835 | Py_DECREF(value)_Py_DECREF(((PyObject*)(value))); |
3836 | } |
3837 | |
3838 | |
3839 | if (PyErr_Occurred()) { |
3840 | goto done; |
3841 | } |
3842 | if (i < count) { |
3843 | PyErr_SetString(PyExc_ValueError, |
3844 | "iterator too short"); |
3845 | goto done; |
3846 | } |
3847 | |
3848 | /* |
3849 | * Realloc the data so that don't keep extra memory tied up |
3850 | * (assuming realloc is reasonably good about reusing space...) |
3851 | */ |
3852 | if (i == 0 || elsize == 0) { |
3853 | /* The size cannot be zero for PyDataMem_RENEW. */ |
3854 | goto done; |
3855 | } |
3856 | new_data = PyDataMem_RENEW(PyArray_DATA(ret), i * elsize); |
3857 | if (new_data == NULL((void*)0)) { |
3858 | PyErr_SetString(PyExc_MemoryError, |
3859 | "cannot allocate array memory"); |
3860 | goto done; |
3861 | } |
3862 | ((PyArrayObject_fields *)ret)->data = new_data; |
3863 | |
3864 | done: |
3865 | Py_XDECREF(iter)_Py_XDECREF(((PyObject*)(iter))); |
3866 | Py_XDECREF(dtype)_Py_XDECREF(((PyObject*)(dtype))); |
3867 | if (PyErr_Occurred()) { |
3868 | Py_XDECREF(ret)_Py_XDECREF(((PyObject*)(ret))); |
3869 | return NULL((void*)0); |
3870 | } |
3871 | return (PyObject *)ret; |
3872 | } |
3873 | |
3874 | /* |
3875 | * This is the main array creation routine. |
3876 | * |
3877 | * Flags argument has multiple related meanings |
3878 | * depending on data and strides: |
3879 | * |
3880 | * If data is given, then flags is flags associated with data. |
3881 | * If strides is not given, then a contiguous strides array will be created |
3882 | * and the NPY_ARRAY_C_CONTIGUOUS bit will be set. If the flags argument |
3883 | * has the NPY_ARRAY_F_CONTIGUOUS bit set, then a FORTRAN-style strides array will be |
3884 | * created (and of course the NPY_ARRAY_F_CONTIGUOUS flag bit will be set). |
3885 | * |
3886 | * If data is not given but created here, then flags will be NPY_ARRAY_DEFAULT |
3887 | * and a non-zero flags argument can be used to indicate a FORTRAN style |
3888 | * array is desired. |
3889 | * |
3890 | * Dimensions and itemsize must have been checked for validity. |
3891 | */ |
3892 | |
3893 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) void |
3894 | _array_fill_strides(npy_intp *strides, npy_intp const *dims, int nd, size_t itemsize, |
3895 | int inflag, int *objflags) |
3896 | { |
3897 | int i; |
3898 | #if NPY_RELAXED_STRIDES_CHECKING1 |
3899 | npy_bool not_cf_contig = 0; |
3900 | npy_bool nod = 0; /* A dim != 1 was found */ |
3901 | |
3902 | /* Check if new array is both F- and C-contiguous */ |
3903 | for (i = 0; i < nd; i++) { |
3904 | if (dims[i] != 1) { |
3905 | if (nod) { |
3906 | not_cf_contig = 1; |
3907 | break; |
3908 | } |
3909 | nod = 1; |
3910 | } |
3911 | } |
3912 | #endif /* NPY_RELAXED_STRIDES_CHECKING */ |
3913 | |
3914 | /* Only make Fortran strides if not contiguous as well */ |
3915 | if ((inflag & (NPY_ARRAY_F_CONTIGUOUS0x0002|NPY_ARRAY_C_CONTIGUOUS0x0001)) == |
3916 | NPY_ARRAY_F_CONTIGUOUS0x0002) { |
3917 | for (i = 0; i < nd; i++) { |
3918 | strides[i] = itemsize; |
3919 | if (dims[i]) { |
3920 | itemsize *= dims[i]; |
3921 | } |
3922 | #if NPY_RELAXED_STRIDES_CHECKING1 |
3923 | else { |
3924 | not_cf_contig = 0; |
3925 | } |
3926 | #if NPY_RELAXED_STRIDES_DEBUG0 |
3927 | /* For testing purpose only */ |
3928 | if (dims[i] == 1) { |
3929 | strides[i] = NPY_MAX_INTP9223372036854775807L; |
3930 | } |
3931 | #endif /* NPY_RELAXED_STRIDES_DEBUG */ |
3932 | #endif /* NPY_RELAXED_STRIDES_CHECKING */ |
3933 | } |
3934 | #if NPY_RELAXED_STRIDES_CHECKING1 |
3935 | if (not_cf_contig) { |
3936 | #else /* not NPY_RELAXED_STRIDES_CHECKING */ |
3937 | if ((nd > 1) && ((strides[0] != strides[nd-1]) || (dims[nd-1] > 1))) { |
3938 | #endif /* not NPY_RELAXED_STRIDES_CHECKING */ |
3939 | *objflags = ((*objflags)|NPY_ARRAY_F_CONTIGUOUS0x0002) & |
3940 | ~NPY_ARRAY_C_CONTIGUOUS0x0001; |
3941 | } |
3942 | else { |
3943 | *objflags |= (NPY_ARRAY_F_CONTIGUOUS0x0002|NPY_ARRAY_C_CONTIGUOUS0x0001); |
3944 | } |
3945 | } |
3946 | else { |
3947 | for (i = nd - 1; i >= 0; i--) { |
3948 | strides[i] = itemsize; |
3949 | if (dims[i]) { |
3950 | itemsize *= dims[i]; |
3951 | } |
3952 | #if NPY_RELAXED_STRIDES_CHECKING1 |
3953 | else { |
3954 | not_cf_contig = 0; |
3955 | } |
3956 | #if NPY_RELAXED_STRIDES_DEBUG0 |
3957 | /* For testing purpose only */ |
3958 | if (dims[i] == 1) { |
3959 | strides[i] = NPY_MAX_INTP9223372036854775807L; |
3960 | } |
3961 | #endif /* NPY_RELAXED_STRIDES_DEBUG */ |
3962 | #endif /* NPY_RELAXED_STRIDES_CHECKING */ |
3963 | } |
3964 | #if NPY_RELAXED_STRIDES_CHECKING1 |
3965 | if (not_cf_contig) { |
3966 | #else /* not NPY_RELAXED_STRIDES_CHECKING */ |
3967 | if ((nd > 1) && ((strides[0] != strides[nd-1]) || (dims[0] > 1))) { |
3968 | #endif /* not NPY_RELAXED_STRIDES_CHECKING */ |
3969 | *objflags = ((*objflags)|NPY_ARRAY_C_CONTIGUOUS0x0001) & |
3970 | ~NPY_ARRAY_F_CONTIGUOUS0x0002; |
3971 | } |
3972 | else { |
3973 | *objflags |= (NPY_ARRAY_C_CONTIGUOUS0x0001|NPY_ARRAY_F_CONTIGUOUS0x0002); |
3974 | } |
3975 | } |
3976 | return; |
3977 | } |
3978 | |
3979 | /* |
3980 | * Calls arr_of_subclass.__array_wrap__(towrap), in order to make 'towrap' |
3981 | * have the same ndarray subclass as 'arr_of_subclass'. |
3982 | */ |
3983 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyArrayObject * |
3984 | PyArray_SubclassWrap(PyArrayObject *arr_of_subclass, PyArrayObject *towrap) |
3985 | { |
3986 | PyObject *wrapped = PyObject_CallMethod_PyObject_CallMethod_SizeT((PyObject *)arr_of_subclass, |
3987 | "__array_wrap__", "O", towrap); |
3988 | if (wrapped == NULL((void*)0)) { |
3989 | return NULL((void*)0); |
3990 | } |
3991 | if (!PyArray_Check(wrapped)((((PyObject*)(wrapped))->ob_type) == (&PyArray_Type) || PyType_IsSubtype((((PyObject*)(wrapped))->ob_type), (& PyArray_Type)))) { |
3992 | PyErr_SetString(PyExc_RuntimeError, |
3993 | "ndarray subclass __array_wrap__ method returned an " |
3994 | "object which was not an instance of an ndarray subclass"); |
3995 | Py_DECREF(wrapped)_Py_DECREF(((PyObject*)(wrapped))); |
3996 | return NULL((void*)0); |
3997 | } |
3998 | |
3999 | return (PyArrayObject *)wrapped; |
4000 | } |