File: | numpy/core/src/multiarray/multiarraymodule.c |
Warning: | line 4673, column 9 PyObject ownership leak with reference count of 1 |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* | |||
2 | Python Multiarray Module -- A useful collection of functions for creating and | |||
3 | using ndarrays | |||
4 | ||||
5 | Original file | |||
6 | Copyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu | |||
7 | ||||
8 | Modified for numpy in 2005 | |||
9 | ||||
10 | Travis E. Oliphant | |||
11 | oliphant@ee.byu.edu | |||
12 | Brigham Young University | |||
13 | */ | |||
14 | ||||
15 | /* $Id: multiarraymodule.c,v 1.36 2005/09/14 00:14:00 teoliphant Exp $ */ | |||
16 | ||||
17 | #define PY_SSIZE_T_CLEAN | |||
18 | #include "Python.h" | |||
19 | #include "structmember.h" | |||
20 | ||||
21 | #define NPY_NO_DEPRECATED_API0x0000000E NPY_API_VERSION0x0000000E | |||
22 | #define _UMATHMODULE | |||
23 | #define _MULTIARRAYMODULE | |||
24 | #include <numpy/npy_common.h> | |||
25 | #include "numpy/arrayobject.h" | |||
26 | #include "numpy/arrayscalars.h" | |||
27 | ||||
28 | #include "numpy/npy_math.h" | |||
29 | #include "npy_argparse.h" | |||
30 | #include "npy_config.h" | |||
31 | #include "npy_pycompat.h" | |||
32 | #include "npy_import.h" | |||
33 | #include "convert_datatype.h" | |||
34 | #include "legacy_dtype_implementation.h" | |||
35 | ||||
36 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int NPY_NUMUSERTYPES = 0; | |||
37 | ||||
38 | /* Internal APIs */ | |||
39 | #include "alloc.h" | |||
40 | #include "abstractdtypes.h" | |||
41 | #include "array_coercion.h" | |||
42 | #include "arrayfunction_override.h" | |||
43 | #include "arraytypes.h" | |||
44 | #include "arrayobject.h" | |||
45 | #include "hashdescr.h" | |||
46 | #include "descriptor.h" | |||
47 | #include "dragon4.h" | |||
48 | #include "calculation.h" | |||
49 | #include "number.h" | |||
50 | #include "scalartypes.h" | |||
51 | #include "convert_datatype.h" | |||
52 | #include "conversion_utils.h" | |||
53 | #include "nditer_pywrap.h" | |||
54 | #include "methods.h" | |||
55 | #include "_datetime.h" | |||
56 | #include "datetime_strings.h" | |||
57 | #include "datetime_busday.h" | |||
58 | #include "datetime_busdaycal.h" | |||
59 | #include "item_selection.h" | |||
60 | #include "shape.h" | |||
61 | #include "ctors.h" | |||
62 | #include "array_assign.h" | |||
63 | #include "common.h" | |||
64 | #include "multiarraymodule.h" | |||
65 | #include "cblasfuncs.h" | |||
66 | #include "vdot.h" | |||
67 | #include "templ_common.h" /* for npy_mul_with_overflow_intp */ | |||
68 | #include "compiled_base.h" | |||
69 | #include "mem_overlap.h" | |||
70 | #include "typeinfo.h" | |||
71 | ||||
72 | #include "get_attr_string.h" | |||
73 | ||||
74 | /* | |||
75 | ***************************************************************************** | |||
76 | ** INCLUDE GENERATED CODE ** | |||
77 | ***************************************************************************** | |||
78 | */ | |||
79 | #include "funcs.inc" | |||
80 | #include "umathmodule.h" | |||
81 | ||||
82 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int initscalarmath(PyObject *); | |||
83 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int set_matmul_flags(PyObject *d); /* in ufunc_object.c */ | |||
84 | ||||
85 | /* | |||
86 | * global variable to determine if legacy printing is enabled, accessible from | |||
87 | * C. For simplicity the mode is encoded as an integer where '0' means no | |||
88 | * legacy mode, and '113' means 1.13 legacy mode. We can upgrade this if we | |||
89 | * have more complex requirements in the future. | |||
90 | */ | |||
91 | int npy_legacy_print_mode = 0; | |||
92 | ||||
93 | static PyObject * | |||
94 | set_legacy_print_mode(PyObject *NPY_UNUSED(self)(__NPY_UNUSED_TAGGEDself) __attribute__ ((__unused__)), PyObject *args) | |||
95 | { | |||
96 | if (!PyArg_ParseTuple_PyArg_ParseTuple_SizeT(args, "i", &npy_legacy_print_mode)) { | |||
97 | return NULL((void*)0); | |||
98 | } | |||
99 | Py_RETURN_NONEreturn _Py_INCREF(((PyObject*)((&_Py_NoneStruct)))), (& _Py_NoneStruct); | |||
100 | } | |||
101 | ||||
102 | ||||
103 | /* Only here for API compatibility */ | |||
104 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyTypeObject PyBigArray_Type; | |||
105 | ||||
106 | ||||
107 | /*NUMPY_API | |||
108 | * Get Priority from object | |||
109 | */ | |||
110 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) double | |||
111 | PyArray_GetPriority(PyObject *obj, double default_) | |||
112 | { | |||
113 | PyObject *ret; | |||
114 | double priority = NPY_PRIORITY0.0; | |||
115 | ||||
116 | if (PyArray_CheckExact(obj)(((PyObject*)(obj))->ob_type == &PyArray_Type)) { | |||
117 | return priority; | |||
118 | } | |||
119 | else if (PyArray_CheckAnyScalarExact(obj)) { | |||
120 | return NPY_SCALAR_PRIORITY-1000000.0; | |||
121 | } | |||
122 | ||||
123 | ret = PyArray_LookupSpecial_OnInstance(obj, "__array_priority__"); | |||
124 | if (ret == NULL((void*)0)) { | |||
125 | if (PyErr_Occurred()) { | |||
126 | PyErr_Clear(); /* TODO[gh-14801]: propagate crashes during attribute access? */ | |||
127 | } | |||
128 | return default_; | |||
129 | } | |||
130 | ||||
131 | priority = PyFloat_AsDouble(ret); | |||
132 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); | |||
133 | return priority; | |||
134 | } | |||
135 | ||||
136 | /*NUMPY_API | |||
137 | * Multiply a List of ints | |||
138 | */ | |||
139 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int | |||
140 | PyArray_MultiplyIntList(int const *l1, int n) | |||
141 | { | |||
142 | int s = 1; | |||
143 | ||||
144 | while (n--) { | |||
145 | s *= (*l1++); | |||
146 | } | |||
147 | return s; | |||
148 | } | |||
149 | ||||
150 | /*NUMPY_API | |||
151 | * Multiply a List | |||
152 | */ | |||
153 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) npy_intp | |||
154 | PyArray_MultiplyList(npy_intp const *l1, int n) | |||
155 | { | |||
156 | npy_intp s = 1; | |||
157 | ||||
158 | while (n--) { | |||
159 | s *= (*l1++); | |||
160 | } | |||
161 | return s; | |||
162 | } | |||
163 | ||||
164 | /*NUMPY_API | |||
165 | * Multiply a List of Non-negative numbers with over-flow detection. | |||
166 | */ | |||
167 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) npy_intp | |||
168 | PyArray_OverflowMultiplyList(npy_intp const *l1, int n) | |||
169 | { | |||
170 | npy_intp prod = 1; | |||
171 | int i; | |||
172 | ||||
173 | for (i = 0; i < n; i++) { | |||
174 | npy_intp dim = l1[i]; | |||
175 | ||||
176 | if (dim == 0) { | |||
177 | return 0; | |||
178 | } | |||
179 | if (npy_mul_with_overflow_intp(&prod, prod, dim)) { | |||
180 | return -1; | |||
181 | } | |||
182 | } | |||
183 | return prod; | |||
184 | } | |||
185 | ||||
186 | /*NUMPY_API | |||
187 | * Produce a pointer into array | |||
188 | */ | |||
189 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) void * | |||
190 | PyArray_GetPtr(PyArrayObject *obj, npy_intp const* ind) | |||
191 | { | |||
192 | int n = PyArray_NDIM(obj); | |||
193 | npy_intp *strides = PyArray_STRIDES(obj); | |||
194 | char *dptr = PyArray_DATA(obj); | |||
195 | ||||
196 | while (n--) { | |||
197 | dptr += (*strides++) * (*ind++); | |||
198 | } | |||
199 | return (void *)dptr; | |||
200 | } | |||
201 | ||||
202 | /*NUMPY_API | |||
203 | * Compare Lists | |||
204 | */ | |||
205 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int | |||
206 | PyArray_CompareLists(npy_intp const *l1, npy_intp const *l2, int n) | |||
207 | { | |||
208 | int i; | |||
209 | ||||
210 | for (i = 0; i < n; i++) { | |||
211 | if (l1[i] != l2[i]) { | |||
212 | return 0; | |||
213 | } | |||
214 | } | |||
215 | return 1; | |||
216 | } | |||
217 | ||||
218 | /* | |||
219 | * simulates a C-style 1-3 dimensional array which can be accessed using | |||
220 | * ptr[i] or ptr[i][j] or ptr[i][j][k] -- requires pointer allocation | |||
221 | * for 2-d and 3-d. | |||
222 | * | |||
223 | * For 2-d and up, ptr is NOT equivalent to a statically defined | |||
224 | * 2-d or 3-d array. In particular, it cannot be passed into a | |||
225 | * function that requires a true pointer to a fixed-size array. | |||
226 | */ | |||
227 | ||||
228 | /*NUMPY_API | |||
229 | * Simulate a C-array | |||
230 | * steals a reference to typedescr -- can be NULL | |||
231 | */ | |||
232 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int | |||
233 | PyArray_AsCArray(PyObject **op, void *ptr, npy_intp *dims, int nd, | |||
234 | PyArray_Descr* typedescr) | |||
235 | { | |||
236 | PyArrayObject *ap; | |||
237 | npy_intp n, m, i, j; | |||
238 | char **ptr2; | |||
239 | char ***ptr3; | |||
240 | ||||
241 | if ((nd < 1) || (nd > 3)) { | |||
242 | PyErr_SetString(PyExc_ValueError, | |||
243 | "C arrays of only 1-3 dimensions available"); | |||
244 | Py_XDECREF(typedescr)_Py_XDECREF(((PyObject*)(typedescr))); | |||
245 | return -1; | |||
246 | } | |||
247 | if ((ap = (PyArrayObject*)PyArray_FromAny(*op, typedescr, nd, nd, | |||
248 | NPY_ARRAY_CARRAY(0x0001 | (0x0100 | 0x0400)), NULL((void*)0))) == NULL((void*)0)) { | |||
249 | return -1; | |||
250 | } | |||
251 | switch(nd) { | |||
252 | case 1: | |||
253 | *((char **)ptr) = PyArray_DATA(ap); | |||
254 | break; | |||
255 | case 2: | |||
256 | n = PyArray_DIMS(ap)[0]; | |||
257 | ptr2 = (char **)PyArray_mallocPyMem_RawMalloc(n * sizeof(char *)); | |||
258 | if (!ptr2) { | |||
259 | PyErr_NoMemory(); | |||
260 | return -1; | |||
261 | } | |||
262 | for (i = 0; i < n; i++) { | |||
263 | ptr2[i] = PyArray_BYTES(ap) + i*PyArray_STRIDES(ap)[0]; | |||
264 | } | |||
265 | *((char ***)ptr) = ptr2; | |||
266 | break; | |||
267 | case 3: | |||
268 | n = PyArray_DIMS(ap)[0]; | |||
269 | m = PyArray_DIMS(ap)[1]; | |||
270 | ptr3 = (char ***)PyArray_mallocPyMem_RawMalloc(n*(m+1) * sizeof(char *)); | |||
271 | if (!ptr3) { | |||
272 | PyErr_NoMemory(); | |||
273 | return -1; | |||
274 | } | |||
275 | for (i = 0; i < n; i++) { | |||
276 | ptr3[i] = (char **) &ptr3[n + m * i]; | |||
277 | for (j = 0; j < m; j++) { | |||
278 | ptr3[i][j] = PyArray_BYTES(ap) + i*PyArray_STRIDES(ap)[0] + j*PyArray_STRIDES(ap)[1]; | |||
279 | } | |||
280 | } | |||
281 | *((char ****)ptr) = ptr3; | |||
282 | } | |||
283 | if (nd) { | |||
284 | memcpy(dims, PyArray_DIMS(ap), nd*sizeof(npy_intp)); | |||
285 | } | |||
286 | *op = (PyObject *)ap; | |||
287 | return 0; | |||
288 | } | |||
289 | ||||
290 | /* Deprecated --- Use PyArray_AsCArray instead */ | |||
291 | ||||
292 | /*NUMPY_API | |||
293 | * Convert to a 1D C-array | |||
294 | */ | |||
295 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int | |||
296 | PyArray_As1D(PyObject **NPY_UNUSED(op)(__NPY_UNUSED_TAGGEDop) __attribute__ ((__unused__)), char **NPY_UNUSED(ptr)(__NPY_UNUSED_TAGGEDptr) __attribute__ ((__unused__)), | |||
297 | int *NPY_UNUSED(d1)(__NPY_UNUSED_TAGGEDd1) __attribute__ ((__unused__)), int NPY_UNUSED(typecode)(__NPY_UNUSED_TAGGEDtypecode) __attribute__ ((__unused__))) | |||
298 | { | |||
299 | /* 2008-07-14, 1.5 */ | |||
300 | PyErr_SetString(PyExc_NotImplementedError, | |||
301 | "PyArray_As1D: use PyArray_AsCArray."); | |||
302 | return -1; | |||
303 | } | |||
304 | ||||
305 | /*NUMPY_API | |||
306 | * Convert to a 2D C-array | |||
307 | */ | |||
308 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int | |||
309 | PyArray_As2D(PyObject **NPY_UNUSED(op)(__NPY_UNUSED_TAGGEDop) __attribute__ ((__unused__)), char ***NPY_UNUSED(ptr)(__NPY_UNUSED_TAGGEDptr) __attribute__ ((__unused__)), | |||
310 | int *NPY_UNUSED(d1)(__NPY_UNUSED_TAGGEDd1) __attribute__ ((__unused__)), int *NPY_UNUSED(d2)(__NPY_UNUSED_TAGGEDd2) __attribute__ ((__unused__)), int NPY_UNUSED(typecode)(__NPY_UNUSED_TAGGEDtypecode) __attribute__ ((__unused__))) | |||
311 | { | |||
312 | /* 2008-07-14, 1.5 */ | |||
313 | PyErr_SetString(PyExc_NotImplementedError, | |||
314 | "PyArray_As2D: use PyArray_AsCArray."); | |||
315 | return -1; | |||
316 | } | |||
317 | ||||
318 | /* End Deprecated */ | |||
319 | ||||
320 | /*NUMPY_API | |||
321 | * Free pointers created if As2D is called | |||
322 | */ | |||
323 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int | |||
324 | PyArray_Free(PyObject *op, void *ptr) | |||
325 | { | |||
326 | PyArrayObject *ap = (PyArrayObject *)op; | |||
327 | ||||
328 | if ((PyArray_NDIM(ap) < 1) || (PyArray_NDIM(ap) > 3)) { | |||
329 | return -1; | |||
330 | } | |||
331 | if (PyArray_NDIM(ap) >= 2) { | |||
332 | PyArray_freePyMem_RawFree(ptr); | |||
333 | } | |||
334 | Py_DECREF(ap)_Py_DECREF(((PyObject*)(ap))); | |||
335 | return 0; | |||
336 | } | |||
337 | ||||
338 | /* | |||
339 | * Get the ndarray subclass with the highest priority | |||
340 | */ | |||
341 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyTypeObject * | |||
342 | PyArray_GetSubType(int narrays, PyArrayObject **arrays) { | |||
343 | PyTypeObject *subtype = &PyArray_Type; | |||
344 | double priority = NPY_PRIORITY0.0; | |||
345 | int i; | |||
346 | ||||
347 | /* Get the priority subtype for the array */ | |||
348 | for (i = 0; i < narrays; ++i) { | |||
349 | if (Py_TYPE(arrays[i])(((PyObject*)(arrays[i]))->ob_type) != subtype) { | |||
350 | double pr = PyArray_GetPriority((PyObject *)(arrays[i]), 0.0); | |||
351 | if (pr > priority) { | |||
352 | priority = pr; | |||
353 | subtype = Py_TYPE(arrays[i])(((PyObject*)(arrays[i]))->ob_type); | |||
354 | } | |||
355 | } | |||
356 | } | |||
357 | ||||
358 | return subtype; | |||
359 | } | |||
360 | ||||
361 | ||||
362 | /* | |||
363 | * Concatenates a list of ndarrays. | |||
364 | */ | |||
365 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyArrayObject * | |||
366 | PyArray_ConcatenateArrays(int narrays, PyArrayObject **arrays, int axis, | |||
367 | PyArrayObject* ret, PyArray_Descr *dtype, | |||
368 | NPY_CASTING casting) | |||
369 | { | |||
370 | int iarrays, idim, ndim; | |||
371 | npy_intp shape[NPY_MAXDIMS32]; | |||
372 | PyArrayObject_fields *sliding_view = NULL((void*)0); | |||
373 | ||||
374 | if (narrays <= 0) { | |||
375 | PyErr_SetString(PyExc_ValueError, | |||
376 | "need at least one array to concatenate"); | |||
377 | return NULL((void*)0); | |||
378 | } | |||
379 | ||||
380 | /* All the arrays must have the same 'ndim' */ | |||
381 | ndim = PyArray_NDIM(arrays[0]); | |||
382 | ||||
383 | if (ndim == 0) { | |||
384 | PyErr_SetString(PyExc_ValueError, | |||
385 | "zero-dimensional arrays cannot be concatenated"); | |||
386 | return NULL((void*)0); | |||
387 | } | |||
388 | ||||
389 | /* Handle standard Python negative indexing */ | |||
390 | if (check_and_adjust_axis(&axis, ndim) < 0) { | |||
391 | return NULL((void*)0); | |||
392 | } | |||
393 | ||||
394 | /* | |||
395 | * Figure out the final concatenated shape starting from the first | |||
396 | * array's shape. | |||
397 | */ | |||
398 | memcpy(shape, PyArray_SHAPE(arrays[0]), ndim * sizeof(shape[0])); | |||
399 | for (iarrays = 1; iarrays < narrays; ++iarrays) { | |||
400 | npy_intp *arr_shape; | |||
401 | ||||
402 | if (PyArray_NDIM(arrays[iarrays]) != ndim) { | |||
403 | PyErr_Format(PyExc_ValueError, | |||
404 | "all the input arrays must have same number of " | |||
405 | "dimensions, but the array at index %d has %d " | |||
406 | "dimension(s) and the array at index %d has %d " | |||
407 | "dimension(s)", | |||
408 | 0, ndim, iarrays, PyArray_NDIM(arrays[iarrays])); | |||
409 | return NULL((void*)0); | |||
410 | } | |||
411 | arr_shape = PyArray_SHAPE(arrays[iarrays]); | |||
412 | ||||
413 | for (idim = 0; idim < ndim; ++idim) { | |||
414 | /* Build up the size of the concatenation axis */ | |||
415 | if (idim == axis) { | |||
416 | shape[idim] += arr_shape[idim]; | |||
417 | } | |||
418 | /* Validate that the rest of the dimensions match */ | |||
419 | else if (shape[idim] != arr_shape[idim]) { | |||
420 | PyErr_Format(PyExc_ValueError, | |||
421 | "all the input array dimensions for the " | |||
422 | "concatenation axis must match exactly, but " | |||
423 | "along dimension %d, the array at index %d has " | |||
424 | "size %d and the array at index %d has size %d", | |||
425 | idim, 0, shape[idim], iarrays, arr_shape[idim]); | |||
426 | return NULL((void*)0); | |||
427 | } | |||
428 | } | |||
429 | } | |||
430 | ||||
431 | if (ret != NULL((void*)0)) { | |||
432 | assert(dtype == NULL)((void) (0)); | |||
433 | if (PyArray_NDIM(ret) != ndim) { | |||
434 | PyErr_SetString(PyExc_ValueError, | |||
435 | "Output array has wrong dimensionality"); | |||
436 | return NULL((void*)0); | |||
437 | } | |||
438 | if (!PyArray_CompareLists(shape, PyArray_SHAPE(ret), ndim)) { | |||
439 | PyErr_SetString(PyExc_ValueError, | |||
440 | "Output array is the wrong shape"); | |||
441 | return NULL((void*)0); | |||
442 | } | |||
443 | Py_INCREF(ret)_Py_INCREF(((PyObject*)(ret))); | |||
444 | } | |||
445 | else { | |||
446 | npy_intp s, strides[NPY_MAXDIMS32]; | |||
447 | int strideperm[NPY_MAXDIMS32]; | |||
448 | ||||
449 | /* Get the priority subtype for the array */ | |||
450 | PyTypeObject *subtype = PyArray_GetSubType(narrays, arrays); | |||
451 | PyArray_Descr *descr = PyArray_FindConcatenationDescriptor( | |||
452 | narrays, arrays, (PyObject *)dtype); | |||
453 | if (descr == NULL((void*)0)) { | |||
454 | return NULL((void*)0); | |||
455 | } | |||
456 | ||||
457 | /* | |||
458 | * Figure out the permutation to apply to the strides to match | |||
459 | * the memory layout of the input arrays, using ambiguity | |||
460 | * resolution rules matching that of the NpyIter. | |||
461 | */ | |||
462 | PyArray_CreateMultiSortedStridePerm(narrays, arrays, ndim, strideperm); | |||
463 | s = descr->elsize; | |||
464 | for (idim = ndim-1; idim >= 0; --idim) { | |||
465 | int iperm = strideperm[idim]; | |||
466 | strides[iperm] = s; | |||
467 | s *= shape[iperm]; | |||
468 | } | |||
469 | ||||
470 | /* Allocate the array for the result. This steals the 'dtype' reference. */ | |||
471 | ret = (PyArrayObject *)PyArray_NewFromDescr_int( | |||
472 | subtype, descr, ndim, shape, strides, NULL((void*)0), 0, NULL((void*)0), | |||
473 | NULL((void*)0), 0, 1); | |||
474 | if (ret == NULL((void*)0)) { | |||
475 | return NULL((void*)0); | |||
476 | } | |||
477 | assert(PyArray_DESCR(ret) == descr)((void) (0)); | |||
478 | } | |||
479 | ||||
480 | /* | |||
481 | * Create a view which slides through ret for assigning the | |||
482 | * successive input arrays. | |||
483 | */ | |||
484 | sliding_view = (PyArrayObject_fields *)PyArray_View(ret, | |||
485 | NULL((void*)0), &PyArray_Type); | |||
486 | if (sliding_view == NULL((void*)0)) { | |||
487 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); | |||
488 | return NULL((void*)0); | |||
489 | } | |||
490 | for (iarrays = 0; iarrays < narrays; ++iarrays) { | |||
491 | /* Set the dimension to match the input array's */ | |||
492 | sliding_view->dimensions[axis] = PyArray_SHAPE(arrays[iarrays])[axis]; | |||
493 | ||||
494 | /* Copy the data for this array */ | |||
495 | if (PyArray_AssignArray((PyArrayObject *)sliding_view, arrays[iarrays], | |||
496 | NULL((void*)0), casting) < 0) { | |||
497 | Py_DECREF(sliding_view)_Py_DECREF(((PyObject*)(sliding_view))); | |||
498 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); | |||
499 | return NULL((void*)0); | |||
500 | } | |||
501 | ||||
502 | /* Slide to the start of the next window */ | |||
503 | sliding_view->data += sliding_view->dimensions[axis] * | |||
504 | sliding_view->strides[axis]; | |||
505 | } | |||
506 | ||||
507 | Py_DECREF(sliding_view)_Py_DECREF(((PyObject*)(sliding_view))); | |||
508 | return ret; | |||
509 | } | |||
510 | ||||
511 | /* | |||
512 | * Concatenates a list of ndarrays, flattening each in the specified order. | |||
513 | */ | |||
514 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyArrayObject * | |||
515 | PyArray_ConcatenateFlattenedArrays(int narrays, PyArrayObject **arrays, | |||
516 | NPY_ORDER order, PyArrayObject *ret, | |||
517 | PyArray_Descr *dtype, NPY_CASTING casting, | |||
518 | npy_bool casting_not_passed) | |||
519 | { | |||
520 | int iarrays; | |||
521 | npy_intp shape = 0; | |||
522 | PyArrayObject_fields *sliding_view = NULL((void*)0); | |||
523 | ||||
524 | if (narrays <= 0) { | |||
525 | PyErr_SetString(PyExc_ValueError, | |||
526 | "need at least one array to concatenate"); | |||
527 | return NULL((void*)0); | |||
528 | } | |||
529 | ||||
530 | /* | |||
531 | * Figure out the final concatenated shape starting from the first | |||
532 | * array's shape. | |||
533 | */ | |||
534 | for (iarrays = 0; iarrays < narrays; ++iarrays) { | |||
535 | shape += PyArray_SIZE(arrays[iarrays])PyArray_MultiplyList(PyArray_DIMS(arrays[iarrays]), PyArray_NDIM (arrays[iarrays])); | |||
536 | /* Check for overflow */ | |||
537 | if (shape < 0) { | |||
538 | PyErr_SetString(PyExc_ValueError, | |||
539 | "total number of elements " | |||
540 | "too large to concatenate"); | |||
541 | return NULL((void*)0); | |||
542 | } | |||
543 | } | |||
544 | ||||
545 | int out_passed = 0; | |||
546 | if (ret != NULL((void*)0)) { | |||
547 | assert(dtype == NULL)((void) (0)); | |||
548 | out_passed = 1; | |||
549 | if (PyArray_NDIM(ret) != 1) { | |||
550 | PyErr_SetString(PyExc_ValueError, | |||
551 | "Output array must be 1D"); | |||
552 | return NULL((void*)0); | |||
553 | } | |||
554 | if (shape != PyArray_SIZE(ret)PyArray_MultiplyList(PyArray_DIMS(ret), PyArray_NDIM(ret))) { | |||
555 | PyErr_SetString(PyExc_ValueError, | |||
556 | "Output array is the wrong size"); | |||
557 | return NULL((void*)0); | |||
558 | } | |||
559 | Py_INCREF(ret)_Py_INCREF(((PyObject*)(ret))); | |||
560 | } | |||
561 | else { | |||
562 | npy_intp stride; | |||
563 | ||||
564 | /* Get the priority subtype for the array */ | |||
565 | PyTypeObject *subtype = PyArray_GetSubType(narrays, arrays); | |||
566 | ||||
567 | PyArray_Descr *descr = PyArray_FindConcatenationDescriptor( | |||
568 | narrays, arrays, (PyObject *)dtype); | |||
569 | if (descr == NULL((void*)0)) { | |||
570 | return NULL((void*)0); | |||
571 | } | |||
572 | ||||
573 | stride = descr->elsize; | |||
574 | ||||
575 | /* Allocate the array for the result. This steals the 'dtype' reference. */ | |||
576 | ret = (PyArrayObject *)PyArray_NewFromDescr_int( | |||
577 | subtype, descr, 1, &shape, &stride, NULL((void*)0), 0, NULL((void*)0), | |||
578 | NULL((void*)0), 0, 1); | |||
579 | if (ret == NULL((void*)0)) { | |||
580 | return NULL((void*)0); | |||
581 | } | |||
582 | assert(PyArray_DESCR(ret) == descr)((void) (0)); | |||
583 | } | |||
584 | ||||
585 | /* | |||
586 | * Create a view which slides through ret for assigning the | |||
587 | * successive input arrays. | |||
588 | */ | |||
589 | sliding_view = (PyArrayObject_fields *)PyArray_View(ret, | |||
590 | NULL((void*)0), &PyArray_Type); | |||
591 | if (sliding_view == NULL((void*)0)) { | |||
592 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); | |||
593 | return NULL((void*)0); | |||
594 | } | |||
595 | ||||
596 | int give_deprecation_warning = 1; /* To give warning for just one input array. */ | |||
597 | for (iarrays = 0; iarrays < narrays; ++iarrays) { | |||
598 | /* Adjust the window dimensions for this array */ | |||
599 | sliding_view->dimensions[0] = PyArray_SIZE(arrays[iarrays])PyArray_MultiplyList(PyArray_DIMS(arrays[iarrays]), PyArray_NDIM (arrays[iarrays])); | |||
600 | ||||
601 | if (!PyArray_CanCastArrayTo( | |||
602 | arrays[iarrays], PyArray_DESCR(ret), casting)) { | |||
603 | /* This should be an error, but was previously allowed here. */ | |||
604 | if (casting_not_passed && out_passed) { | |||
605 | /* NumPy 1.20, 2020-09-03 */ | |||
606 | if (give_deprecation_warning && DEPRECATE(PyErr_WarnEx(PyExc_DeprecationWarning,"concatenate() with `axis=None` will use same-kind " "casting by default in the future. Please use " "`casting='unsafe'` to retain the old behaviour. " "In the future this will be a TypeError.",1) | |||
607 | "concatenate() with `axis=None` will use same-kind "PyErr_WarnEx(PyExc_DeprecationWarning,"concatenate() with `axis=None` will use same-kind " "casting by default in the future. Please use " "`casting='unsafe'` to retain the old behaviour. " "In the future this will be a TypeError.",1) | |||
608 | "casting by default in the future. Please use "PyErr_WarnEx(PyExc_DeprecationWarning,"concatenate() with `axis=None` will use same-kind " "casting by default in the future. Please use " "`casting='unsafe'` to retain the old behaviour. " "In the future this will be a TypeError.",1) | |||
609 | "`casting='unsafe'` to retain the old behaviour. "PyErr_WarnEx(PyExc_DeprecationWarning,"concatenate() with `axis=None` will use same-kind " "casting by default in the future. Please use " "`casting='unsafe'` to retain the old behaviour. " "In the future this will be a TypeError.",1) | |||
610 | "In the future this will be a TypeError.")PyErr_WarnEx(PyExc_DeprecationWarning,"concatenate() with `axis=None` will use same-kind " "casting by default in the future. Please use " "`casting='unsafe'` to retain the old behaviour. " "In the future this will be a TypeError.",1) < 0) { | |||
611 | Py_DECREF(sliding_view)_Py_DECREF(((PyObject*)(sliding_view))); | |||
612 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); | |||
613 | return NULL((void*)0); | |||
614 | } | |||
615 | give_deprecation_warning = 0; | |||
616 | } | |||
617 | else { | |||
618 | npy_set_invalid_cast_error( | |||
619 | PyArray_DESCR(arrays[iarrays]), PyArray_DESCR(ret), | |||
620 | casting, PyArray_NDIM(arrays[iarrays]) == 0); | |||
621 | Py_DECREF(sliding_view)_Py_DECREF(((PyObject*)(sliding_view))); | |||
622 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); | |||
623 | return NULL((void*)0); | |||
624 | } | |||
625 | } | |||
626 | ||||
627 | /* Copy the data for this array */ | |||
628 | if (PyArray_CopyAsFlat((PyArrayObject *)sliding_view, arrays[iarrays], | |||
629 | order) < 0) { | |||
630 | Py_DECREF(sliding_view)_Py_DECREF(((PyObject*)(sliding_view))); | |||
631 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); | |||
632 | return NULL((void*)0); | |||
633 | } | |||
634 | ||||
635 | /* Slide to the start of the next window */ | |||
636 | sliding_view->data += | |||
637 | sliding_view->strides[0] * PyArray_SIZE(arrays[iarrays])PyArray_MultiplyList(PyArray_DIMS(arrays[iarrays]), PyArray_NDIM (arrays[iarrays])); | |||
638 | } | |||
639 | ||||
640 | Py_DECREF(sliding_view)_Py_DECREF(((PyObject*)(sliding_view))); | |||
641 | return ret; | |||
642 | } | |||
643 | ||||
644 | ||||
645 | /** | |||
646 | * Implementation for np.concatenate | |||
647 | * | |||
648 | * @param op Sequence of arrays to concatenate | |||
649 | * @param axis Axis to concatenate along | |||
650 | * @param ret output array to fill | |||
651 | * @param dtype Forced output array dtype (cannot be combined with ret) | |||
652 | * @param casting Casting mode used | |||
653 | * @param casting_not_passed Deprecation helper | |||
654 | */ | |||
655 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | |||
656 | PyArray_ConcatenateInto(PyObject *op, | |||
657 | int axis, PyArrayObject *ret, PyArray_Descr *dtype, | |||
658 | NPY_CASTING casting, npy_bool casting_not_passed) | |||
659 | { | |||
660 | int iarrays, narrays; | |||
661 | PyArrayObject **arrays; | |||
662 | ||||
663 | if (!PySequence_Check(op)) { | |||
664 | PyErr_SetString(PyExc_TypeError, | |||
665 | "The first input argument needs to be a sequence"); | |||
666 | return NULL((void*)0); | |||
667 | } | |||
668 | if (ret != NULL((void*)0) && dtype != NULL((void*)0)) { | |||
669 | PyErr_SetString(PyExc_TypeError, | |||
670 | "concatenate() only takes `out` or `dtype` as an " | |||
671 | "argument, but both were provided."); | |||
672 | return NULL((void*)0); | |||
673 | } | |||
674 | ||||
675 | /* Convert the input list into arrays */ | |||
676 | narrays = PySequence_Size(op); | |||
677 | if (narrays < 0) { | |||
678 | return NULL((void*)0); | |||
679 | } | |||
680 | arrays = PyArray_mallocPyMem_RawMalloc(narrays * sizeof(arrays[0])); | |||
681 | if (arrays == NULL((void*)0)) { | |||
682 | PyErr_NoMemory(); | |||
683 | return NULL((void*)0); | |||
684 | } | |||
685 | for (iarrays = 0; iarrays < narrays; ++iarrays) { | |||
686 | PyObject *item = PySequence_GetItem(op, iarrays); | |||
687 | if (item == NULL((void*)0)) { | |||
688 | narrays = iarrays; | |||
689 | goto fail; | |||
690 | } | |||
691 | arrays[iarrays] = (PyArrayObject *)PyArray_FROM_O(item)PyArray_FromAny(item, ((void*)0), 0, 0, 0, ((void*)0)); | |||
692 | Py_DECREF(item)_Py_DECREF(((PyObject*)(item))); | |||
693 | if (arrays[iarrays] == NULL((void*)0)) { | |||
694 | narrays = iarrays; | |||
695 | goto fail; | |||
696 | } | |||
697 | } | |||
698 | ||||
699 | if (axis >= NPY_MAXDIMS32) { | |||
700 | ret = PyArray_ConcatenateFlattenedArrays( | |||
701 | narrays, arrays, NPY_CORDER, ret, dtype, | |||
702 | casting, casting_not_passed); | |||
703 | } | |||
704 | else { | |||
705 | ret = PyArray_ConcatenateArrays( | |||
706 | narrays, arrays, axis, ret, dtype, casting); | |||
707 | } | |||
708 | ||||
709 | for (iarrays = 0; iarrays < narrays; ++iarrays) { | |||
710 | Py_DECREF(arrays[iarrays])_Py_DECREF(((PyObject*)(arrays[iarrays]))); | |||
711 | } | |||
712 | PyArray_freePyMem_RawFree(arrays); | |||
713 | ||||
714 | return (PyObject *)ret; | |||
715 | ||||
716 | fail: | |||
717 | /* 'narrays' was set to how far we got in the conversion */ | |||
718 | for (iarrays = 0; iarrays < narrays; ++iarrays) { | |||
719 | Py_DECREF(arrays[iarrays])_Py_DECREF(((PyObject*)(arrays[iarrays]))); | |||
720 | } | |||
721 | PyArray_freePyMem_RawFree(arrays); | |||
722 | ||||
723 | return NULL((void*)0); | |||
724 | } | |||
725 | ||||
726 | /*NUMPY_API | |||
727 | * Concatenate | |||
728 | * | |||
729 | * Concatenate an arbitrary Python sequence into an array. | |||
730 | * op is a python object supporting the sequence interface. | |||
731 | * Its elements will be concatenated together to form a single | |||
732 | * multidimensional array. If axis is NPY_MAXDIMS or bigger, then | |||
733 | * each sequence object will be flattened before concatenation | |||
734 | */ | |||
735 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | |||
736 | PyArray_Concatenate(PyObject *op, int axis) | |||
737 | { | |||
738 | /* retain legacy behaviour for casting */ | |||
739 | NPY_CASTING casting; | |||
740 | if (axis >= NPY_MAXDIMS32) { | |||
741 | casting = NPY_UNSAFE_CASTING; | |||
742 | } | |||
743 | else { | |||
744 | casting = NPY_SAME_KIND_CASTING; | |||
745 | } | |||
746 | return PyArray_ConcatenateInto( | |||
747 | op, axis, NULL((void*)0), NULL((void*)0), casting, 0); | |||
748 | } | |||
749 | ||||
750 | static int | |||
751 | _signbit_set(PyArrayObject *arr) | |||
752 | { | |||
753 | static char bitmask = (char) 0x80; | |||
754 | char *ptr; /* points to the npy_byte to test */ | |||
755 | char byteorder; | |||
756 | int elsize; | |||
757 | ||||
758 | elsize = PyArray_DESCR(arr)->elsize; | |||
759 | byteorder = PyArray_DESCR(arr)->byteorder; | |||
760 | ptr = PyArray_DATA(arr); | |||
761 | if (elsize > 1 && | |||
762 | (byteorder == NPY_LITTLE'<' || | |||
763 | (byteorder == NPY_NATIVE'=' && | |||
764 | PyArray_ISNBO(NPY_LITTLE)(('<') != '>')))) { | |||
765 | ptr += elsize - 1; | |||
766 | } | |||
767 | return ((*ptr & bitmask) != 0); | |||
768 | } | |||
769 | ||||
770 | ||||
771 | /*NUMPY_API | |||
772 | * ScalarKind | |||
773 | * | |||
774 | * Returns the scalar kind of a type number, with an | |||
775 | * optional tweak based on the scalar value itself. | |||
776 | * If no scalar is provided, it returns INTPOS_SCALAR | |||
777 | * for both signed and unsigned integers, otherwise | |||
778 | * it checks the sign of any signed integer to choose | |||
779 | * INTNEG_SCALAR when appropriate. | |||
780 | */ | |||
781 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) NPY_SCALARKIND | |||
782 | PyArray_ScalarKind(int typenum, PyArrayObject **arr) | |||
783 | { | |||
784 | NPY_SCALARKIND ret = NPY_NOSCALAR; | |||
785 | ||||
786 | if ((unsigned int)typenum < NPY_NTYPES) { | |||
787 | ret = _npy_scalar_kinds_table[typenum]; | |||
788 | /* Signed integer types are INTNEG in the table */ | |||
789 | if (ret == NPY_INTNEG_SCALAR) { | |||
790 | if (!arr || !_signbit_set(*arr)) { | |||
791 | ret = NPY_INTPOS_SCALAR; | |||
792 | } | |||
793 | } | |||
794 | } else if (PyTypeNum_ISUSERDEF(typenum)(((typenum) >= NPY_USERDEF) && ((typenum) < NPY_USERDEF + NPY_NUMUSERTYPES))) { | |||
795 | PyArray_Descr* descr = PyArray_DescrFromType(typenum); | |||
796 | ||||
797 | if (descr->f->scalarkind) { | |||
798 | ret = descr->f->scalarkind((arr ? *arr : NULL((void*)0))); | |||
799 | } | |||
800 | Py_DECREF(descr)_Py_DECREF(((PyObject*)(descr))); | |||
801 | } | |||
802 | ||||
803 | return ret; | |||
804 | } | |||
805 | ||||
806 | /*NUMPY_API | |||
807 | * | |||
808 | * Determines whether the data type 'thistype', with | |||
809 | * scalar kind 'scalar', can be coerced into 'neededtype'. | |||
810 | */ | |||
811 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int | |||
812 | PyArray_CanCoerceScalar(int thistype, int neededtype, | |||
813 | NPY_SCALARKIND scalar) | |||
814 | { | |||
815 | PyArray_Descr* from; | |||
816 | int *castlist; | |||
817 | ||||
818 | /* If 'thistype' is not a scalar, it must be safely castable */ | |||
819 | if (scalar == NPY_NOSCALAR) { | |||
820 | return PyArray_CanCastSafely(thistype, neededtype); | |||
821 | } | |||
822 | if ((unsigned int)neededtype < NPY_NTYPES) { | |||
823 | NPY_SCALARKIND neededscalar; | |||
824 | ||||
825 | if (scalar == NPY_OBJECT_SCALAR) { | |||
826 | return PyArray_CanCastSafely(thistype, neededtype); | |||
827 | } | |||
828 | ||||
829 | /* | |||
830 | * The lookup table gives us exactly what we need for | |||
831 | * this comparison, which PyArray_ScalarKind would not. | |||
832 | * | |||
833 | * The rule is that positive scalars can be coerced | |||
834 | * to a signed ints, but negative scalars cannot be coerced | |||
835 | * to unsigned ints. | |||
836 | * _npy_scalar_kinds_table[int]==NEGINT > POSINT, | |||
837 | * so 1 is returned, but | |||
838 | * _npy_scalar_kinds_table[uint]==POSINT < NEGINT, | |||
839 | * so 0 is returned, as required. | |||
840 | * | |||
841 | */ | |||
842 | neededscalar = _npy_scalar_kinds_table[neededtype]; | |||
843 | if (neededscalar >= scalar) { | |||
844 | return 1; | |||
845 | } | |||
846 | if (!PyTypeNum_ISUSERDEF(thistype)(((thistype) >= NPY_USERDEF) && ((thistype) < NPY_USERDEF + NPY_NUMUSERTYPES))) { | |||
847 | return 0; | |||
848 | } | |||
849 | } | |||
850 | ||||
851 | from = PyArray_DescrFromType(thistype); | |||
852 | if (from->f->cancastscalarkindto | |||
853 | && (castlist = from->f->cancastscalarkindto[scalar])) { | |||
854 | while (*castlist != NPY_NOTYPE) { | |||
855 | if (*castlist++ == neededtype) { | |||
856 | Py_DECREF(from)_Py_DECREF(((PyObject*)(from))); | |||
857 | return 1; | |||
858 | } | |||
859 | } | |||
860 | } | |||
861 | Py_DECREF(from)_Py_DECREF(((PyObject*)(from))); | |||
862 | ||||
863 | return 0; | |||
864 | } | |||
865 | ||||
866 | /* Could perhaps be redone to not make contiguous arrays */ | |||
867 | ||||
868 | /*NUMPY_API | |||
869 | * Numeric.innerproduct(a,v) | |||
870 | */ | |||
871 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | |||
872 | PyArray_InnerProduct(PyObject *op1, PyObject *op2) | |||
873 | { | |||
874 | PyArrayObject *ap1 = NULL((void*)0); | |||
875 | PyArrayObject *ap2 = NULL((void*)0); | |||
876 | int typenum; | |||
877 | PyArray_Descr *typec = NULL((void*)0); | |||
878 | PyObject* ap2t = NULL((void*)0); | |||
879 | npy_intp dims[NPY_MAXDIMS32]; | |||
880 | PyArray_Dims newaxes = {dims, 0}; | |||
881 | int i; | |||
882 | PyObject* ret = NULL((void*)0); | |||
883 | ||||
884 | typenum = PyArray_ObjectType(op1, 0); | |||
885 | if (typenum == NPY_NOTYPE && PyErr_Occurred()) { | |||
886 | return NULL((void*)0); | |||
887 | } | |||
888 | typenum = PyArray_ObjectType(op2, typenum); | |||
889 | typec = PyArray_DescrFromType(typenum); | |||
890 | if (typec == NULL((void*)0)) { | |||
891 | if (!PyErr_Occurred()) { | |||
892 | PyErr_SetString(PyExc_TypeError, | |||
893 | "Cannot find a common data type."); | |||
894 | } | |||
895 | goto fail; | |||
896 | } | |||
897 | ||||
898 | Py_INCREF(typec)_Py_INCREF(((PyObject*)(typec))); | |||
899 | ap1 = (PyArrayObject *)PyArray_FromAny(op1, typec, 0, 0, | |||
900 | NPY_ARRAY_ALIGNED0x0100, NULL((void*)0)); | |||
901 | if (ap1 == NULL((void*)0)) { | |||
902 | Py_DECREF(typec)_Py_DECREF(((PyObject*)(typec))); | |||
903 | goto fail; | |||
904 | } | |||
905 | ap2 = (PyArrayObject *)PyArray_FromAny(op2, typec, 0, 0, | |||
906 | NPY_ARRAY_ALIGNED0x0100, NULL((void*)0)); | |||
907 | if (ap2 == NULL((void*)0)) { | |||
908 | goto fail; | |||
909 | } | |||
910 | ||||
911 | newaxes.len = PyArray_NDIM(ap2); | |||
912 | if ((PyArray_NDIM(ap1) >= 1) && (newaxes.len >= 2)) { | |||
913 | for (i = 0; i < newaxes.len - 2; i++) { | |||
914 | dims[i] = (npy_intp)i; | |||
915 | } | |||
916 | dims[newaxes.len - 2] = newaxes.len - 1; | |||
917 | dims[newaxes.len - 1] = newaxes.len - 2; | |||
918 | ||||
919 | ap2t = PyArray_Transpose(ap2, &newaxes); | |||
920 | if (ap2t == NULL((void*)0)) { | |||
921 | goto fail; | |||
922 | } | |||
923 | } | |||
924 | else { | |||
925 | ap2t = (PyObject *)ap2; | |||
926 | Py_INCREF(ap2)_Py_INCREF(((PyObject*)(ap2))); | |||
927 | } | |||
928 | ||||
929 | ret = PyArray_MatrixProduct2((PyObject *)ap1, ap2t, NULL((void*)0)); | |||
930 | if (ret == NULL((void*)0)) { | |||
931 | goto fail; | |||
932 | } | |||
933 | ||||
934 | ||||
935 | Py_DECREF(ap1)_Py_DECREF(((PyObject*)(ap1))); | |||
936 | Py_DECREF(ap2)_Py_DECREF(((PyObject*)(ap2))); | |||
937 | Py_DECREF(ap2t)_Py_DECREF(((PyObject*)(ap2t))); | |||
938 | return ret; | |||
939 | ||||
940 | fail: | |||
941 | Py_XDECREF(ap1)_Py_XDECREF(((PyObject*)(ap1))); | |||
942 | Py_XDECREF(ap2)_Py_XDECREF(((PyObject*)(ap2))); | |||
943 | Py_XDECREF(ap2t)_Py_XDECREF(((PyObject*)(ap2t))); | |||
944 | Py_XDECREF(ret)_Py_XDECREF(((PyObject*)(ret))); | |||
945 | return NULL((void*)0); | |||
946 | } | |||
947 | ||||
948 | /*NUMPY_API | |||
949 | * Numeric.matrixproduct(a,v) | |||
950 | * just like inner product but does the swapaxes stuff on the fly | |||
951 | */ | |||
952 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | |||
953 | PyArray_MatrixProduct(PyObject *op1, PyObject *op2) | |||
954 | { | |||
955 | return PyArray_MatrixProduct2(op1, op2, NULL((void*)0)); | |||
956 | } | |||
957 | ||||
958 | /*NUMPY_API | |||
959 | * Numeric.matrixproduct2(a,v,out) | |||
960 | * just like inner product but does the swapaxes stuff on the fly | |||
961 | */ | |||
962 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | |||
963 | PyArray_MatrixProduct2(PyObject *op1, PyObject *op2, PyArrayObject* out) | |||
964 | { | |||
965 | PyArrayObject *ap1, *ap2, *out_buf = NULL((void*)0), *result = NULL((void*)0); | |||
966 | PyArrayIterObject *it1, *it2; | |||
967 | npy_intp i, j, l; | |||
968 | int typenum, nd, axis, matchDim; | |||
969 | npy_intp is1, is2, os; | |||
970 | char *op; | |||
971 | npy_intp dimensions[NPY_MAXDIMS32]; | |||
972 | PyArray_DotFunc *dot; | |||
973 | PyArray_Descr *typec = NULL((void*)0); | |||
974 | NPY_BEGIN_THREADS_DEFPyThreadState *_save=((void*)0);; | |||
975 | ||||
976 | typenum = PyArray_ObjectType(op1, 0); | |||
977 | if (typenum == NPY_NOTYPE && PyErr_Occurred()) { | |||
978 | return NULL((void*)0); | |||
979 | } | |||
980 | typenum = PyArray_ObjectType(op2, typenum); | |||
981 | typec = PyArray_DescrFromType(typenum); | |||
982 | if (typec == NULL((void*)0)) { | |||
983 | if (!PyErr_Occurred()) { | |||
984 | PyErr_SetString(PyExc_TypeError, | |||
985 | "Cannot find a common data type."); | |||
986 | } | |||
987 | return NULL((void*)0); | |||
988 | } | |||
989 | ||||
990 | Py_INCREF(typec)_Py_INCREF(((PyObject*)(typec))); | |||
991 | ap1 = (PyArrayObject *)PyArray_FromAny(op1, typec, 0, 0, | |||
992 | NPY_ARRAY_ALIGNED0x0100, NULL((void*)0)); | |||
993 | if (ap1 == NULL((void*)0)) { | |||
994 | Py_DECREF(typec)_Py_DECREF(((PyObject*)(typec))); | |||
995 | return NULL((void*)0); | |||
996 | } | |||
997 | ap2 = (PyArrayObject *)PyArray_FromAny(op2, typec, 0, 0, | |||
998 | NPY_ARRAY_ALIGNED0x0100, NULL((void*)0)); | |||
999 | if (ap2 == NULL((void*)0)) { | |||
1000 | Py_DECREF(ap1)_Py_DECREF(((PyObject*)(ap1))); | |||
1001 | return NULL((void*)0); | |||
1002 | } | |||
1003 | ||||
1004 | #if defined(HAVE_CBLAS) | |||
1005 | if (PyArray_NDIM(ap1) <= 2 && PyArray_NDIM(ap2) <= 2 && | |||
1006 | (NPY_DOUBLE == typenum || NPY_CDOUBLE == typenum || | |||
1007 | NPY_FLOAT == typenum || NPY_CFLOAT == typenum)) { | |||
1008 | return cblas_matrixproduct(typenum, ap1, ap2, out); | |||
1009 | } | |||
1010 | #endif | |||
1011 | ||||
1012 | if (PyArray_NDIM(ap1) == 0 || PyArray_NDIM(ap2) == 0) { | |||
1013 | result = (PyArray_NDIM(ap1) == 0 ? ap1 : ap2); | |||
1014 | result = (PyArrayObject *)Py_TYPE(result)(((PyObject*)(result))->ob_type)->tp_as_number->nb_multiply( | |||
1015 | (PyObject *)ap1, (PyObject *)ap2); | |||
1016 | Py_DECREF(ap1)_Py_DECREF(((PyObject*)(ap1))); | |||
1017 | Py_DECREF(ap2)_Py_DECREF(((PyObject*)(ap2))); | |||
1018 | return (PyObject *)result; | |||
1019 | } | |||
1020 | l = PyArray_DIMS(ap1)[PyArray_NDIM(ap1) - 1]; | |||
1021 | if (PyArray_NDIM(ap2) > 1) { | |||
1022 | matchDim = PyArray_NDIM(ap2) - 2; | |||
1023 | } | |||
1024 | else { | |||
1025 | matchDim = 0; | |||
1026 | } | |||
1027 | if (PyArray_DIMS(ap2)[matchDim] != l) { | |||
1028 | dot_alignment_error(ap1, PyArray_NDIM(ap1) - 1, ap2, matchDim); | |||
1029 | goto fail; | |||
1030 | } | |||
1031 | nd = PyArray_NDIM(ap1) + PyArray_NDIM(ap2) - 2; | |||
1032 | if (nd > NPY_MAXDIMS32) { | |||
1033 | PyErr_SetString(PyExc_ValueError, "dot: too many dimensions in result"); | |||
1034 | goto fail; | |||
1035 | } | |||
1036 | j = 0; | |||
1037 | for (i = 0; i < PyArray_NDIM(ap1) - 1; i++) { | |||
1038 | dimensions[j++] = PyArray_DIMS(ap1)[i]; | |||
1039 | } | |||
1040 | for (i = 0; i < PyArray_NDIM(ap2) - 2; i++) { | |||
1041 | dimensions[j++] = PyArray_DIMS(ap2)[i]; | |||
1042 | } | |||
1043 | if (PyArray_NDIM(ap2) > 1) { | |||
1044 | dimensions[j++] = PyArray_DIMS(ap2)[PyArray_NDIM(ap2)-1]; | |||
1045 | } | |||
1046 | ||||
1047 | is1 = PyArray_STRIDES(ap1)[PyArray_NDIM(ap1)-1]; | |||
1048 | is2 = PyArray_STRIDES(ap2)[matchDim]; | |||
1049 | /* Choose which subtype to return */ | |||
1050 | out_buf = new_array_for_sum(ap1, ap2, out, nd, dimensions, typenum, &result); | |||
1051 | if (out_buf == NULL((void*)0)) { | |||
1052 | goto fail; | |||
1053 | } | |||
1054 | /* Ensure that multiarray.dot(<Nx0>,<0xM>) -> zeros((N,M)) */ | |||
1055 | if (PyArray_SIZE(ap1)PyArray_MultiplyList(PyArray_DIMS(ap1), PyArray_NDIM(ap1)) == 0 && PyArray_SIZE(ap2)PyArray_MultiplyList(PyArray_DIMS(ap2), PyArray_NDIM(ap2)) == 0) { | |||
1056 | memset(PyArray_DATA(out_buf), 0, PyArray_NBYTES(out_buf)(PyArray_ITEMSIZE(out_buf) * PyArray_MultiplyList(PyArray_DIMS (out_buf), PyArray_NDIM(out_buf)))); | |||
1057 | } | |||
1058 | ||||
1059 | dot = PyArray_DESCR(out_buf)->f->dotfunc; | |||
1060 | if (dot == NULL((void*)0)) { | |||
1061 | PyErr_SetString(PyExc_ValueError, | |||
1062 | "dot not available for this type"); | |||
1063 | goto fail; | |||
1064 | } | |||
1065 | ||||
1066 | op = PyArray_DATA(out_buf); | |||
1067 | os = PyArray_DESCR(out_buf)->elsize; | |||
1068 | axis = PyArray_NDIM(ap1)-1; | |||
1069 | it1 = (PyArrayIterObject *) | |||
1070 | PyArray_IterAllButAxis((PyObject *)ap1, &axis); | |||
1071 | if (it1 == NULL((void*)0)) { | |||
1072 | goto fail; | |||
1073 | } | |||
1074 | it2 = (PyArrayIterObject *) | |||
1075 | PyArray_IterAllButAxis((PyObject *)ap2, &matchDim); | |||
1076 | if (it2 == NULL((void*)0)) { | |||
1077 | Py_DECREF(it1)_Py_DECREF(((PyObject*)(it1))); | |||
1078 | goto fail; | |||
1079 | } | |||
1080 | NPY_BEGIN_THREADS_DESCR(PyArray_DESCR(ap2))do {if (!(((((PyArray_DESCR(ap2)))->flags & (0x10)) == (0x10)))) do {_save = PyEval_SaveThread();} while (0);;} while (0);; | |||
1081 | while (it1->index < it1->size) { | |||
1082 | while (it2->index < it2->size) { | |||
1083 | dot(it1->dataptr, is1, it2->dataptr, is2, op, l, NULL((void*)0)); | |||
1084 | op += os; | |||
1085 | PyArray_ITER_NEXT(it2)do { ((PyArrayIterObject *)(it2))->index++; if (((PyArrayIterObject *)(it2))->nd_m1 == 0) { do { (((PyArrayIterObject *)(it2) ))->dataptr += ((PyArrayIterObject *)(((PyArrayIterObject * )(it2))))->strides[0]; (((PyArrayIterObject *)(it2)))-> coordinates[0]++; } while (0); } else if (((PyArrayIterObject *)(it2))->contiguous) ((PyArrayIterObject *)(it2))->dataptr += PyArray_DESCR(((PyArrayIterObject *)(it2))->ao)->elsize ; else if (((PyArrayIterObject *)(it2))->nd_m1 == 1) { do { if ((((PyArrayIterObject *)(it2)))->coordinates[1] < ( ((PyArrayIterObject *)(it2)))->dims_m1[1]) { (((PyArrayIterObject *)(it2)))->coordinates[1]++; (((PyArrayIterObject *)(it2) ))->dataptr += (((PyArrayIterObject *)(it2)))->strides[ 1]; } else { (((PyArrayIterObject *)(it2)))->coordinates[1 ] = 0; (((PyArrayIterObject *)(it2)))->coordinates[0]++; ( ((PyArrayIterObject *)(it2)))->dataptr += (((PyArrayIterObject *)(it2)))->strides[0] - (((PyArrayIterObject *)(it2)))-> backstrides[1]; } } while (0); } else { int __npy_i; for (__npy_i =((PyArrayIterObject *)(it2))->nd_m1; __npy_i >= 0; __npy_i --) { if (((PyArrayIterObject *)(it2))->coordinates[__npy_i ] < ((PyArrayIterObject *)(it2))->dims_m1[__npy_i]) { ( (PyArrayIterObject *)(it2))->coordinates[__npy_i]++; ((PyArrayIterObject *)(it2))->dataptr += ((PyArrayIterObject *)(it2))->strides [__npy_i]; break; } else { ((PyArrayIterObject *)(it2))->coordinates [__npy_i] = 0; ((PyArrayIterObject *)(it2))->dataptr -= (( PyArrayIterObject *)(it2))->backstrides[__npy_i]; } } } } while (0); | |||
1086 | } | |||
1087 | PyArray_ITER_NEXT(it1)do { ((PyArrayIterObject *)(it1))->index++; if (((PyArrayIterObject *)(it1))->nd_m1 == 0) { do { (((PyArrayIterObject *)(it1) ))->dataptr += ((PyArrayIterObject *)(((PyArrayIterObject * )(it1))))->strides[0]; (((PyArrayIterObject *)(it1)))-> coordinates[0]++; } while (0); } else if (((PyArrayIterObject *)(it1))->contiguous) ((PyArrayIterObject *)(it1))->dataptr += PyArray_DESCR(((PyArrayIterObject *)(it1))->ao)->elsize ; else if (((PyArrayIterObject *)(it1))->nd_m1 == 1) { do { if ((((PyArrayIterObject *)(it1)))->coordinates[1] < ( ((PyArrayIterObject *)(it1)))->dims_m1[1]) { (((PyArrayIterObject *)(it1)))->coordinates[1]++; (((PyArrayIterObject *)(it1) ))->dataptr += (((PyArrayIterObject *)(it1)))->strides[ 1]; } else { (((PyArrayIterObject *)(it1)))->coordinates[1 ] = 0; (((PyArrayIterObject *)(it1)))->coordinates[0]++; ( ((PyArrayIterObject *)(it1)))->dataptr += (((PyArrayIterObject *)(it1)))->strides[0] - (((PyArrayIterObject *)(it1)))-> backstrides[1]; } } while (0); } else { int __npy_i; for (__npy_i =((PyArrayIterObject *)(it1))->nd_m1; __npy_i >= 0; __npy_i --) { if (((PyArrayIterObject *)(it1))->coordinates[__npy_i ] < ((PyArrayIterObject *)(it1))->dims_m1[__npy_i]) { ( (PyArrayIterObject *)(it1))->coordinates[__npy_i]++; ((PyArrayIterObject *)(it1))->dataptr += ((PyArrayIterObject *)(it1))->strides [__npy_i]; break; } else { ((PyArrayIterObject *)(it1))->coordinates [__npy_i] = 0; ((PyArrayIterObject *)(it1))->dataptr -= (( PyArrayIterObject *)(it1))->backstrides[__npy_i]; } } } } while (0); | |||
1088 | PyArray_ITER_RESET(it2)do { ((PyArrayIterObject *)(it2))->index = 0; ((PyArrayIterObject *)(it2))->dataptr = PyArray_BYTES(((PyArrayIterObject *)( it2))->ao); memset(((PyArrayIterObject *)(it2))->coordinates , 0, (((PyArrayIterObject *)(it2))->nd_m1+1)*sizeof(npy_intp )); } while (0); | |||
1089 | } | |||
1090 | NPY_END_THREADS_DESCR(PyArray_DESCR(ap2))do {if (!(((((PyArray_DESCR(ap2)))->flags & (0x10)) == (0x10)))) do { if (_save) { PyEval_RestoreThread(_save); _save = ((void*)0);} } while (0);; } while (0);; | |||
1091 | Py_DECREF(it1)_Py_DECREF(((PyObject*)(it1))); | |||
1092 | Py_DECREF(it2)_Py_DECREF(((PyObject*)(it2))); | |||
1093 | if (PyErr_Occurred()) { | |||
1094 | /* only for OBJECT arrays */ | |||
1095 | goto fail; | |||
1096 | } | |||
1097 | Py_DECREF(ap1)_Py_DECREF(((PyObject*)(ap1))); | |||
1098 | Py_DECREF(ap2)_Py_DECREF(((PyObject*)(ap2))); | |||
1099 | ||||
1100 | /* Trigger possible copy-back into `result` */ | |||
1101 | PyArray_ResolveWritebackIfCopy(out_buf); | |||
1102 | Py_DECREF(out_buf)_Py_DECREF(((PyObject*)(out_buf))); | |||
1103 | ||||
1104 | return (PyObject *)result; | |||
1105 | ||||
1106 | fail: | |||
1107 | Py_XDECREF(ap1)_Py_XDECREF(((PyObject*)(ap1))); | |||
1108 | Py_XDECREF(ap2)_Py_XDECREF(((PyObject*)(ap2))); | |||
1109 | Py_XDECREF(out_buf)_Py_XDECREF(((PyObject*)(out_buf))); | |||
1110 | Py_XDECREF(result)_Py_XDECREF(((PyObject*)(result))); | |||
1111 | return NULL((void*)0); | |||
1112 | } | |||
1113 | ||||
1114 | ||||
1115 | /*NUMPY_API | |||
1116 | * Copy and Transpose | |||
1117 | * | |||
1118 | * Could deprecate this function, as there isn't a speed benefit over | |||
1119 | * calling Transpose and then Copy. | |||
1120 | */ | |||
1121 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | |||
1122 | PyArray_CopyAndTranspose(PyObject *op) | |||
1123 | { | |||
1124 | PyArrayObject *arr, *tmp, *ret; | |||
1125 | int i; | |||
1126 | npy_intp new_axes_values[NPY_MAXDIMS32]; | |||
1127 | PyArray_Dims new_axes; | |||
1128 | ||||
1129 | /* Make sure we have an array */ | |||
1130 | arr = (PyArrayObject *)PyArray_FROM_O(op)PyArray_FromAny(op, ((void*)0), 0, 0, 0, ((void*)0)); | |||
1131 | if (arr == NULL((void*)0)) { | |||
1132 | return NULL((void*)0); | |||
1133 | } | |||
1134 | ||||
1135 | if (PyArray_NDIM(arr) > 1) { | |||
1136 | /* Set up the transpose operation */ | |||
1137 | new_axes.len = PyArray_NDIM(arr); | |||
1138 | for (i = 0; i < new_axes.len; ++i) { | |||
1139 | new_axes_values[i] = new_axes.len - i - 1; | |||
1140 | } | |||
1141 | new_axes.ptr = new_axes_values; | |||
1142 | ||||
1143 | /* Do the transpose (always returns a view) */ | |||
1144 | tmp = (PyArrayObject *)PyArray_Transpose(arr, &new_axes); | |||
1145 | if (tmp == NULL((void*)0)) { | |||
1146 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | |||
1147 | return NULL((void*)0); | |||
1148 | } | |||
1149 | } | |||
1150 | else { | |||
1151 | tmp = arr; | |||
1152 | arr = NULL((void*)0); | |||
1153 | } | |||
1154 | ||||
1155 | /* TODO: Change this to NPY_KEEPORDER for NumPy 2.0 */ | |||
1156 | ret = (PyArrayObject *)PyArray_NewCopy(tmp, NPY_CORDER); | |||
1157 | ||||
1158 | Py_XDECREF(arr)_Py_XDECREF(((PyObject*)(arr))); | |||
1159 | Py_DECREF(tmp)_Py_DECREF(((PyObject*)(tmp))); | |||
1160 | return (PyObject *)ret; | |||
1161 | } | |||
1162 | ||||
1163 | /* | |||
1164 | * Implementation which is common between PyArray_Correlate | |||
1165 | * and PyArray_Correlate2. | |||
1166 | * | |||
1167 | * inverted is set to 1 if computed correlate(ap2, ap1), 0 otherwise | |||
1168 | */ | |||
1169 | static PyArrayObject* | |||
1170 | _pyarray_correlate(PyArrayObject *ap1, PyArrayObject *ap2, int typenum, | |||
1171 | int mode, int *inverted) | |||
1172 | { | |||
1173 | PyArrayObject *ret; | |||
1174 | npy_intp length; | |||
1175 | npy_intp i, n1, n2, n, n_left, n_right; | |||
1176 | npy_intp is1, is2, os; | |||
1177 | char *ip1, *ip2, *op; | |||
1178 | PyArray_DotFunc *dot; | |||
1179 | ||||
1180 | NPY_BEGIN_THREADS_DEFPyThreadState *_save=((void*)0);; | |||
1181 | ||||
1182 | n1 = PyArray_DIMS(ap1)[0]; | |||
1183 | n2 = PyArray_DIMS(ap2)[0]; | |||
1184 | if (n1 == 0) { | |||
1185 | PyErr_SetString(PyExc_ValueError, "first array argument cannot be empty"); | |||
1186 | return NULL((void*)0); | |||
1187 | } | |||
1188 | if (n2 == 0) { | |||
1189 | PyErr_SetString(PyExc_ValueError, "second array argument cannot be empty"); | |||
1190 | return NULL((void*)0); | |||
1191 | } | |||
1192 | if (n1 < n2) { | |||
1193 | ret = ap1; | |||
1194 | ap1 = ap2; | |||
1195 | ap2 = ret; | |||
1196 | ret = NULL((void*)0); | |||
1197 | i = n1; | |||
1198 | n1 = n2; | |||
1199 | n2 = i; | |||
1200 | *inverted = 1; | |||
1201 | } else { | |||
1202 | *inverted = 0; | |||
1203 | } | |||
1204 | ||||
1205 | length = n1; | |||
1206 | n = n2; | |||
1207 | switch(mode) { | |||
1208 | case 0: | |||
1209 | length = length - n + 1; | |||
1210 | n_left = n_right = 0; | |||
1211 | break; | |||
1212 | case 1: | |||
1213 | n_left = (npy_intp)(n/2); | |||
1214 | n_right = n - n_left - 1; | |||
1215 | break; | |||
1216 | case 2: | |||
1217 | n_right = n - 1; | |||
1218 | n_left = n - 1; | |||
1219 | length = length + n - 1; | |||
1220 | break; | |||
1221 | default: | |||
1222 | PyErr_SetString(PyExc_ValueError, "mode must be 0, 1, or 2"); | |||
1223 | return NULL((void*)0); | |||
1224 | } | |||
1225 | ||||
1226 | /* | |||
1227 | * Need to choose an output array that can hold a sum | |||
1228 | * -- use priority to determine which subtype. | |||
1229 | */ | |||
1230 | ret = new_array_for_sum(ap1, ap2, NULL((void*)0), 1, &length, typenum, NULL((void*)0)); | |||
1231 | if (ret == NULL((void*)0)) { | |||
1232 | return NULL((void*)0); | |||
1233 | } | |||
1234 | dot = PyArray_DESCR(ret)->f->dotfunc; | |||
1235 | if (dot == NULL((void*)0)) { | |||
1236 | PyErr_SetString(PyExc_ValueError, | |||
1237 | "function not available for this data type"); | |||
1238 | goto clean_ret; | |||
1239 | } | |||
1240 | ||||
1241 | NPY_BEGIN_THREADS_DESCR(PyArray_DESCR(ret))do {if (!(((((PyArray_DESCR(ret)))->flags & (0x10)) == (0x10)))) do {_save = PyEval_SaveThread();} while (0);;} while (0);; | |||
1242 | is1 = PyArray_STRIDES(ap1)[0]; | |||
1243 | is2 = PyArray_STRIDES(ap2)[0]; | |||
1244 | op = PyArray_DATA(ret); | |||
1245 | os = PyArray_DESCR(ret)->elsize; | |||
1246 | ip1 = PyArray_DATA(ap1); | |||
1247 | ip2 = PyArray_BYTES(ap2) + n_left*is2; | |||
1248 | n = n - n_left; | |||
1249 | for (i = 0; i < n_left; i++) { | |||
1250 | dot(ip1, is1, ip2, is2, op, n, ret); | |||
1251 | n++; | |||
1252 | ip2 -= is2; | |||
1253 | op += os; | |||
1254 | } | |||
1255 | if (small_correlate(ip1, is1, n1 - n2 + 1, PyArray_TYPE(ap1), | |||
1256 | ip2, is2, n, PyArray_TYPE(ap2), | |||
1257 | op, os)) { | |||
1258 | ip1 += is1 * (n1 - n2 + 1); | |||
1259 | op += os * (n1 - n2 + 1); | |||
1260 | } | |||
1261 | else { | |||
1262 | for (i = 0; i < (n1 - n2 + 1); i++) { | |||
1263 | dot(ip1, is1, ip2, is2, op, n, ret); | |||
1264 | ip1 += is1; | |||
1265 | op += os; | |||
1266 | } | |||
1267 | } | |||
1268 | for (i = 0; i < n_right; i++) { | |||
1269 | n--; | |||
1270 | dot(ip1, is1, ip2, is2, op, n, ret); | |||
1271 | ip1 += is1; | |||
1272 | op += os; | |||
1273 | } | |||
1274 | ||||
1275 | NPY_END_THREADS_DESCR(PyArray_DESCR(ret))do {if (!(((((PyArray_DESCR(ret)))->flags & (0x10)) == (0x10)))) do { if (_save) { PyEval_RestoreThread(_save); _save = ((void*)0);} } while (0);; } while (0);; | |||
1276 | if (PyErr_Occurred()) { | |||
1277 | goto clean_ret; | |||
1278 | } | |||
1279 | ||||
1280 | return ret; | |||
1281 | ||||
1282 | clean_ret: | |||
1283 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); | |||
1284 | return NULL((void*)0); | |||
1285 | } | |||
1286 | ||||
1287 | /* | |||
1288 | * Revert a one dimensional array in-place | |||
1289 | * | |||
1290 | * Return 0 on success, other value on failure | |||
1291 | */ | |||
1292 | static int | |||
1293 | _pyarray_revert(PyArrayObject *ret) | |||
1294 | { | |||
1295 | npy_intp length = PyArray_DIM(ret, 0); | |||
1296 | npy_intp os = PyArray_DESCR(ret)->elsize; | |||
1297 | char *op = PyArray_DATA(ret); | |||
1298 | char *sw1 = op; | |||
1299 | char *sw2; | |||
1300 | ||||
1301 | if (PyArray_ISNUMBER(ret)(((PyArray_TYPE(ret)) <= NPY_CLONGDOUBLE) || ((PyArray_TYPE (ret)) == NPY_HALF)) && !PyArray_ISCOMPLEX(ret)(((PyArray_TYPE(ret)) >= NPY_CFLOAT) && ((PyArray_TYPE (ret)) <= NPY_CLONGDOUBLE))) { | |||
1302 | /* Optimization for unstructured dtypes */ | |||
1303 | PyArray_CopySwapNFunc *copyswapn = PyArray_DESCR(ret)->f->copyswapn; | |||
1304 | sw2 = op + length * os - 1; | |||
1305 | /* First reverse the whole array byte by byte... */ | |||
1306 | while(sw1 < sw2) { | |||
1307 | const char tmp = *sw1; | |||
1308 | *sw1++ = *sw2; | |||
1309 | *sw2-- = tmp; | |||
1310 | } | |||
1311 | /* ...then swap in place every item */ | |||
1312 | copyswapn(op, os, NULL((void*)0), 0, length, 1, NULL((void*)0)); | |||
1313 | } | |||
1314 | else { | |||
1315 | char *tmp = PyArray_mallocPyMem_RawMalloc(PyArray_DESCR(ret)->elsize); | |||
1316 | if (tmp == NULL((void*)0)) { | |||
1317 | PyErr_NoMemory(); | |||
1318 | return -1; | |||
1319 | } | |||
1320 | sw2 = op + (length - 1) * os; | |||
1321 | while (sw1 < sw2) { | |||
1322 | memcpy(tmp, sw1, os); | |||
1323 | memcpy(sw1, sw2, os); | |||
1324 | memcpy(sw2, tmp, os); | |||
1325 | sw1 += os; | |||
1326 | sw2 -= os; | |||
1327 | } | |||
1328 | PyArray_freePyMem_RawFree(tmp); | |||
1329 | } | |||
1330 | ||||
1331 | return 0; | |||
1332 | } | |||
1333 | ||||
1334 | /*NUMPY_API | |||
1335 | * correlate(a1,a2,mode) | |||
1336 | * | |||
1337 | * This function computes the usual correlation (correlate(a1, a2) != | |||
1338 | * correlate(a2, a1), and conjugate the second argument for complex inputs | |||
1339 | */ | |||
1340 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | |||
1341 | PyArray_Correlate2(PyObject *op1, PyObject *op2, int mode) | |||
1342 | { | |||
1343 | PyArrayObject *ap1, *ap2, *ret = NULL((void*)0); | |||
1344 | int typenum; | |||
1345 | PyArray_Descr *typec; | |||
1346 | int inverted; | |||
1347 | int st; | |||
1348 | ||||
1349 | typenum = PyArray_ObjectType(op1, 0); | |||
1350 | typenum = PyArray_ObjectType(op2, typenum); | |||
1351 | ||||
1352 | typec = PyArray_DescrFromType(typenum); | |||
1353 | Py_INCREF(typec)_Py_INCREF(((PyObject*)(typec))); | |||
1354 | ap1 = (PyArrayObject *)PyArray_FromAny(op1, typec, 1, 1, | |||
1355 | NPY_ARRAY_DEFAULT((0x0001 | (0x0100 | 0x0400))), NULL((void*)0)); | |||
1356 | if (ap1 == NULL((void*)0)) { | |||
1357 | Py_DECREF(typec)_Py_DECREF(((PyObject*)(typec))); | |||
1358 | return NULL((void*)0); | |||
1359 | } | |||
1360 | ap2 = (PyArrayObject *)PyArray_FromAny(op2, typec, 1, 1, | |||
1361 | NPY_ARRAY_DEFAULT((0x0001 | (0x0100 | 0x0400))), NULL((void*)0)); | |||
1362 | if (ap2 == NULL((void*)0)) { | |||
1363 | goto clean_ap1; | |||
1364 | } | |||
1365 | ||||
1366 | if (PyArray_ISCOMPLEX(ap2)(((PyArray_TYPE(ap2)) >= NPY_CFLOAT) && ((PyArray_TYPE (ap2)) <= NPY_CLONGDOUBLE))) { | |||
1367 | PyArrayObject *cap2; | |||
1368 | cap2 = (PyArrayObject *)PyArray_Conjugate(ap2, NULL((void*)0)); | |||
1369 | if (cap2 == NULL((void*)0)) { | |||
1370 | goto clean_ap2; | |||
1371 | } | |||
1372 | Py_DECREF(ap2)_Py_DECREF(((PyObject*)(ap2))); | |||
1373 | ap2 = cap2; | |||
1374 | } | |||
1375 | ||||
1376 | ret = _pyarray_correlate(ap1, ap2, typenum, mode, &inverted); | |||
1377 | if (ret == NULL((void*)0)) { | |||
1378 | goto clean_ap2; | |||
1379 | } | |||
1380 | ||||
1381 | /* | |||
1382 | * If we inverted input orders, we need to reverse the output array (i.e. | |||
1383 | * ret = ret[::-1]) | |||
1384 | */ | |||
1385 | if (inverted) { | |||
1386 | st = _pyarray_revert(ret); | |||
1387 | if (st) { | |||
1388 | goto clean_ret; | |||
1389 | } | |||
1390 | } | |||
1391 | ||||
1392 | Py_DECREF(ap1)_Py_DECREF(((PyObject*)(ap1))); | |||
1393 | Py_DECREF(ap2)_Py_DECREF(((PyObject*)(ap2))); | |||
1394 | return (PyObject *)ret; | |||
1395 | ||||
1396 | clean_ret: | |||
1397 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); | |||
1398 | clean_ap2: | |||
1399 | Py_DECREF(ap2)_Py_DECREF(((PyObject*)(ap2))); | |||
1400 | clean_ap1: | |||
1401 | Py_DECREF(ap1)_Py_DECREF(((PyObject*)(ap1))); | |||
1402 | return NULL((void*)0); | |||
1403 | } | |||
1404 | ||||
1405 | /*NUMPY_API | |||
1406 | * Numeric.correlate(a1,a2,mode) | |||
1407 | */ | |||
1408 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | |||
1409 | PyArray_Correlate(PyObject *op1, PyObject *op2, int mode) | |||
1410 | { | |||
1411 | PyArrayObject *ap1, *ap2, *ret = NULL((void*)0); | |||
1412 | int typenum; | |||
1413 | int unused; | |||
1414 | PyArray_Descr *typec; | |||
1415 | ||||
1416 | typenum = PyArray_ObjectType(op1, 0); | |||
1417 | typenum = PyArray_ObjectType(op2, typenum); | |||
1418 | ||||
1419 | typec = PyArray_DescrFromType(typenum); | |||
1420 | Py_INCREF(typec)_Py_INCREF(((PyObject*)(typec))); | |||
1421 | ap1 = (PyArrayObject *)PyArray_FromAny(op1, typec, 1, 1, | |||
1422 | NPY_ARRAY_DEFAULT((0x0001 | (0x0100 | 0x0400))), NULL((void*)0)); | |||
1423 | if (ap1 == NULL((void*)0)) { | |||
1424 | Py_DECREF(typec)_Py_DECREF(((PyObject*)(typec))); | |||
1425 | return NULL((void*)0); | |||
1426 | } | |||
1427 | ap2 = (PyArrayObject *)PyArray_FromAny(op2, typec, 1, 1, | |||
1428 | NPY_ARRAY_DEFAULT((0x0001 | (0x0100 | 0x0400))), NULL((void*)0)); | |||
1429 | if (ap2 == NULL((void*)0)) { | |||
1430 | goto fail; | |||
1431 | } | |||
1432 | ||||
1433 | ret = _pyarray_correlate(ap1, ap2, typenum, mode, &unused); | |||
1434 | if (ret == NULL((void*)0)) { | |||
1435 | goto fail; | |||
1436 | } | |||
1437 | Py_DECREF(ap1)_Py_DECREF(((PyObject*)(ap1))); | |||
1438 | Py_DECREF(ap2)_Py_DECREF(((PyObject*)(ap2))); | |||
1439 | return (PyObject *)ret; | |||
1440 | ||||
1441 | fail: | |||
1442 | Py_XDECREF(ap1)_Py_XDECREF(((PyObject*)(ap1))); | |||
1443 | Py_XDECREF(ap2)_Py_XDECREF(((PyObject*)(ap2))); | |||
1444 | Py_XDECREF(ret)_Py_XDECREF(((PyObject*)(ret))); | |||
1445 | return NULL((void*)0); | |||
1446 | } | |||
1447 | ||||
1448 | ||||
1449 | static PyObject * | |||
1450 | array_putmask(PyObject *NPY_UNUSED(module)(__NPY_UNUSED_TAGGEDmodule) __attribute__ ((__unused__)), PyObject *args, PyObject *kwds) | |||
1451 | { | |||
1452 | PyObject *mask, *values; | |||
1453 | PyObject *array; | |||
1454 | ||||
1455 | static char *kwlist[] = {"arr", "mask", "values", NULL((void*)0)}; | |||
1456 | ||||
1457 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, kwds, "O!OO:putmask", kwlist, | |||
1458 | &PyArray_Type, &array, &mask, &values)) { | |||
1459 | return NULL((void*)0); | |||
1460 | } | |||
1461 | return PyArray_PutMask((PyArrayObject *)array, values, mask); | |||
1462 | } | |||
1463 | ||||
1464 | ||||
1465 | /*NUMPY_API | |||
1466 | * | |||
1467 | * This function returns true if the two typecodes are | |||
1468 | * equivalent (same basic kind and same itemsize). | |||
1469 | */ | |||
1470 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) unsigned char | |||
1471 | PyArray_EquivTypes(PyArray_Descr *type1, PyArray_Descr *type2) | |||
1472 | { | |||
1473 | if (type1 == type2) { | |||
1474 | return 1; | |||
1475 | } | |||
1476 | /* | |||
1477 | * Do not use PyArray_CanCastTypeTo because it supports legacy flexible | |||
1478 | * dtypes as input. | |||
1479 | */ | |||
1480 | NPY_CASTING safety = PyArray_GetCastSafety(type1, type2, NULL((void*)0)); | |||
1481 | if (safety < 0) { | |||
1482 | PyErr_Clear(); | |||
1483 | return 0; | |||
1484 | } | |||
1485 | /* If casting is "no casting" this dtypes are considered equivalent. */ | |||
1486 | return PyArray_MinCastSafety(safety, NPY_NO_CASTING) == NPY_NO_CASTING; | |||
1487 | } | |||
1488 | ||||
1489 | ||||
1490 | /*NUMPY_API*/ | |||
1491 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) unsigned char | |||
1492 | PyArray_EquivTypenums(int typenum1, int typenum2) | |||
1493 | { | |||
1494 | PyArray_Descr *d1, *d2; | |||
1495 | npy_bool ret; | |||
1496 | ||||
1497 | if (typenum1 == typenum2) { | |||
1498 | return NPY_SUCCEED1; | |||
1499 | } | |||
1500 | ||||
1501 | d1 = PyArray_DescrFromType(typenum1); | |||
1502 | d2 = PyArray_DescrFromType(typenum2); | |||
1503 | ret = PyArray_EquivTypes(d1, d2); | |||
1504 | Py_DECREF(d1)_Py_DECREF(((PyObject*)(d1))); | |||
1505 | Py_DECREF(d2)_Py_DECREF(((PyObject*)(d2))); | |||
1506 | return ret; | |||
1507 | } | |||
1508 | ||||
1509 | /*** END C-API FUNCTIONS **/ | |||
1510 | /* | |||
1511 | * NPY_RELAXED_STRIDES_CHECKING: If the strides logic is changed, the | |||
1512 | * order specific stride setting is not necessary. | |||
1513 | */ | |||
1514 | static NPY_STEALS_REF_TO_ARG(1) PyObject * | |||
1515 | _prepend_ones(PyArrayObject *arr, int nd, int ndmin, NPY_ORDER order) | |||
1516 | { | |||
1517 | npy_intp newdims[NPY_MAXDIMS32]; | |||
1518 | npy_intp newstrides[NPY_MAXDIMS32]; | |||
1519 | npy_intp newstride; | |||
1520 | int i, k, num; | |||
1521 | PyObject *ret; | |||
1522 | PyArray_Descr *dtype; | |||
1523 | ||||
1524 | if (order == NPY_FORTRANORDER || PyArray_ISFORTRAN(arr)(PyArray_CHKFLAGS(arr, 0x0002) && (!PyArray_CHKFLAGS( arr, 0x0001))) || PyArray_NDIM(arr) == 0) { | |||
1525 | newstride = PyArray_DESCR(arr)->elsize; | |||
1526 | } | |||
1527 | else { | |||
1528 | newstride = PyArray_STRIDES(arr)[0] * PyArray_DIMS(arr)[0]; | |||
1529 | } | |||
1530 | ||||
1531 | num = ndmin - nd; | |||
1532 | for (i = 0; i < num; i++) { | |||
1533 | newdims[i] = 1; | |||
1534 | newstrides[i] = newstride; | |||
1535 | } | |||
1536 | for (i = num; i < ndmin; i++) { | |||
1537 | k = i - num; | |||
1538 | newdims[i] = PyArray_DIMS(arr)[k]; | |||
1539 | newstrides[i] = PyArray_STRIDES(arr)[k]; | |||
1540 | } | |||
1541 | dtype = PyArray_DESCR(arr); | |||
1542 | Py_INCREF(dtype)_Py_INCREF(((PyObject*)(dtype))); | |||
1543 | ret = PyArray_NewFromDescrAndBase( | |||
1544 | Py_TYPE(arr)(((PyObject*)(arr))->ob_type), dtype, | |||
1545 | ndmin, newdims, newstrides, PyArray_DATA(arr), | |||
1546 | PyArray_FLAGS(arr), (PyObject *)arr, (PyObject *)arr); | |||
1547 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | |||
1548 | ||||
1549 | return ret; | |||
1550 | } | |||
1551 | ||||
1552 | #define STRIDING_OK(op, order) \ | |||
1553 | ((order) == NPY_ANYORDER || \ | |||
1554 | (order) == NPY_KEEPORDER || \ | |||
1555 | ((order) == NPY_CORDER && PyArray_IS_C_CONTIGUOUS(op)PyArray_CHKFLAGS((op), 0x0001)) || \ | |||
1556 | ((order) == NPY_FORTRANORDER && PyArray_IS_F_CONTIGUOUS(op)PyArray_CHKFLAGS((op), 0x0002))) | |||
1557 | ||||
1558 | static NPY_INLINEinline PyObject * | |||
1559 | _array_fromobject_generic( | |||
1560 | PyObject *op, PyArray_Descr *type, npy_bool copy, NPY_ORDER order, | |||
1561 | npy_bool subok, int ndmin) | |||
1562 | { | |||
1563 | PyArrayObject *oparr = NULL((void*)0), *ret = NULL((void*)0); | |||
1564 | PyArray_Descr *oldtype = NULL((void*)0); | |||
1565 | int nd, flags = 0; | |||
1566 | ||||
1567 | if (ndmin > NPY_MAXDIMS32) { | |||
1568 | PyErr_Format(PyExc_ValueError, | |||
1569 | "ndmin bigger than allowable number of dimensions " | |||
1570 | "NPY_MAXDIMS (=%d)", NPY_MAXDIMS32); | |||
1571 | return NULL((void*)0); | |||
1572 | } | |||
1573 | /* fast exit if simple call */ | |||
1574 | if (PyArray_CheckExact(op)(((PyObject*)(op))->ob_type == &PyArray_Type) || (subok && PyArray_Check(op)((((PyObject*)(op))->ob_type) == (&PyArray_Type) || PyType_IsSubtype ((((PyObject*)(op))->ob_type), (&PyArray_Type))))) { | |||
1575 | oparr = (PyArrayObject *)op; | |||
1576 | if (type == NULL((void*)0)) { | |||
1577 | if (!copy && STRIDING_OK(oparr, order)) { | |||
1578 | ret = oparr; | |||
1579 | Py_INCREF(ret)_Py_INCREF(((PyObject*)(ret))); | |||
1580 | goto finish; | |||
1581 | } | |||
1582 | else { | |||
1583 | ret = (PyArrayObject *)PyArray_NewCopy(oparr, order); | |||
1584 | goto finish; | |||
1585 | } | |||
1586 | } | |||
1587 | /* One more chance */ | |||
1588 | oldtype = PyArray_DESCR(oparr); | |||
1589 | if (PyArray_EquivTypes(oldtype, type)) { | |||
1590 | if (!copy && STRIDING_OK(oparr, order)) { | |||
1591 | Py_INCREF(op)_Py_INCREF(((PyObject*)(op))); | |||
1592 | ret = oparr; | |||
1593 | goto finish; | |||
1594 | } | |||
1595 | else { | |||
1596 | ret = (PyArrayObject *)PyArray_NewCopy(oparr, order); | |||
1597 | if (oldtype == type || ret == NULL((void*)0)) { | |||
1598 | goto finish; | |||
1599 | } | |||
1600 | Py_INCREF(oldtype)_Py_INCREF(((PyObject*)(oldtype))); | |||
1601 | Py_DECREF(PyArray_DESCR(ret))_Py_DECREF(((PyObject*)(PyArray_DESCR(ret)))); | |||
1602 | ((PyArrayObject_fields *)ret)->descr = oldtype; | |||
1603 | goto finish; | |||
1604 | } | |||
1605 | } | |||
1606 | } | |||
1607 | ||||
1608 | if (copy) { | |||
1609 | flags = NPY_ARRAY_ENSURECOPY0x0020; | |||
1610 | } | |||
1611 | if (order == NPY_CORDER) { | |||
1612 | flags |= NPY_ARRAY_C_CONTIGUOUS0x0001; | |||
1613 | } | |||
1614 | else if ((order == NPY_FORTRANORDER) | |||
1615 | /* order == NPY_ANYORDER && */ | |||
1616 | || (PyArray_Check(op)((((PyObject*)(op))->ob_type) == (&PyArray_Type) || PyType_IsSubtype ((((PyObject*)(op))->ob_type), (&PyArray_Type))) && | |||
1617 | PyArray_ISFORTRAN((PyArrayObject *)op)(PyArray_CHKFLAGS((PyArrayObject *)op, 0x0002) && (!PyArray_CHKFLAGS ((PyArrayObject *)op, 0x0001))))) { | |||
1618 | flags |= NPY_ARRAY_F_CONTIGUOUS0x0002; | |||
1619 | } | |||
1620 | if (!subok) { | |||
1621 | flags |= NPY_ARRAY_ENSUREARRAY0x0040; | |||
1622 | } | |||
1623 | ||||
1624 | flags |= NPY_ARRAY_FORCECAST0x0010; | |||
1625 | Py_XINCREF(type)_Py_XINCREF(((PyObject*)(type))); | |||
1626 | ret = (PyArrayObject *)PyArray_CheckFromAny(op, type, | |||
1627 | 0, 0, flags, NULL((void*)0)); | |||
1628 | ||||
1629 | finish: | |||
1630 | if (ret == NULL((void*)0)) { | |||
1631 | return NULL((void*)0); | |||
1632 | } | |||
1633 | ||||
1634 | nd = PyArray_NDIM(ret); | |||
1635 | if (nd >= ndmin) { | |||
1636 | return (PyObject *)ret; | |||
1637 | } | |||
1638 | /* | |||
1639 | * create a new array from the same data with ones in the shape | |||
1640 | * steals a reference to ret | |||
1641 | */ | |||
1642 | return _prepend_ones(ret, nd, ndmin, order); | |||
1643 | } | |||
1644 | ||||
1645 | #undef STRIDING_OK | |||
1646 | ||||
1647 | ||||
1648 | static PyObject * | |||
1649 | array_array(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), | |||
1650 | PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames) | |||
1651 | { | |||
1652 | PyObject *op; | |||
1653 | npy_bool subok = NPY_FALSE0; | |||
1654 | npy_bool copy = NPY_TRUE1; | |||
1655 | int ndmin = 0; | |||
1656 | PyArray_Descr *type = NULL((void*)0); | |||
1657 | NPY_ORDER order = NPY_KEEPORDER; | |||
1658 | PyObject *like = NULL((void*)0); | |||
1659 | NPY_PREPARE_ARGPARSERstatic _NpyArgParserCache __argparse_cache = {-1}; | |||
1660 | ||||
1661 | if (len_args != 1 || (kwnames != NULL((void*)0))) { | |||
1662 | if (npy_parse_arguments("array", args, len_args, kwnames,_npy_parse_arguments("array", &__argparse_cache, args, len_args , kwnames, "object", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2 , &type, "$copy", &PyArray_BoolConverter, ©, "$order" , &PyArray_OrderConverter, &order, "$subok", &PyArray_BoolConverter , &subok, "$ndmin", &PyArray_PythonPyIntFromInt, & ndmin, "$like", ((void*)0), &like, ((void*)0), ((void*)0) , ((void*)0)) | |||
1663 | "object", NULL, &op,_npy_parse_arguments("array", &__argparse_cache, args, len_args , kwnames, "object", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2 , &type, "$copy", &PyArray_BoolConverter, ©, "$order" , &PyArray_OrderConverter, &order, "$subok", &PyArray_BoolConverter , &subok, "$ndmin", &PyArray_PythonPyIntFromInt, & ndmin, "$like", ((void*)0), &like, ((void*)0), ((void*)0) , ((void*)0)) | |||
1664 | "|dtype", &PyArray_DescrConverter2, &type,_npy_parse_arguments("array", &__argparse_cache, args, len_args , kwnames, "object", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2 , &type, "$copy", &PyArray_BoolConverter, ©, "$order" , &PyArray_OrderConverter, &order, "$subok", &PyArray_BoolConverter , &subok, "$ndmin", &PyArray_PythonPyIntFromInt, & ndmin, "$like", ((void*)0), &like, ((void*)0), ((void*)0) , ((void*)0)) | |||
1665 | "$copy", &PyArray_BoolConverter, ©,_npy_parse_arguments("array", &__argparse_cache, args, len_args , kwnames, "object", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2 , &type, "$copy", &PyArray_BoolConverter, ©, "$order" , &PyArray_OrderConverter, &order, "$subok", &PyArray_BoolConverter , &subok, "$ndmin", &PyArray_PythonPyIntFromInt, & ndmin, "$like", ((void*)0), &like, ((void*)0), ((void*)0) , ((void*)0)) | |||
1666 | "$order", &PyArray_OrderConverter, &order,_npy_parse_arguments("array", &__argparse_cache, args, len_args , kwnames, "object", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2 , &type, "$copy", &PyArray_BoolConverter, ©, "$order" , &PyArray_OrderConverter, &order, "$subok", &PyArray_BoolConverter , &subok, "$ndmin", &PyArray_PythonPyIntFromInt, & ndmin, "$like", ((void*)0), &like, ((void*)0), ((void*)0) , ((void*)0)) | |||
1667 | "$subok", &PyArray_BoolConverter, &subok,_npy_parse_arguments("array", &__argparse_cache, args, len_args , kwnames, "object", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2 , &type, "$copy", &PyArray_BoolConverter, ©, "$order" , &PyArray_OrderConverter, &order, "$subok", &PyArray_BoolConverter , &subok, "$ndmin", &PyArray_PythonPyIntFromInt, & ndmin, "$like", ((void*)0), &like, ((void*)0), ((void*)0) , ((void*)0)) | |||
1668 | "$ndmin", &PyArray_PythonPyIntFromInt, &ndmin,_npy_parse_arguments("array", &__argparse_cache, args, len_args , kwnames, "object", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2 , &type, "$copy", &PyArray_BoolConverter, ©, "$order" , &PyArray_OrderConverter, &order, "$subok", &PyArray_BoolConverter , &subok, "$ndmin", &PyArray_PythonPyIntFromInt, & ndmin, "$like", ((void*)0), &like, ((void*)0), ((void*)0) , ((void*)0)) | |||
1669 | "$like", NULL, &like,_npy_parse_arguments("array", &__argparse_cache, args, len_args , kwnames, "object", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2 , &type, "$copy", &PyArray_BoolConverter, ©, "$order" , &PyArray_OrderConverter, &order, "$subok", &PyArray_BoolConverter , &subok, "$ndmin", &PyArray_PythonPyIntFromInt, & ndmin, "$like", ((void*)0), &like, ((void*)0), ((void*)0) , ((void*)0)) | |||
1670 | NULL, NULL, NULL)_npy_parse_arguments("array", &__argparse_cache, args, len_args , kwnames, "object", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2 , &type, "$copy", &PyArray_BoolConverter, ©, "$order" , &PyArray_OrderConverter, &order, "$subok", &PyArray_BoolConverter , &subok, "$ndmin", &PyArray_PythonPyIntFromInt, & ndmin, "$like", ((void*)0), &like, ((void*)0), ((void*)0) , ((void*)0)) < 0) { | |||
1671 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
1672 | return NULL((void*)0); | |||
1673 | } | |||
1674 | if (like != NULL((void*)0)) { | |||
1675 | PyObject *deferred = array_implement_c_array_function_creation( | |||
1676 | "array", like, NULL((void*)0), NULL((void*)0), args, len_args, kwnames); | |||
1677 | if (deferred != Py_NotImplemented(&_Py_NotImplementedStruct)) { | |||
1678 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
1679 | return deferred; | |||
1680 | } | |||
1681 | } | |||
1682 | } | |||
1683 | else { | |||
1684 | /* Fast path for symmetry (we copy by default which is slow) */ | |||
1685 | op = args[0]; | |||
1686 | } | |||
1687 | ||||
1688 | PyObject *res = _array_fromobject_generic( | |||
1689 | op, type, copy, order, subok, ndmin); | |||
1690 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
1691 | return res; | |||
1692 | } | |||
1693 | ||||
1694 | static PyObject * | |||
1695 | array_asarray(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), | |||
1696 | PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames) | |||
1697 | { | |||
1698 | PyObject *op; | |||
1699 | PyArray_Descr *type = NULL((void*)0); | |||
1700 | NPY_ORDER order = NPY_KEEPORDER; | |||
1701 | PyObject *like = NULL((void*)0); | |||
1702 | NPY_PREPARE_ARGPARSERstatic _NpyArgParserCache __argparse_cache = {-1}; | |||
1703 | ||||
1704 | if (len_args != 1 || (kwnames != NULL((void*)0))) { | |||
1705 | if (npy_parse_arguments("asarray", args, len_args, kwnames,_npy_parse_arguments("asarray", &__argparse_cache, args, len_args , kwnames, "a", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2 , &type, "|order", &PyArray_OrderConverter, &order , "$like", ((void*)0), &like, ((void*)0), ((void*)0), ((void *)0)) | |||
1706 | "a", NULL, &op,_npy_parse_arguments("asarray", &__argparse_cache, args, len_args , kwnames, "a", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2 , &type, "|order", &PyArray_OrderConverter, &order , "$like", ((void*)0), &like, ((void*)0), ((void*)0), ((void *)0)) | |||
1707 | "|dtype", &PyArray_DescrConverter2, &type,_npy_parse_arguments("asarray", &__argparse_cache, args, len_args , kwnames, "a", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2 , &type, "|order", &PyArray_OrderConverter, &order , "$like", ((void*)0), &like, ((void*)0), ((void*)0), ((void *)0)) | |||
1708 | "|order", &PyArray_OrderConverter, &order,_npy_parse_arguments("asarray", &__argparse_cache, args, len_args , kwnames, "a", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2 , &type, "|order", &PyArray_OrderConverter, &order , "$like", ((void*)0), &like, ((void*)0), ((void*)0), ((void *)0)) | |||
1709 | "$like", NULL, &like,_npy_parse_arguments("asarray", &__argparse_cache, args, len_args , kwnames, "a", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2 , &type, "|order", &PyArray_OrderConverter, &order , "$like", ((void*)0), &like, ((void*)0), ((void*)0), ((void *)0)) | |||
1710 | NULL, NULL, NULL)_npy_parse_arguments("asarray", &__argparse_cache, args, len_args , kwnames, "a", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2 , &type, "|order", &PyArray_OrderConverter, &order , "$like", ((void*)0), &like, ((void*)0), ((void*)0), ((void *)0)) < 0) { | |||
1711 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
1712 | return NULL((void*)0); | |||
1713 | } | |||
1714 | if (like != NULL((void*)0)) { | |||
1715 | PyObject *deferred = array_implement_c_array_function_creation( | |||
1716 | "asarray", like, NULL((void*)0), NULL((void*)0), args, len_args, kwnames); | |||
1717 | if (deferred != Py_NotImplemented(&_Py_NotImplementedStruct)) { | |||
1718 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
1719 | return deferred; | |||
1720 | } | |||
1721 | } | |||
1722 | } | |||
1723 | else { | |||
1724 | op = args[0]; | |||
1725 | } | |||
1726 | ||||
1727 | PyObject *res = _array_fromobject_generic( | |||
1728 | op, type, NPY_FALSE0, order, NPY_FALSE0, 0); | |||
1729 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
1730 | return res; | |||
1731 | } | |||
1732 | ||||
1733 | static PyObject * | |||
1734 | array_asanyarray(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), | |||
1735 | PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames) | |||
1736 | { | |||
1737 | PyObject *op; | |||
1738 | PyArray_Descr *type = NULL((void*)0); | |||
1739 | NPY_ORDER order = NPY_KEEPORDER; | |||
1740 | PyObject *like = NULL((void*)0); | |||
1741 | NPY_PREPARE_ARGPARSERstatic _NpyArgParserCache __argparse_cache = {-1}; | |||
1742 | ||||
1743 | if (len_args != 1 || (kwnames != NULL((void*)0))) { | |||
1744 | if (npy_parse_arguments("asanyarray", args, len_args, kwnames,_npy_parse_arguments("asanyarray", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &op, "|dtype", & PyArray_DescrConverter2, &type, "|order", &PyArray_OrderConverter , &order, "$like", ((void*)0), &like, ((void*)0), ((void *)0), ((void*)0)) | |||
1745 | "a", NULL, &op,_npy_parse_arguments("asanyarray", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &op, "|dtype", & PyArray_DescrConverter2, &type, "|order", &PyArray_OrderConverter , &order, "$like", ((void*)0), &like, ((void*)0), ((void *)0), ((void*)0)) | |||
1746 | "|dtype", &PyArray_DescrConverter2, &type,_npy_parse_arguments("asanyarray", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &op, "|dtype", & PyArray_DescrConverter2, &type, "|order", &PyArray_OrderConverter , &order, "$like", ((void*)0), &like, ((void*)0), ((void *)0), ((void*)0)) | |||
1747 | "|order", &PyArray_OrderConverter, &order,_npy_parse_arguments("asanyarray", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &op, "|dtype", & PyArray_DescrConverter2, &type, "|order", &PyArray_OrderConverter , &order, "$like", ((void*)0), &like, ((void*)0), ((void *)0), ((void*)0)) | |||
1748 | "$like", NULL, &like,_npy_parse_arguments("asanyarray", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &op, "|dtype", & PyArray_DescrConverter2, &type, "|order", &PyArray_OrderConverter , &order, "$like", ((void*)0), &like, ((void*)0), ((void *)0), ((void*)0)) | |||
1749 | NULL, NULL, NULL)_npy_parse_arguments("asanyarray", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &op, "|dtype", & PyArray_DescrConverter2, &type, "|order", &PyArray_OrderConverter , &order, "$like", ((void*)0), &like, ((void*)0), ((void *)0), ((void*)0)) < 0) { | |||
1750 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
1751 | return NULL((void*)0); | |||
1752 | } | |||
1753 | if (like != NULL((void*)0)) { | |||
1754 | PyObject *deferred = array_implement_c_array_function_creation( | |||
1755 | "asanyarray", like, NULL((void*)0), NULL((void*)0), args, len_args, kwnames); | |||
1756 | if (deferred != Py_NotImplemented(&_Py_NotImplementedStruct)) { | |||
1757 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
1758 | return deferred; | |||
1759 | } | |||
1760 | } | |||
1761 | } | |||
1762 | else { | |||
1763 | op = args[0]; | |||
1764 | } | |||
1765 | ||||
1766 | PyObject *res = _array_fromobject_generic( | |||
1767 | op, type, NPY_FALSE0, order, NPY_TRUE1, 0); | |||
1768 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
1769 | return res; | |||
1770 | } | |||
1771 | ||||
1772 | ||||
1773 | static PyObject * | |||
1774 | array_ascontiguousarray(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), | |||
1775 | PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames) | |||
1776 | { | |||
1777 | PyObject *op; | |||
1778 | PyArray_Descr *type = NULL((void*)0); | |||
1779 | PyObject *like = NULL((void*)0); | |||
1780 | NPY_PREPARE_ARGPARSERstatic _NpyArgParserCache __argparse_cache = {-1}; | |||
1781 | ||||
1782 | if (len_args != 1 || (kwnames != NULL((void*)0))) { | |||
1783 | if (npy_parse_arguments("ascontiguousarray", args, len_args, kwnames,_npy_parse_arguments("ascontiguousarray", &__argparse_cache , args, len_args, kwnames, "a", ((void*)0), &op, "|dtype" , &PyArray_DescrConverter2, &type, "$like", ((void*)0 ), &like, ((void*)0), ((void*)0), ((void*)0)) | |||
1784 | "a", NULL, &op,_npy_parse_arguments("ascontiguousarray", &__argparse_cache , args, len_args, kwnames, "a", ((void*)0), &op, "|dtype" , &PyArray_DescrConverter2, &type, "$like", ((void*)0 ), &like, ((void*)0), ((void*)0), ((void*)0)) | |||
1785 | "|dtype", &PyArray_DescrConverter2, &type,_npy_parse_arguments("ascontiguousarray", &__argparse_cache , args, len_args, kwnames, "a", ((void*)0), &op, "|dtype" , &PyArray_DescrConverter2, &type, "$like", ((void*)0 ), &like, ((void*)0), ((void*)0), ((void*)0)) | |||
1786 | "$like", NULL, &like,_npy_parse_arguments("ascontiguousarray", &__argparse_cache , args, len_args, kwnames, "a", ((void*)0), &op, "|dtype" , &PyArray_DescrConverter2, &type, "$like", ((void*)0 ), &like, ((void*)0), ((void*)0), ((void*)0)) | |||
1787 | NULL, NULL, NULL)_npy_parse_arguments("ascontiguousarray", &__argparse_cache , args, len_args, kwnames, "a", ((void*)0), &op, "|dtype" , &PyArray_DescrConverter2, &type, "$like", ((void*)0 ), &like, ((void*)0), ((void*)0), ((void*)0)) < 0) { | |||
1788 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
1789 | return NULL((void*)0); | |||
1790 | } | |||
1791 | if (like != NULL((void*)0)) { | |||
1792 | PyObject *deferred = array_implement_c_array_function_creation( | |||
1793 | "ascontiguousarray", like, NULL((void*)0), NULL((void*)0), args, len_args, kwnames); | |||
1794 | if (deferred != Py_NotImplemented(&_Py_NotImplementedStruct)) { | |||
1795 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
1796 | return deferred; | |||
1797 | } | |||
1798 | } | |||
1799 | } | |||
1800 | else { | |||
1801 | op = args[0]; | |||
1802 | } | |||
1803 | ||||
1804 | PyObject *res = _array_fromobject_generic( | |||
1805 | op, type, NPY_FALSE0, NPY_CORDER, NPY_FALSE0, 1); | |||
1806 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
1807 | return res; | |||
1808 | } | |||
1809 | ||||
1810 | ||||
1811 | static PyObject * | |||
1812 | array_asfortranarray(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), | |||
1813 | PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames) | |||
1814 | { | |||
1815 | PyObject *op; | |||
1816 | PyArray_Descr *type = NULL((void*)0); | |||
1817 | PyObject *like = NULL((void*)0); | |||
1818 | NPY_PREPARE_ARGPARSERstatic _NpyArgParserCache __argparse_cache = {-1}; | |||
1819 | ||||
1820 | if (len_args != 1 || (kwnames != NULL((void*)0))) { | |||
1821 | if (npy_parse_arguments("asfortranarray", args, len_args, kwnames,_npy_parse_arguments("asfortranarray", &__argparse_cache, args, len_args, kwnames, "a", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2, &type, "$like", ((void*)0) , &like, ((void*)0), ((void*)0), ((void*)0)) | |||
1822 | "a", NULL, &op,_npy_parse_arguments("asfortranarray", &__argparse_cache, args, len_args, kwnames, "a", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2, &type, "$like", ((void*)0) , &like, ((void*)0), ((void*)0), ((void*)0)) | |||
1823 | "|dtype", &PyArray_DescrConverter2, &type,_npy_parse_arguments("asfortranarray", &__argparse_cache, args, len_args, kwnames, "a", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2, &type, "$like", ((void*)0) , &like, ((void*)0), ((void*)0), ((void*)0)) | |||
1824 | "$like", NULL, &like,_npy_parse_arguments("asfortranarray", &__argparse_cache, args, len_args, kwnames, "a", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2, &type, "$like", ((void*)0) , &like, ((void*)0), ((void*)0), ((void*)0)) | |||
1825 | NULL, NULL, NULL)_npy_parse_arguments("asfortranarray", &__argparse_cache, args, len_args, kwnames, "a", ((void*)0), &op, "|dtype", &PyArray_DescrConverter2, &type, "$like", ((void*)0) , &like, ((void*)0), ((void*)0), ((void*)0)) < 0) { | |||
1826 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
1827 | return NULL((void*)0); | |||
1828 | } | |||
1829 | if (like != NULL((void*)0)) { | |||
1830 | PyObject *deferred = array_implement_c_array_function_creation( | |||
1831 | "asfortranarray", like, NULL((void*)0), NULL((void*)0), args, len_args, kwnames); | |||
1832 | if (deferred != Py_NotImplemented(&_Py_NotImplementedStruct)) { | |||
1833 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
1834 | return deferred; | |||
1835 | } | |||
1836 | } | |||
1837 | } | |||
1838 | else { | |||
1839 | op = args[0]; | |||
1840 | } | |||
1841 | ||||
1842 | PyObject *res = _array_fromobject_generic( | |||
1843 | op, type, NPY_FALSE0, NPY_FORTRANORDER, NPY_FALSE0, 1); | |||
1844 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
1845 | return res; | |||
1846 | } | |||
1847 | ||||
1848 | ||||
1849 | static PyObject * | |||
1850 | array_copyto(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), PyObject *args, PyObject *kwds) | |||
1851 | { | |||
1852 | static char *kwlist[] = {"dst", "src", "casting", "where", NULL((void*)0)}; | |||
1853 | PyObject *wheremask_in = NULL((void*)0); | |||
1854 | PyArrayObject *dst = NULL((void*)0), *src = NULL((void*)0), *wheremask = NULL((void*)0); | |||
1855 | NPY_CASTING casting = NPY_SAME_KIND_CASTING; | |||
1856 | ||||
1857 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, kwds, "O!O&|O&O:copyto", kwlist, | |||
1858 | &PyArray_Type, &dst, | |||
1859 | &PyArray_Converter, &src, | |||
1860 | &PyArray_CastingConverter, &casting, | |||
1861 | &wheremask_in)) { | |||
1862 | goto fail; | |||
1863 | } | |||
1864 | ||||
1865 | if (wheremask_in != NULL((void*)0)) { | |||
1866 | /* Get the boolean where mask */ | |||
1867 | PyArray_Descr *dtype = PyArray_DescrFromType(NPY_BOOL); | |||
1868 | if (dtype == NULL((void*)0)) { | |||
1869 | goto fail; | |||
1870 | } | |||
1871 | wheremask = (PyArrayObject *)PyArray_FromAny(wheremask_in, | |||
1872 | dtype, 0, 0, 0, NULL((void*)0)); | |||
1873 | if (wheremask == NULL((void*)0)) { | |||
1874 | goto fail; | |||
1875 | } | |||
1876 | } | |||
1877 | ||||
1878 | if (PyArray_AssignArray(dst, src, wheremask, casting) < 0) { | |||
1879 | goto fail; | |||
1880 | } | |||
1881 | ||||
1882 | Py_XDECREF(src)_Py_XDECREF(((PyObject*)(src))); | |||
1883 | Py_XDECREF(wheremask)_Py_XDECREF(((PyObject*)(wheremask))); | |||
1884 | ||||
1885 | Py_RETURN_NONEreturn _Py_INCREF(((PyObject*)((&_Py_NoneStruct)))), (& _Py_NoneStruct); | |||
1886 | ||||
1887 | fail: | |||
1888 | Py_XDECREF(src)_Py_XDECREF(((PyObject*)(src))); | |||
1889 | Py_XDECREF(wheremask)_Py_XDECREF(((PyObject*)(wheremask))); | |||
1890 | return NULL((void*)0); | |||
1891 | } | |||
1892 | ||||
1893 | static PyObject * | |||
1894 | array_empty(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), | |||
1895 | PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames) | |||
1896 | { | |||
1897 | PyArray_Descr *typecode = NULL((void*)0); | |||
1898 | PyArray_Dims shape = {NULL((void*)0), 0}; | |||
1899 | NPY_ORDER order = NPY_CORDER; | |||
1900 | npy_bool is_f_order; | |||
1901 | PyArrayObject *ret = NULL((void*)0); | |||
1902 | PyObject *like = NULL((void*)0); | |||
1903 | NPY_PREPARE_ARGPARSERstatic _NpyArgParserCache __argparse_cache = {-1}; | |||
1904 | ||||
1905 | if (npy_parse_arguments("empty", args, len_args, kwnames,_npy_parse_arguments("empty", &__argparse_cache, args, len_args , kwnames, "shape", &PyArray_IntpConverter, &shape, "|dtype" , &PyArray_DescrConverter, &typecode, "|order", & PyArray_OrderConverter, &order, "$like", ((void*)0), & like, ((void*)0), ((void*)0), ((void*)0)) | |||
1906 | "shape", &PyArray_IntpConverter, &shape,_npy_parse_arguments("empty", &__argparse_cache, args, len_args , kwnames, "shape", &PyArray_IntpConverter, &shape, "|dtype" , &PyArray_DescrConverter, &typecode, "|order", & PyArray_OrderConverter, &order, "$like", ((void*)0), & like, ((void*)0), ((void*)0), ((void*)0)) | |||
1907 | "|dtype", &PyArray_DescrConverter, &typecode,_npy_parse_arguments("empty", &__argparse_cache, args, len_args , kwnames, "shape", &PyArray_IntpConverter, &shape, "|dtype" , &PyArray_DescrConverter, &typecode, "|order", & PyArray_OrderConverter, &order, "$like", ((void*)0), & like, ((void*)0), ((void*)0), ((void*)0)) | |||
1908 | "|order", &PyArray_OrderConverter, &order,_npy_parse_arguments("empty", &__argparse_cache, args, len_args , kwnames, "shape", &PyArray_IntpConverter, &shape, "|dtype" , &PyArray_DescrConverter, &typecode, "|order", & PyArray_OrderConverter, &order, "$like", ((void*)0), & like, ((void*)0), ((void*)0), ((void*)0)) | |||
1909 | "$like", NULL, &like,_npy_parse_arguments("empty", &__argparse_cache, args, len_args , kwnames, "shape", &PyArray_IntpConverter, &shape, "|dtype" , &PyArray_DescrConverter, &typecode, "|order", & PyArray_OrderConverter, &order, "$like", ((void*)0), & like, ((void*)0), ((void*)0), ((void*)0)) | |||
1910 | NULL, NULL, NULL)_npy_parse_arguments("empty", &__argparse_cache, args, len_args , kwnames, "shape", &PyArray_IntpConverter, &shape, "|dtype" , &PyArray_DescrConverter, &typecode, "|order", & PyArray_OrderConverter, &order, "$like", ((void*)0), & like, ((void*)0), ((void*)0), ((void*)0)) < 0) { | |||
1911 | goto fail; | |||
1912 | } | |||
1913 | ||||
1914 | if (like != NULL((void*)0)) { | |||
1915 | PyObject *deferred = array_implement_c_array_function_creation( | |||
1916 | "empty", like, NULL((void*)0), NULL((void*)0), args, len_args, kwnames); | |||
1917 | if (deferred != Py_NotImplemented(&_Py_NotImplementedStruct)) { | |||
1918 | Py_XDECREF(typecode)_Py_XDECREF(((PyObject*)(typecode))); | |||
1919 | npy_free_cache_dim_obj(shape); | |||
1920 | return deferred; | |||
1921 | } | |||
1922 | } | |||
1923 | ||||
1924 | switch (order) { | |||
1925 | case NPY_CORDER: | |||
1926 | is_f_order = NPY_FALSE0; | |||
1927 | break; | |||
1928 | case NPY_FORTRANORDER: | |||
1929 | is_f_order = NPY_TRUE1; | |||
1930 | break; | |||
1931 | default: | |||
1932 | PyErr_SetString(PyExc_ValueError, | |||
1933 | "only 'C' or 'F' order is permitted"); | |||
1934 | goto fail; | |||
1935 | } | |||
1936 | ||||
1937 | ret = (PyArrayObject *)PyArray_Empty(shape.len, shape.ptr, | |||
1938 | typecode, is_f_order); | |||
1939 | ||||
1940 | npy_free_cache_dim_obj(shape); | |||
1941 | return (PyObject *)ret; | |||
1942 | ||||
1943 | fail: | |||
1944 | Py_XDECREF(typecode)_Py_XDECREF(((PyObject*)(typecode))); | |||
1945 | npy_free_cache_dim_obj(shape); | |||
1946 | return NULL((void*)0); | |||
1947 | } | |||
1948 | ||||
1949 | static PyObject * | |||
1950 | array_empty_like(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), PyObject *args, PyObject *kwds) | |||
1951 | { | |||
1952 | ||||
1953 | static char *kwlist[] = {"prototype", "dtype", "order", "subok", "shape", NULL((void*)0)}; | |||
1954 | PyArrayObject *prototype = NULL((void*)0); | |||
1955 | PyArray_Descr *dtype = NULL((void*)0); | |||
1956 | NPY_ORDER order = NPY_KEEPORDER; | |||
1957 | PyArrayObject *ret = NULL((void*)0); | |||
1958 | int subok = 1; | |||
1959 | /* -1 is a special value meaning "not specified" */ | |||
1960 | PyArray_Dims shape = {NULL((void*)0), -1}; | |||
1961 | ||||
1962 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, kwds, "O&|O&O&iO&:empty_like", kwlist, | |||
1963 | &PyArray_Converter, &prototype, | |||
1964 | &PyArray_DescrConverter2, &dtype, | |||
1965 | &PyArray_OrderConverter, &order, | |||
1966 | &subok, | |||
1967 | &PyArray_OptionalIntpConverter, &shape)) { | |||
1968 | goto fail; | |||
1969 | } | |||
1970 | /* steals the reference to dtype if it's not NULL */ | |||
1971 | ret = (PyArrayObject *)PyArray_NewLikeArrayWithShape(prototype, order, dtype, | |||
1972 | shape.len, shape.ptr, subok); | |||
1973 | npy_free_cache_dim_obj(shape); | |||
1974 | if (!ret) { | |||
1975 | goto fail; | |||
1976 | } | |||
1977 | Py_DECREF(prototype)_Py_DECREF(((PyObject*)(prototype))); | |||
1978 | ||||
1979 | return (PyObject *)ret; | |||
1980 | ||||
1981 | fail: | |||
1982 | Py_XDECREF(prototype)_Py_XDECREF(((PyObject*)(prototype))); | |||
1983 | Py_XDECREF(dtype)_Py_XDECREF(((PyObject*)(dtype))); | |||
1984 | return NULL((void*)0); | |||
1985 | } | |||
1986 | ||||
1987 | /* | |||
1988 | * This function is needed for supporting Pickles of | |||
1989 | * numpy scalar objects. | |||
1990 | */ | |||
1991 | static PyObject * | |||
1992 | array_scalar(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), PyObject *args, PyObject *kwds) | |||
1993 | { | |||
1994 | ||||
1995 | static char *kwlist[] = {"dtype", "obj", NULL((void*)0)}; | |||
1996 | PyArray_Descr *typecode; | |||
1997 | PyObject *obj = NULL((void*)0), *tmpobj = NULL((void*)0); | |||
1998 | int alloc = 0; | |||
1999 | void *dptr; | |||
2000 | PyObject *ret; | |||
2001 | PyObject *base = NULL((void*)0); | |||
2002 | ||||
2003 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, kwds, "O!|O:scalar", kwlist, | |||
2004 | &PyArrayDescr_Type(*(PyTypeObject *)(&PyArrayDescr_TypeFull)), &typecode, &obj)) { | |||
2005 | return NULL((void*)0); | |||
2006 | } | |||
2007 | if (PyDataType_FLAGCHK(typecode, NPY_LIST_PICKLE)(((typecode)->flags & (0x02)) == (0x02))) { | |||
2008 | if (typecode->type_num == NPY_OBJECT) { | |||
2009 | /* Deprecated 2020-11-24, NumPy 1.20 */ | |||
2010 | if (DEPRECATE(PyErr_WarnEx(PyExc_DeprecationWarning,"Unpickling a scalar with object dtype is deprecated. " "Object scalars should never be created. If this was a " "properly created pickle, please open a NumPy issue. In " "a best effort this returns the original object.",1) | |||
2011 | "Unpickling a scalar with object dtype is deprecated. "PyErr_WarnEx(PyExc_DeprecationWarning,"Unpickling a scalar with object dtype is deprecated. " "Object scalars should never be created. If this was a " "properly created pickle, please open a NumPy issue. In " "a best effort this returns the original object.",1) | |||
2012 | "Object scalars should never be created. If this was a "PyErr_WarnEx(PyExc_DeprecationWarning,"Unpickling a scalar with object dtype is deprecated. " "Object scalars should never be created. If this was a " "properly created pickle, please open a NumPy issue. In " "a best effort this returns the original object.",1) | |||
2013 | "properly created pickle, please open a NumPy issue. In "PyErr_WarnEx(PyExc_DeprecationWarning,"Unpickling a scalar with object dtype is deprecated. " "Object scalars should never be created. If this was a " "properly created pickle, please open a NumPy issue. In " "a best effort this returns the original object.",1) | |||
2014 | "a best effort this returns the original object.")PyErr_WarnEx(PyExc_DeprecationWarning,"Unpickling a scalar with object dtype is deprecated. " "Object scalars should never be created. If this was a " "properly created pickle, please open a NumPy issue. In " "a best effort this returns the original object.",1) < 0) { | |||
2015 | return NULL((void*)0); | |||
2016 | } | |||
2017 | Py_INCREF(obj)_Py_INCREF(((PyObject*)(obj))); | |||
2018 | return obj; | |||
2019 | } | |||
2020 | /* We store the full array to unpack it here: */ | |||
2021 | if (!PyArray_CheckExact(obj)(((PyObject*)(obj))->ob_type == &PyArray_Type)) { | |||
2022 | /* We pickle structured voids as arrays currently */ | |||
2023 | PyErr_SetString(PyExc_RuntimeError, | |||
2024 | "Unpickling NPY_LIST_PICKLE (structured void) scalar " | |||
2025 | "requires an array. The pickle file may be corrupted?"); | |||
2026 | return NULL((void*)0); | |||
2027 | } | |||
2028 | if (!PyArray_EquivTypes(PyArray_DESCR((PyArrayObject *)obj), typecode)) { | |||
2029 | PyErr_SetString(PyExc_RuntimeError, | |||
2030 | "Pickled array is not compatible with requested scalar " | |||
2031 | "dtype. The pickle file may be corrupted?"); | |||
2032 | return NULL((void*)0); | |||
2033 | } | |||
2034 | base = obj; | |||
2035 | dptr = PyArray_BYTES((PyArrayObject *)obj); | |||
2036 | } | |||
2037 | ||||
2038 | else if (PyDataType_FLAGCHK(typecode, NPY_ITEM_IS_POINTER)(((typecode)->flags & (0x04)) == (0x04))) { | |||
2039 | if (obj == NULL((void*)0)) { | |||
2040 | obj = Py_None(&_Py_NoneStruct); | |||
2041 | } | |||
2042 | dptr = &obj; | |||
2043 | } | |||
2044 | else { | |||
2045 | if (obj == NULL((void*)0)) { | |||
2046 | if (typecode->elsize == 0) { | |||
2047 | typecode->elsize = 1; | |||
2048 | } | |||
2049 | dptr = PyArray_mallocPyMem_RawMalloc(typecode->elsize); | |||
2050 | if (dptr == NULL((void*)0)) { | |||
2051 | return PyErr_NoMemory(); | |||
2052 | } | |||
2053 | memset(dptr, '\0', typecode->elsize); | |||
2054 | alloc = 1; | |||
2055 | } | |||
2056 | else { | |||
2057 | /* Backward compatibility with Python 2 NumPy pickles */ | |||
2058 | if (PyUnicode_Check(obj)((((((PyObject*)(obj))->ob_type))->tp_flags & ((1UL << 28))) != 0)) { | |||
2059 | tmpobj = PyUnicode_AsLatin1String(obj); | |||
2060 | obj = tmpobj; | |||
2061 | if (tmpobj == NULL((void*)0)) { | |||
2062 | /* More informative error message */ | |||
2063 | PyErr_SetString(PyExc_ValueError, | |||
2064 | "Failed to encode Numpy scalar data string to " | |||
2065 | "latin1,\npickle.load(a, encoding='latin1') is " | |||
2066 | "assumed if unpickling."); | |||
2067 | return NULL((void*)0); | |||
2068 | } | |||
2069 | } | |||
2070 | if (!PyBytes_Check(obj)((((((PyObject*)(obj))->ob_type))->tp_flags & ((1UL << 27))) != 0)) { | |||
2071 | PyErr_SetString(PyExc_TypeError, | |||
2072 | "initializing object must be a bytes object"); | |||
2073 | Py_XDECREF(tmpobj)_Py_XDECREF(((PyObject*)(tmpobj))); | |||
2074 | return NULL((void*)0); | |||
2075 | } | |||
2076 | if (PyBytes_GET_SIZE(obj)(((void) (0)),(((PyVarObject*)(obj))->ob_size)) < typecode->elsize) { | |||
2077 | PyErr_SetString(PyExc_ValueError, | |||
2078 | "initialization string is too small"); | |||
2079 | Py_XDECREF(tmpobj)_Py_XDECREF(((PyObject*)(tmpobj))); | |||
2080 | return NULL((void*)0); | |||
2081 | } | |||
2082 | dptr = PyBytes_AS_STRING(obj)(((void) (0)), (((PyBytesObject *)(obj))->ob_sval)); | |||
2083 | } | |||
2084 | } | |||
2085 | ret = PyArray_Scalar(dptr, typecode, base); | |||
2086 | ||||
2087 | /* free dptr which contains zeros */ | |||
2088 | if (alloc) { | |||
2089 | PyArray_freePyMem_RawFree(dptr); | |||
2090 | } | |||
2091 | Py_XDECREF(tmpobj)_Py_XDECREF(((PyObject*)(tmpobj))); | |||
2092 | return ret; | |||
2093 | } | |||
2094 | ||||
2095 | static PyObject * | |||
2096 | array_zeros(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), | |||
2097 | PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames) | |||
2098 | { | |||
2099 | PyArray_Descr *typecode = NULL((void*)0); | |||
2100 | PyArray_Dims shape = {NULL((void*)0), 0}; | |||
2101 | NPY_ORDER order = NPY_CORDER; | |||
2102 | npy_bool is_f_order = NPY_FALSE0; | |||
2103 | PyArrayObject *ret = NULL((void*)0); | |||
2104 | PyObject *like = NULL((void*)0); | |||
2105 | NPY_PREPARE_ARGPARSERstatic _NpyArgParserCache __argparse_cache = {-1}; | |||
2106 | ||||
2107 | if (npy_parse_arguments("zeros", args, len_args, kwnames,_npy_parse_arguments("zeros", &__argparse_cache, args, len_args , kwnames, "shape", &PyArray_IntpConverter, &shape, "|dtype" , &PyArray_DescrConverter, &typecode, "|order", & PyArray_OrderConverter, &order, "$like", ((void*)0), & like, ((void*)0), ((void*)0), ((void*)0)) | |||
2108 | "shape", &PyArray_IntpConverter, &shape,_npy_parse_arguments("zeros", &__argparse_cache, args, len_args , kwnames, "shape", &PyArray_IntpConverter, &shape, "|dtype" , &PyArray_DescrConverter, &typecode, "|order", & PyArray_OrderConverter, &order, "$like", ((void*)0), & like, ((void*)0), ((void*)0), ((void*)0)) | |||
2109 | "|dtype", &PyArray_DescrConverter, &typecode,_npy_parse_arguments("zeros", &__argparse_cache, args, len_args , kwnames, "shape", &PyArray_IntpConverter, &shape, "|dtype" , &PyArray_DescrConverter, &typecode, "|order", & PyArray_OrderConverter, &order, "$like", ((void*)0), & like, ((void*)0), ((void*)0), ((void*)0)) | |||
2110 | "|order", &PyArray_OrderConverter, &order,_npy_parse_arguments("zeros", &__argparse_cache, args, len_args , kwnames, "shape", &PyArray_IntpConverter, &shape, "|dtype" , &PyArray_DescrConverter, &typecode, "|order", & PyArray_OrderConverter, &order, "$like", ((void*)0), & like, ((void*)0), ((void*)0), ((void*)0)) | |||
2111 | "$like", NULL, &like,_npy_parse_arguments("zeros", &__argparse_cache, args, len_args , kwnames, "shape", &PyArray_IntpConverter, &shape, "|dtype" , &PyArray_DescrConverter, &typecode, "|order", & PyArray_OrderConverter, &order, "$like", ((void*)0), & like, ((void*)0), ((void*)0), ((void*)0)) | |||
2112 | NULL, NULL, NULL)_npy_parse_arguments("zeros", &__argparse_cache, args, len_args , kwnames, "shape", &PyArray_IntpConverter, &shape, "|dtype" , &PyArray_DescrConverter, &typecode, "|order", & PyArray_OrderConverter, &order, "$like", ((void*)0), & like, ((void*)0), ((void*)0), ((void*)0)) < 0) { | |||
2113 | goto fail; | |||
2114 | } | |||
2115 | ||||
2116 | ||||
2117 | if (like != NULL((void*)0)) { | |||
2118 | PyObject *deferred = array_implement_c_array_function_creation( | |||
2119 | "zeros", like, NULL((void*)0), NULL((void*)0), args, len_args, kwnames); | |||
2120 | if (deferred != Py_NotImplemented(&_Py_NotImplementedStruct)) { | |||
2121 | Py_XDECREF(typecode)_Py_XDECREF(((PyObject*)(typecode))); | |||
2122 | npy_free_cache_dim_obj(shape); | |||
2123 | return deferred; | |||
2124 | } | |||
2125 | } | |||
2126 | ||||
2127 | switch (order) { | |||
2128 | case NPY_CORDER: | |||
2129 | is_f_order = NPY_FALSE0; | |||
2130 | break; | |||
2131 | case NPY_FORTRANORDER: | |||
2132 | is_f_order = NPY_TRUE1; | |||
2133 | break; | |||
2134 | default: | |||
2135 | PyErr_SetString(PyExc_ValueError, | |||
2136 | "only 'C' or 'F' order is permitted"); | |||
2137 | goto fail; | |||
2138 | } | |||
2139 | ||||
2140 | ret = (PyArrayObject *)PyArray_Zeros(shape.len, shape.ptr, | |||
2141 | typecode, (int) is_f_order); | |||
2142 | ||||
2143 | npy_free_cache_dim_obj(shape); | |||
2144 | return (PyObject *)ret; | |||
2145 | ||||
2146 | fail: | |||
2147 | Py_XDECREF(typecode)_Py_XDECREF(((PyObject*)(typecode))); | |||
2148 | npy_free_cache_dim_obj(shape); | |||
2149 | return (PyObject *)ret; | |||
2150 | } | |||
2151 | ||||
2152 | static PyObject * | |||
2153 | array_count_nonzero(PyObject *NPY_UNUSED(self)(__NPY_UNUSED_TAGGEDself) __attribute__ ((__unused__)), PyObject *args, PyObject *kwds) | |||
2154 | { | |||
2155 | PyArrayObject *array; | |||
2156 | npy_intp count; | |||
2157 | ||||
2158 | if (!PyArg_ParseTuple_PyArg_ParseTuple_SizeT(args, "O&:count_nonzero", PyArray_Converter, &array)) { | |||
2159 | return NULL((void*)0); | |||
2160 | } | |||
2161 | ||||
2162 | count = PyArray_CountNonzero(array); | |||
2163 | ||||
2164 | Py_DECREF(array)_Py_DECREF(((PyObject*)(array))); | |||
2165 | ||||
2166 | if (count == -1) { | |||
2167 | return NULL((void*)0); | |||
2168 | } | |||
2169 | return PyLong_FromSsize_t(count); | |||
2170 | } | |||
2171 | ||||
2172 | static PyObject * | |||
2173 | array_fromstring(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), PyObject *args, PyObject *keywds) | |||
2174 | { | |||
2175 | char *data; | |||
2176 | Py_ssize_t nin = -1; | |||
2177 | char *sep = NULL((void*)0); | |||
2178 | Py_ssize_t s; | |||
2179 | static char *kwlist[] = {"string", "dtype", "count", "sep", "like", NULL((void*)0)}; | |||
2180 | PyObject *like = NULL((void*)0); | |||
2181 | PyArray_Descr *descr = NULL((void*)0); | |||
2182 | ||||
2183 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, keywds, | |||
2184 | "s#|O&" NPY_SSIZE_T_PYFMT"n" "s$O:fromstring", kwlist, | |||
2185 | &data, &s, PyArray_DescrConverter, &descr, &nin, &sep, &like)) { | |||
2186 | Py_XDECREF(descr)_Py_XDECREF(((PyObject*)(descr))); | |||
2187 | return NULL((void*)0); | |||
2188 | } | |||
2189 | if (like != NULL((void*)0)) { | |||
2190 | PyObject *deferred = array_implement_c_array_function_creation( | |||
2191 | "fromstring", like, args, keywds, NULL((void*)0), 0, NULL((void*)0)); | |||
2192 | if (deferred != Py_NotImplemented(&_Py_NotImplementedStruct)) { | |||
2193 | Py_XDECREF(descr)_Py_XDECREF(((PyObject*)(descr))); | |||
2194 | return deferred; | |||
2195 | } | |||
2196 | } | |||
2197 | ||||
2198 | /* binary mode, condition copied from PyArray_FromString */ | |||
2199 | if (sep == NULL((void*)0) || strlen(sep) == 0) { | |||
2200 | /* Numpy 1.14, 2017-10-19 */ | |||
2201 | if (DEPRECATE(PyErr_WarnEx(PyExc_DeprecationWarning,"The binary mode of fromstring is deprecated, as it behaves " "surprisingly on unicode inputs. Use frombuffer instead",1) | |||
2202 | "The binary mode of fromstring is deprecated, as it behaves "PyErr_WarnEx(PyExc_DeprecationWarning,"The binary mode of fromstring is deprecated, as it behaves " "surprisingly on unicode inputs. Use frombuffer instead",1) | |||
2203 | "surprisingly on unicode inputs. Use frombuffer instead")PyErr_WarnEx(PyExc_DeprecationWarning,"The binary mode of fromstring is deprecated, as it behaves " "surprisingly on unicode inputs. Use frombuffer instead",1) < 0) { | |||
2204 | Py_XDECREF(descr)_Py_XDECREF(((PyObject*)(descr))); | |||
2205 | return NULL((void*)0); | |||
2206 | } | |||
2207 | } | |||
2208 | return PyArray_FromString(data, (npy_intp)s, descr, (npy_intp)nin, sep); | |||
2209 | } | |||
2210 | ||||
2211 | ||||
2212 | ||||
2213 | static PyObject * | |||
2214 | array_fromfile(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), PyObject *args, PyObject *keywds) | |||
2215 | { | |||
2216 | PyObject *file = NULL((void*)0), *ret = NULL((void*)0); | |||
2217 | PyObject *err_type = NULL((void*)0), *err_value = NULL((void*)0), *err_traceback = NULL((void*)0); | |||
2218 | char *sep = ""; | |||
2219 | Py_ssize_t nin = -1; | |||
2220 | static char *kwlist[] = {"file", "dtype", "count", "sep", "offset", "like", NULL((void*)0)}; | |||
2221 | PyObject *like = NULL((void*)0); | |||
2222 | PyArray_Descr *type = NULL((void*)0); | |||
2223 | int own; | |||
2224 | npy_off_toff_t orig_pos = 0, offset = 0; | |||
2225 | FILE *fp; | |||
2226 | ||||
2227 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, keywds, | |||
2228 | "O|O&" NPY_SSIZE_T_PYFMT"n" "s" NPY_OFF_T_PYFMT"l" "$O:fromfile", kwlist, | |||
2229 | &file, PyArray_DescrConverter, &type, &nin, &sep, &offset, &like)) { | |||
2230 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
2231 | return NULL((void*)0); | |||
2232 | } | |||
2233 | ||||
2234 | if (like != NULL((void*)0)) { | |||
2235 | PyObject *deferred = array_implement_c_array_function_creation( | |||
2236 | "fromfile", like, args, keywds, NULL((void*)0), 0, NULL((void*)0)); | |||
2237 | if (deferred != Py_NotImplemented(&_Py_NotImplementedStruct)) { | |||
2238 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
2239 | return deferred; | |||
2240 | } | |||
2241 | } | |||
2242 | ||||
2243 | file = NpyPath_PathlikeToFspath(file); | |||
2244 | if (file == NULL((void*)0)) { | |||
2245 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
2246 | return NULL((void*)0); | |||
2247 | } | |||
2248 | ||||
2249 | if (offset != 0 && strcmp(sep, "") != 0) { | |||
2250 | PyErr_SetString(PyExc_TypeError, "'offset' argument only permitted for binary files"); | |||
2251 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
2252 | Py_DECREF(file)_Py_DECREF(((PyObject*)(file))); | |||
2253 | return NULL((void*)0); | |||
2254 | } | |||
2255 | if (PyBytes_Check(file)((((((PyObject*)(file))->ob_type))->tp_flags & ((1UL << 27))) != 0) || PyUnicode_Check(file)((((((PyObject*)(file))->ob_type))->tp_flags & ((1UL << 28))) != 0)) { | |||
2256 | Py_SETREF(file, npy_PyFile_OpenFile(file, "rb"))do { PyObject *_py_tmp = ((PyObject*)(file)); (file) = (npy_PyFile_OpenFile (file, "rb")); _Py_DECREF(((PyObject*)(_py_tmp))); } while (0 ); | |||
2257 | if (file == NULL((void*)0)) { | |||
2258 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
2259 | return NULL((void*)0); | |||
2260 | } | |||
2261 | own = 1; | |||
2262 | } | |||
2263 | else { | |||
2264 | own = 0; | |||
2265 | } | |||
2266 | fp = npy_PyFile_Dup2(file, "rb", &orig_pos); | |||
2267 | if (fp == NULL((void*)0)) { | |||
2268 | Py_DECREF(file)_Py_DECREF(((PyObject*)(file))); | |||
2269 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
2270 | return NULL((void*)0); | |||
2271 | } | |||
2272 | if (npy_fseekfseeko(fp, offset, SEEK_CUR1) != 0) { | |||
2273 | PyErr_SetFromErrno(PyExc_IOError); | |||
2274 | goto cleanup; | |||
2275 | } | |||
2276 | if (type == NULL((void*)0)) { | |||
2277 | type = PyArray_DescrFromType(NPY_DEFAULT_TYPENPY_DOUBLE); | |||
2278 | } | |||
2279 | ret = PyArray_FromFile(fp, type, (npy_intp) nin, sep); | |||
2280 | ||||
2281 | /* If an exception is thrown in the call to PyArray_FromFile | |||
2282 | * we need to clear it, and restore it later to ensure that | |||
2283 | * we can cleanup the duplicated file descriptor properly. | |||
2284 | */ | |||
2285 | cleanup: | |||
2286 | PyErr_Fetch(&err_type, &err_value, &err_traceback); | |||
2287 | if (npy_PyFile_DupClose2(file, fp, orig_pos) < 0) { | |||
2288 | npy_PyErr_ChainExceptions(err_type, err_value, err_traceback); | |||
2289 | goto fail; | |||
2290 | } | |||
2291 | if (own && npy_PyFile_CloseFile(file) < 0) { | |||
2292 | npy_PyErr_ChainExceptions(err_type, err_value, err_traceback); | |||
2293 | goto fail; | |||
2294 | } | |||
2295 | PyErr_Restore(err_type, err_value, err_traceback); | |||
2296 | Py_DECREF(file)_Py_DECREF(((PyObject*)(file))); | |||
2297 | return ret; | |||
2298 | ||||
2299 | fail: | |||
2300 | Py_DECREF(file)_Py_DECREF(((PyObject*)(file))); | |||
2301 | Py_XDECREF(ret)_Py_XDECREF(((PyObject*)(ret))); | |||
2302 | return NULL((void*)0); | |||
2303 | } | |||
2304 | ||||
2305 | static PyObject * | |||
2306 | array_fromiter(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), PyObject *args, PyObject *keywds) | |||
2307 | { | |||
2308 | PyObject *iter; | |||
2309 | Py_ssize_t nin = -1; | |||
2310 | static char *kwlist[] = {"iter", "dtype", "count", "like", NULL((void*)0)}; | |||
2311 | PyObject *like = NULL((void*)0); | |||
2312 | PyArray_Descr *descr = NULL((void*)0); | |||
2313 | ||||
2314 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, keywds, | |||
2315 | "OO&|" NPY_SSIZE_T_PYFMT"n" "$O:fromiter", kwlist, | |||
2316 | &iter, PyArray_DescrConverter, &descr, &nin, &like)) { | |||
2317 | Py_XDECREF(descr)_Py_XDECREF(((PyObject*)(descr))); | |||
2318 | return NULL((void*)0); | |||
2319 | } | |||
2320 | if (like != NULL((void*)0)) { | |||
2321 | PyObject *deferred = array_implement_c_array_function_creation( | |||
2322 | "fromiter", like, args, keywds, NULL((void*)0), 0, NULL((void*)0)); | |||
2323 | if (deferred != Py_NotImplemented(&_Py_NotImplementedStruct)) { | |||
2324 | Py_XDECREF(descr)_Py_XDECREF(((PyObject*)(descr))); | |||
2325 | return deferred; | |||
2326 | } | |||
2327 | } | |||
2328 | ||||
2329 | return PyArray_FromIter(iter, descr, (npy_intp)nin); | |||
2330 | } | |||
2331 | ||||
2332 | static PyObject * | |||
2333 | array_frombuffer(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), PyObject *args, PyObject *keywds) | |||
2334 | { | |||
2335 | PyObject *obj = NULL((void*)0); | |||
2336 | Py_ssize_t nin = -1, offset = 0; | |||
2337 | static char *kwlist[] = {"buffer", "dtype", "count", "offset", "like", NULL((void*)0)}; | |||
2338 | PyObject *like = NULL((void*)0); | |||
2339 | PyArray_Descr *type = NULL((void*)0); | |||
2340 | ||||
2341 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, keywds, | |||
2342 | "O|O&" NPY_SSIZE_T_PYFMT"n" NPY_SSIZE_T_PYFMT"n" "$O:frombuffer", kwlist, | |||
2343 | &obj, PyArray_DescrConverter, &type, &nin, &offset, &like)) { | |||
2344 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
2345 | return NULL((void*)0); | |||
2346 | } | |||
2347 | ||||
2348 | if (like != NULL((void*)0)) { | |||
2349 | PyObject *deferred = array_implement_c_array_function_creation( | |||
2350 | "frombuffer", like, args, keywds, NULL((void*)0), 0, NULL((void*)0)); | |||
2351 | if (deferred != Py_NotImplemented(&_Py_NotImplementedStruct)) { | |||
2352 | Py_XDECREF(type)_Py_XDECREF(((PyObject*)(type))); | |||
2353 | return deferred; | |||
2354 | } | |||
2355 | } | |||
2356 | ||||
2357 | if (type == NULL((void*)0)) { | |||
2358 | type = PyArray_DescrFromType(NPY_DEFAULT_TYPENPY_DOUBLE); | |||
2359 | } | |||
2360 | return PyArray_FromBuffer(obj, type, (npy_intp)nin, (npy_intp)offset); | |||
2361 | } | |||
2362 | ||||
2363 | static PyObject * | |||
2364 | array_concatenate(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), PyObject *args, PyObject *kwds) | |||
2365 | { | |||
2366 | PyObject *a0; | |||
2367 | PyObject *out = NULL((void*)0); | |||
2368 | PyArray_Descr *dtype = NULL((void*)0); | |||
2369 | NPY_CASTING casting = NPY_SAME_KIND_CASTING; | |||
2370 | PyObject *casting_obj = NULL((void*)0); | |||
2371 | PyObject *res; | |||
2372 | int axis = 0; | |||
2373 | static char *kwlist[] = {"seq", "axis", "out", "dtype", "casting", NULL((void*)0)}; | |||
2374 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, kwds, "O|O&O$O&O:concatenate", kwlist, | |||
2375 | &a0, PyArray_AxisConverter, &axis, &out, | |||
2376 | PyArray_DescrConverter2, &dtype, &casting_obj)) { | |||
2377 | return NULL((void*)0); | |||
2378 | } | |||
2379 | int casting_not_passed = 0; | |||
2380 | if (casting_obj == NULL((void*)0)) { | |||
2381 | /* | |||
2382 | * Casting was not passed in, needed for deprecation only. | |||
2383 | * This should be simplified once the deprecation is finished. | |||
2384 | */ | |||
2385 | casting_not_passed = 1; | |||
2386 | } | |||
2387 | else if (!PyArray_CastingConverter(casting_obj, &casting)) { | |||
2388 | Py_XDECREF(dtype)_Py_XDECREF(((PyObject*)(dtype))); | |||
2389 | return NULL((void*)0); | |||
2390 | } | |||
2391 | if (out != NULL((void*)0)) { | |||
2392 | if (out == Py_None(&_Py_NoneStruct)) { | |||
2393 | out = NULL((void*)0); | |||
2394 | } | |||
2395 | else if (!PyArray_Check(out)((((PyObject*)(out))->ob_type) == (&PyArray_Type) || PyType_IsSubtype ((((PyObject*)(out))->ob_type), (&PyArray_Type)))) { | |||
2396 | PyErr_SetString(PyExc_TypeError, "'out' must be an array"); | |||
2397 | Py_XDECREF(dtype)_Py_XDECREF(((PyObject*)(dtype))); | |||
2398 | return NULL((void*)0); | |||
2399 | } | |||
2400 | } | |||
2401 | res = PyArray_ConcatenateInto(a0, axis, (PyArrayObject *)out, dtype, | |||
2402 | casting, casting_not_passed); | |||
2403 | Py_XDECREF(dtype)_Py_XDECREF(((PyObject*)(dtype))); | |||
2404 | return res; | |||
2405 | } | |||
2406 | ||||
2407 | static PyObject * | |||
2408 | array_innerproduct(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), PyObject *args) | |||
2409 | { | |||
2410 | PyObject *b0, *a0; | |||
2411 | ||||
2412 | if (!PyArg_ParseTuple_PyArg_ParseTuple_SizeT(args, "OO:innerproduct", &a0, &b0)) { | |||
2413 | return NULL((void*)0); | |||
2414 | } | |||
2415 | return PyArray_Return((PyArrayObject *)PyArray_InnerProduct(a0, b0)); | |||
2416 | } | |||
2417 | ||||
2418 | static PyObject * | |||
2419 | array_matrixproduct(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), PyObject *args, PyObject* kwds) | |||
2420 | { | |||
2421 | PyObject *v, *a, *o = NULL((void*)0); | |||
2422 | PyArrayObject *ret; | |||
2423 | static char* kwlist[] = {"a", "b", "out", NULL((void*)0)}; | |||
2424 | ||||
2425 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, kwds, "OO|O:matrixproduct", | |||
2426 | kwlist, &a, &v, &o)) { | |||
2427 | return NULL((void*)0); | |||
2428 | } | |||
2429 | if (o != NULL((void*)0)) { | |||
2430 | if (o == Py_None(&_Py_NoneStruct)) { | |||
2431 | o = NULL((void*)0); | |||
2432 | } | |||
2433 | else if (!PyArray_Check(o)((((PyObject*)(o))->ob_type) == (&PyArray_Type) || PyType_IsSubtype ((((PyObject*)(o))->ob_type), (&PyArray_Type)))) { | |||
2434 | PyErr_SetString(PyExc_TypeError, "'out' must be an array"); | |||
2435 | return NULL((void*)0); | |||
2436 | } | |||
2437 | } | |||
2438 | ret = (PyArrayObject *)PyArray_MatrixProduct2(a, v, (PyArrayObject *)o); | |||
2439 | return PyArray_Return(ret); | |||
2440 | } | |||
2441 | ||||
2442 | ||||
2443 | static PyObject * | |||
2444 | array_vdot(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), PyObject *args) | |||
2445 | { | |||
2446 | int typenum; | |||
2447 | char *ip1, *ip2, *op; | |||
2448 | npy_intp n, stride1, stride2; | |||
2449 | PyObject *op1, *op2; | |||
2450 | npy_intp newdimptr[1] = {-1}; | |||
2451 | PyArray_Dims newdims = {newdimptr, 1}; | |||
2452 | PyArrayObject *ap1 = NULL((void*)0), *ap2 = NULL((void*)0), *ret = NULL((void*)0); | |||
2453 | PyArray_Descr *type; | |||
2454 | PyArray_DotFunc *vdot; | |||
2455 | NPY_BEGIN_THREADS_DEFPyThreadState *_save=((void*)0);; | |||
2456 | ||||
2457 | if (!PyArg_ParseTuple_PyArg_ParseTuple_SizeT(args, "OO:vdot", &op1, &op2)) { | |||
2458 | return NULL((void*)0); | |||
2459 | } | |||
2460 | ||||
2461 | /* | |||
2462 | * Conjugating dot product using the BLAS for vectors. | |||
2463 | * Flattens both op1 and op2 before dotting. | |||
2464 | */ | |||
2465 | typenum = PyArray_ObjectType(op1, 0); | |||
2466 | typenum = PyArray_ObjectType(op2, typenum); | |||
2467 | ||||
2468 | type = PyArray_DescrFromType(typenum); | |||
2469 | Py_INCREF(type)_Py_INCREF(((PyObject*)(type))); | |||
2470 | ap1 = (PyArrayObject *)PyArray_FromAny(op1, type, 0, 0, 0, NULL((void*)0)); | |||
2471 | if (ap1 == NULL((void*)0)) { | |||
2472 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); | |||
2473 | goto fail; | |||
2474 | } | |||
2475 | ||||
2476 | op1 = PyArray_Newshape(ap1, &newdims, NPY_CORDER); | |||
2477 | if (op1 == NULL((void*)0)) { | |||
2478 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); | |||
2479 | goto fail; | |||
2480 | } | |||
2481 | Py_DECREF(ap1)_Py_DECREF(((PyObject*)(ap1))); | |||
2482 | ap1 = (PyArrayObject *)op1; | |||
2483 | ||||
2484 | ap2 = (PyArrayObject *)PyArray_FromAny(op2, type, 0, 0, 0, NULL((void*)0)); | |||
2485 | if (ap2 == NULL((void*)0)) { | |||
2486 | goto fail; | |||
2487 | } | |||
2488 | op2 = PyArray_Newshape(ap2, &newdims, NPY_CORDER); | |||
2489 | if (op2 == NULL((void*)0)) { | |||
2490 | goto fail; | |||
2491 | } | |||
2492 | Py_DECREF(ap2)_Py_DECREF(((PyObject*)(ap2))); | |||
2493 | ap2 = (PyArrayObject *)op2; | |||
2494 | ||||
2495 | if (PyArray_DIM(ap2, 0) != PyArray_DIM(ap1, 0)) { | |||
2496 | PyErr_SetString(PyExc_ValueError, | |||
2497 | "vectors have different lengths"); | |||
2498 | goto fail; | |||
2499 | } | |||
2500 | ||||
2501 | /* array scalar output */ | |||
2502 | ret = new_array_for_sum(ap1, ap2, NULL((void*)0), 0, (npy_intp *)NULL((void*)0), typenum, NULL((void*)0)); | |||
2503 | if (ret == NULL((void*)0)) { | |||
2504 | goto fail; | |||
2505 | } | |||
2506 | ||||
2507 | n = PyArray_DIM(ap1, 0); | |||
2508 | stride1 = PyArray_STRIDE(ap1, 0); | |||
2509 | stride2 = PyArray_STRIDE(ap2, 0); | |||
2510 | ip1 = PyArray_DATA(ap1); | |||
2511 | ip2 = PyArray_DATA(ap2); | |||
2512 | op = PyArray_DATA(ret); | |||
2513 | ||||
2514 | switch (typenum) { | |||
2515 | case NPY_CFLOAT: | |||
2516 | vdot = (PyArray_DotFunc *)CFLOAT_vdot; | |||
2517 | break; | |||
2518 | case NPY_CDOUBLE: | |||
2519 | vdot = (PyArray_DotFunc *)CDOUBLE_vdot; | |||
2520 | break; | |||
2521 | case NPY_CLONGDOUBLE: | |||
2522 | vdot = (PyArray_DotFunc *)CLONGDOUBLE_vdot; | |||
2523 | break; | |||
2524 | case NPY_OBJECT: | |||
2525 | vdot = (PyArray_DotFunc *)OBJECT_vdot; | |||
2526 | break; | |||
2527 | default: | |||
2528 | vdot = type->f->dotfunc; | |||
2529 | if (vdot == NULL((void*)0)) { | |||
2530 | PyErr_SetString(PyExc_ValueError, | |||
2531 | "function not available for this data type"); | |||
2532 | goto fail; | |||
2533 | } | |||
2534 | } | |||
2535 | ||||
2536 | if (n < 500) { | |||
2537 | vdot(ip1, stride1, ip2, stride2, op, n, NULL((void*)0)); | |||
2538 | } | |||
2539 | else { | |||
2540 | NPY_BEGIN_THREADS_DESCR(type)do {if (!(((((type))->flags & (0x10)) == (0x10)))) do { _save = PyEval_SaveThread();} while (0);;} while (0);; | |||
2541 | vdot(ip1, stride1, ip2, stride2, op, n, NULL((void*)0)); | |||
2542 | NPY_END_THREADS_DESCR(type)do {if (!(((((type))->flags & (0x10)) == (0x10)))) do { if (_save) { PyEval_RestoreThread(_save); _save = ((void*)0) ;} } while (0);; } while (0);; | |||
2543 | } | |||
2544 | ||||
2545 | Py_XDECREF(ap1)_Py_XDECREF(((PyObject*)(ap1))); | |||
2546 | Py_XDECREF(ap2)_Py_XDECREF(((PyObject*)(ap2))); | |||
2547 | return PyArray_Return(ret); | |||
2548 | fail: | |||
2549 | Py_XDECREF(ap1)_Py_XDECREF(((PyObject*)(ap1))); | |||
2550 | Py_XDECREF(ap2)_Py_XDECREF(((PyObject*)(ap2))); | |||
2551 | Py_XDECREF(ret)_Py_XDECREF(((PyObject*)(ret))); | |||
2552 | return NULL((void*)0); | |||
2553 | } | |||
2554 | ||||
2555 | static int | |||
2556 | einsum_sub_op_from_str(PyObject *args, PyObject **str_obj, char **subscripts, | |||
2557 | PyArrayObject **op) | |||
2558 | { | |||
2559 | int i, nop; | |||
2560 | PyObject *subscripts_str; | |||
2561 | ||||
2562 | nop = PyTuple_GET_SIZE(args)(((PyVarObject*)((((void) (0)), (PyTupleObject *)(args))))-> ob_size) - 1; | |||
2563 | if (nop <= 0) { | |||
2564 | PyErr_SetString(PyExc_ValueError, | |||
2565 | "must specify the einstein sum subscripts string " | |||
2566 | "and at least one operand"); | |||
2567 | return -1; | |||
2568 | } | |||
2569 | else if (nop >= NPY_MAXARGS32) { | |||
2570 | PyErr_SetString(PyExc_ValueError, "too many operands"); | |||
2571 | return -1; | |||
2572 | } | |||
2573 | ||||
2574 | /* Get the subscripts string */ | |||
2575 | subscripts_str = PyTuple_GET_ITEM(args, 0)((((void) (0)), (PyTupleObject *)(args))->ob_item[0]); | |||
2576 | if (PyUnicode_Check(subscripts_str)((((((PyObject*)(subscripts_str))->ob_type))->tp_flags & ((1UL << 28))) != 0)) { | |||
2577 | *str_obj = PyUnicode_AsASCIIString(subscripts_str); | |||
2578 | if (*str_obj == NULL((void*)0)) { | |||
2579 | return -1; | |||
2580 | } | |||
2581 | subscripts_str = *str_obj; | |||
2582 | } | |||
2583 | ||||
2584 | *subscripts = PyBytes_AsString(subscripts_str); | |||
2585 | if (*subscripts == NULL((void*)0)) { | |||
2586 | Py_XDECREF(*str_obj)_Py_XDECREF(((PyObject*)(*str_obj))); | |||
2587 | *str_obj = NULL((void*)0); | |||
2588 | return -1; | |||
2589 | } | |||
2590 | ||||
2591 | /* Set the operands to NULL */ | |||
2592 | for (i = 0; i < nop; ++i) { | |||
2593 | op[i] = NULL((void*)0); | |||
2594 | } | |||
2595 | ||||
2596 | /* Get the operands */ | |||
2597 | for (i = 0; i < nop; ++i) { | |||
2598 | PyObject *obj = PyTuple_GET_ITEM(args, i+1)((((void) (0)), (PyTupleObject *)(args))->ob_item[i+1]); | |||
2599 | ||||
2600 | op[i] = (PyArrayObject *)PyArray_FROM_OF(obj, NPY_ARRAY_ENSUREARRAY)PyArray_CheckFromAny(obj, ((void*)0), 0, 0, 0x0040, ((void*)0 )); | |||
2601 | if (op[i] == NULL((void*)0)) { | |||
2602 | goto fail; | |||
2603 | } | |||
2604 | } | |||
2605 | ||||
2606 | return nop; | |||
2607 | ||||
2608 | fail: | |||
2609 | for (i = 0; i < nop; ++i) { | |||
2610 | Py_XDECREF(op[i])_Py_XDECREF(((PyObject*)(op[i]))); | |||
2611 | op[i] = NULL((void*)0); | |||
2612 | } | |||
2613 | ||||
2614 | return -1; | |||
2615 | } | |||
2616 | ||||
2617 | /* | |||
2618 | * Converts a list of subscripts to a string. | |||
2619 | * | |||
2620 | * Returns -1 on error, the number of characters placed in subscripts | |||
2621 | * otherwise. | |||
2622 | */ | |||
2623 | static int | |||
2624 | einsum_list_to_subscripts(PyObject *obj, char *subscripts, int subsize) | |||
2625 | { | |||
2626 | int ellipsis = 0, subindex = 0; | |||
2627 | npy_intp i, size; | |||
2628 | PyObject *item; | |||
2629 | ||||
2630 | obj = PySequence_Fast(obj, "the subscripts for each operand must " | |||
2631 | "be a list or a tuple"); | |||
2632 | if (obj == NULL((void*)0)) { | |||
2633 | return -1; | |||
2634 | } | |||
2635 | size = PySequence_Size(obj); | |||
2636 | ||||
2637 | for (i = 0; i < size; ++i) { | |||
2638 | item = 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]) ); | |||
2639 | /* Ellipsis */ | |||
2640 | if (item == Py_Ellipsis(&_Py_EllipsisObject)) { | |||
2641 | if (ellipsis) { | |||
2642 | PyErr_SetString(PyExc_ValueError, | |||
2643 | "each subscripts list may have only one ellipsis"); | |||
2644 | Py_DECREF(obj)_Py_DECREF(((PyObject*)(obj))); | |||
2645 | return -1; | |||
2646 | } | |||
2647 | if (subindex + 3 >= subsize) { | |||
2648 | PyErr_SetString(PyExc_ValueError, | |||
2649 | "subscripts list is too long"); | |||
2650 | Py_DECREF(obj)_Py_DECREF(((PyObject*)(obj))); | |||
2651 | return -1; | |||
2652 | } | |||
2653 | subscripts[subindex++] = '.'; | |||
2654 | subscripts[subindex++] = '.'; | |||
2655 | subscripts[subindex++] = '.'; | |||
2656 | ellipsis = 1; | |||
2657 | } | |||
2658 | /* Subscript */ | |||
2659 | else { | |||
2660 | npy_intp s = PyArray_PyIntAsIntp(item); | |||
2661 | /* Invalid */ | |||
2662 | if (error_converting(s)(((s) == -1) && PyErr_Occurred())) { | |||
2663 | PyErr_SetString(PyExc_TypeError, | |||
2664 | "each subscript must be either an integer " | |||
2665 | "or an ellipsis"); | |||
2666 | Py_DECREF(obj)_Py_DECREF(((PyObject*)(obj))); | |||
2667 | return -1; | |||
2668 | } | |||
2669 | npy_bool bad_input = 0; | |||
2670 | ||||
2671 | if (subindex + 1 >= subsize) { | |||
2672 | PyErr_SetString(PyExc_ValueError, | |||
2673 | "subscripts list is too long"); | |||
2674 | Py_DECREF(obj)_Py_DECREF(((PyObject*)(obj))); | |||
2675 | return -1; | |||
2676 | } | |||
2677 | ||||
2678 | if (s < 0) { | |||
2679 | bad_input = 1; | |||
2680 | } | |||
2681 | else if (s < 26) { | |||
2682 | subscripts[subindex++] = 'A' + (char)s; | |||
2683 | } | |||
2684 | else if (s < 2*26) { | |||
2685 | subscripts[subindex++] = 'a' + (char)s - 26; | |||
2686 | } | |||
2687 | else { | |||
2688 | bad_input = 1; | |||
2689 | } | |||
2690 | ||||
2691 | if (bad_input) { | |||
2692 | PyErr_SetString(PyExc_ValueError, | |||
2693 | "subscript is not within the valid range [0, 52)"); | |||
2694 | Py_DECREF(obj)_Py_DECREF(((PyObject*)(obj))); | |||
2695 | return -1; | |||
2696 | } | |||
2697 | } | |||
2698 | ||||
2699 | } | |||
2700 | ||||
2701 | Py_DECREF(obj)_Py_DECREF(((PyObject*)(obj))); | |||
2702 | ||||
2703 | return subindex; | |||
2704 | } | |||
2705 | ||||
2706 | /* | |||
2707 | * Fills in the subscripts, with maximum size subsize, and op, | |||
2708 | * with the values in the tuple 'args'. | |||
2709 | * | |||
2710 | * Returns -1 on error, number of operands placed in op otherwise. | |||
2711 | */ | |||
2712 | static int | |||
2713 | einsum_sub_op_from_lists(PyObject *args, | |||
2714 | char *subscripts, int subsize, PyArrayObject **op) | |||
2715 | { | |||
2716 | int subindex = 0; | |||
2717 | npy_intp i, nop; | |||
2718 | ||||
2719 | nop = PyTuple_Size(args)/2; | |||
2720 | ||||
2721 | if (nop == 0) { | |||
2722 | PyErr_SetString(PyExc_ValueError, "must provide at least an " | |||
2723 | "operand and a subscripts list to einsum"); | |||
2724 | return -1; | |||
2725 | } | |||
2726 | else if (nop >= NPY_MAXARGS32) { | |||
2727 | PyErr_SetString(PyExc_ValueError, "too many operands"); | |||
2728 | return -1; | |||
2729 | } | |||
2730 | ||||
2731 | /* Set the operands to NULL */ | |||
2732 | for (i = 0; i < nop; ++i) { | |||
2733 | op[i] = NULL((void*)0); | |||
2734 | } | |||
2735 | ||||
2736 | /* Get the operands and build the subscript string */ | |||
2737 | for (i = 0; i < nop; ++i) { | |||
2738 | PyObject *obj = PyTuple_GET_ITEM(args, 2*i)((((void) (0)), (PyTupleObject *)(args))->ob_item[2*i]); | |||
2739 | int n; | |||
2740 | ||||
2741 | /* Comma between the subscripts for each operand */ | |||
2742 | if (i != 0) { | |||
2743 | subscripts[subindex++] = ','; | |||
2744 | if (subindex >= subsize) { | |||
2745 | PyErr_SetString(PyExc_ValueError, | |||
2746 | "subscripts list is too long"); | |||
2747 | goto fail; | |||
2748 | } | |||
2749 | } | |||
2750 | ||||
2751 | op[i] = (PyArrayObject *)PyArray_FROM_OF(obj, NPY_ARRAY_ENSUREARRAY)PyArray_CheckFromAny(obj, ((void*)0), 0, 0, 0x0040, ((void*)0 )); | |||
2752 | if (op[i] == NULL((void*)0)) { | |||
2753 | goto fail; | |||
2754 | } | |||
2755 | ||||
2756 | obj = PyTuple_GET_ITEM(args, 2*i+1)((((void) (0)), (PyTupleObject *)(args))->ob_item[2*i+1]); | |||
2757 | n = einsum_list_to_subscripts(obj, subscripts+subindex, | |||
2758 | subsize-subindex); | |||
2759 | if (n < 0) { | |||
2760 | goto fail; | |||
2761 | } | |||
2762 | subindex += n; | |||
2763 | } | |||
2764 | ||||
2765 | /* Add the '->' to the string if provided */ | |||
2766 | if (PyTuple_Size(args) == 2*nop+1) { | |||
2767 | PyObject *obj; | |||
2768 | int n; | |||
2769 | ||||
2770 | if (subindex + 2 >= subsize) { | |||
2771 | PyErr_SetString(PyExc_ValueError, | |||
2772 | "subscripts list is too long"); | |||
2773 | goto fail; | |||
2774 | } | |||
2775 | subscripts[subindex++] = '-'; | |||
2776 | subscripts[subindex++] = '>'; | |||
2777 | ||||
2778 | obj = PyTuple_GET_ITEM(args, 2*nop)((((void) (0)), (PyTupleObject *)(args))->ob_item[2*nop]); | |||
2779 | n = einsum_list_to_subscripts(obj, subscripts+subindex, | |||
2780 | subsize-subindex); | |||
2781 | if (n < 0) { | |||
2782 | goto fail; | |||
2783 | } | |||
2784 | subindex += n; | |||
2785 | } | |||
2786 | ||||
2787 | /* NULL-terminate the subscripts string */ | |||
2788 | subscripts[subindex] = '\0'; | |||
2789 | ||||
2790 | return nop; | |||
2791 | ||||
2792 | fail: | |||
2793 | for (i = 0; i < nop; ++i) { | |||
2794 | Py_XDECREF(op[i])_Py_XDECREF(((PyObject*)(op[i]))); | |||
2795 | op[i] = NULL((void*)0); | |||
2796 | } | |||
2797 | ||||
2798 | return -1; | |||
2799 | } | |||
2800 | ||||
2801 | static PyObject * | |||
2802 | array_einsum(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), PyObject *args, PyObject *kwds) | |||
2803 | { | |||
2804 | char *subscripts = NULL((void*)0), subscripts_buffer[256]; | |||
2805 | PyObject *str_obj = NULL((void*)0), *str_key_obj = NULL((void*)0); | |||
2806 | PyObject *arg0; | |||
2807 | int i, nop; | |||
2808 | PyArrayObject *op[NPY_MAXARGS32]; | |||
2809 | NPY_ORDER order = NPY_KEEPORDER; | |||
2810 | NPY_CASTING casting = NPY_SAFE_CASTING; | |||
2811 | PyArrayObject *out = NULL((void*)0); | |||
2812 | PyArray_Descr *dtype = NULL((void*)0); | |||
2813 | PyObject *ret = NULL((void*)0); | |||
2814 | ||||
2815 | if (PyTuple_GET_SIZE(args)(((PyVarObject*)((((void) (0)), (PyTupleObject *)(args))))-> ob_size) < 1) { | |||
2816 | PyErr_SetString(PyExc_ValueError, | |||
2817 | "must specify the einstein sum subscripts string " | |||
2818 | "and at least one operand, or at least one operand " | |||
2819 | "and its corresponding subscripts list"); | |||
2820 | return NULL((void*)0); | |||
2821 | } | |||
2822 | arg0 = PyTuple_GET_ITEM(args, 0)((((void) (0)), (PyTupleObject *)(args))->ob_item[0]); | |||
2823 | ||||
2824 | /* einsum('i,j', a, b), einsum('i,j->ij', a, b) */ | |||
2825 | if (PyBytes_Check(arg0)((((((PyObject*)(arg0))->ob_type))->tp_flags & ((1UL << 27))) != 0) || PyUnicode_Check(arg0)((((((PyObject*)(arg0))->ob_type))->tp_flags & ((1UL << 28))) != 0)) { | |||
2826 | nop = einsum_sub_op_from_str(args, &str_obj, &subscripts, op); | |||
2827 | } | |||
2828 | /* einsum(a, [0], b, [1]), einsum(a, [0], b, [1], [0,1]) */ | |||
2829 | else { | |||
2830 | nop = einsum_sub_op_from_lists(args, subscripts_buffer, | |||
2831 | sizeof(subscripts_buffer), op); | |||
2832 | subscripts = subscripts_buffer; | |||
2833 | } | |||
2834 | if (nop <= 0) { | |||
2835 | goto finish; | |||
2836 | } | |||
2837 | ||||
2838 | /* Get the keyword arguments */ | |||
2839 | if (kwds != NULL((void*)0)) { | |||
2840 | PyObject *key, *value; | |||
2841 | Py_ssize_t pos = 0; | |||
2842 | while (PyDict_Next(kwds, &pos, &key, &value)) { | |||
2843 | char *str = NULL((void*)0); | |||
2844 | ||||
2845 | Py_XDECREF(str_key_obj)_Py_XDECREF(((PyObject*)(str_key_obj))); | |||
2846 | str_key_obj = PyUnicode_AsASCIIString(key); | |||
2847 | if (str_key_obj != NULL((void*)0)) { | |||
2848 | key = str_key_obj; | |||
2849 | } | |||
2850 | ||||
2851 | str = PyBytes_AsString(key); | |||
2852 | ||||
2853 | if (str == NULL((void*)0)) { | |||
2854 | PyErr_Clear(); | |||
2855 | PyErr_SetString(PyExc_TypeError, "invalid keyword"); | |||
2856 | goto finish; | |||
2857 | } | |||
2858 | ||||
2859 | if (strcmp(str,"out") == 0) { | |||
2860 | if (PyArray_Check(value)((((PyObject*)(value))->ob_type) == (&PyArray_Type) || PyType_IsSubtype((((PyObject*)(value))->ob_type), (&PyArray_Type )))) { | |||
2861 | out = (PyArrayObject *)value; | |||
2862 | } | |||
2863 | else { | |||
2864 | PyErr_SetString(PyExc_TypeError, | |||
2865 | "keyword parameter out must be an " | |||
2866 | "array for einsum"); | |||
2867 | goto finish; | |||
2868 | } | |||
2869 | } | |||
2870 | else if (strcmp(str,"order") == 0) { | |||
2871 | if (!PyArray_OrderConverter(value, &order)) { | |||
2872 | goto finish; | |||
2873 | } | |||
2874 | } | |||
2875 | else if (strcmp(str,"casting") == 0) { | |||
2876 | if (!PyArray_CastingConverter(value, &casting)) { | |||
2877 | goto finish; | |||
2878 | } | |||
2879 | } | |||
2880 | else if (strcmp(str,"dtype") == 0) { | |||
2881 | if (!PyArray_DescrConverter2(value, &dtype)) { | |||
2882 | goto finish; | |||
2883 | } | |||
2884 | } | |||
2885 | else { | |||
2886 | PyErr_Format(PyExc_TypeError, | |||
2887 | "'%s' is an invalid keyword for einsum", | |||
2888 | str); | |||
2889 | goto finish; | |||
2890 | } | |||
2891 | } | |||
2892 | } | |||
2893 | ||||
2894 | ret = (PyObject *)PyArray_EinsteinSum(subscripts, nop, op, dtype, | |||
2895 | order, casting, out); | |||
2896 | ||||
2897 | /* If no output was supplied, possibly convert to a scalar */ | |||
2898 | if (ret != NULL((void*)0) && out == NULL((void*)0)) { | |||
2899 | ret = PyArray_Return((PyArrayObject *)ret); | |||
2900 | } | |||
2901 | ||||
2902 | finish: | |||
2903 | for (i = 0; i < nop; ++i) { | |||
2904 | Py_XDECREF(op[i])_Py_XDECREF(((PyObject*)(op[i]))); | |||
2905 | } | |||
2906 | Py_XDECREF(dtype)_Py_XDECREF(((PyObject*)(dtype))); | |||
2907 | Py_XDECREF(str_obj)_Py_XDECREF(((PyObject*)(str_obj))); | |||
2908 | Py_XDECREF(str_key_obj)_Py_XDECREF(((PyObject*)(str_key_obj))); | |||
2909 | /* out is a borrowed reference */ | |||
2910 | ||||
2911 | return ret; | |||
2912 | } | |||
2913 | ||||
2914 | static PyObject * | |||
2915 | array_fastCopyAndTranspose(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), PyObject *args) | |||
2916 | { | |||
2917 | PyObject *a0; | |||
2918 | ||||
2919 | if (!PyArg_ParseTuple_PyArg_ParseTuple_SizeT(args, "O:_fastCopyAndTranspose", &a0)) { | |||
2920 | return NULL((void*)0); | |||
2921 | } | |||
2922 | return PyArray_Return((PyArrayObject *)PyArray_CopyAndTranspose(a0)); | |||
2923 | } | |||
2924 | ||||
2925 | static PyObject * | |||
2926 | array_correlate(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), | |||
2927 | PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames) | |||
2928 | { | |||
2929 | PyObject *shape, *a0; | |||
2930 | int mode = 0; | |||
2931 | NPY_PREPARE_ARGPARSERstatic _NpyArgParserCache __argparse_cache = {-1}; | |||
2932 | ||||
2933 | if (npy_parse_arguments("correlate", args, len_args, kwnames,_npy_parse_arguments("correlate", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &a0, "v", ((void*)0 ), &shape, "|mode", &PyArray_CorrelatemodeConverter, & mode, ((void*)0), ((void*)0), ((void*)0)) | |||
2934 | "a", NULL, &a0,_npy_parse_arguments("correlate", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &a0, "v", ((void*)0 ), &shape, "|mode", &PyArray_CorrelatemodeConverter, & mode, ((void*)0), ((void*)0), ((void*)0)) | |||
2935 | "v", NULL, &shape,_npy_parse_arguments("correlate", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &a0, "v", ((void*)0 ), &shape, "|mode", &PyArray_CorrelatemodeConverter, & mode, ((void*)0), ((void*)0), ((void*)0)) | |||
2936 | "|mode", &PyArray_CorrelatemodeConverter, &mode,_npy_parse_arguments("correlate", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &a0, "v", ((void*)0 ), &shape, "|mode", &PyArray_CorrelatemodeConverter, & mode, ((void*)0), ((void*)0), ((void*)0)) | |||
2937 | NULL, NULL, NULL)_npy_parse_arguments("correlate", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &a0, "v", ((void*)0 ), &shape, "|mode", &PyArray_CorrelatemodeConverter, & mode, ((void*)0), ((void*)0), ((void*)0)) < 0) { | |||
2938 | return NULL((void*)0); | |||
2939 | } | |||
2940 | return PyArray_Correlate(a0, shape, mode); | |||
2941 | } | |||
2942 | ||||
2943 | static PyObject* | |||
2944 | array_correlate2(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), | |||
2945 | PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames) | |||
2946 | { | |||
2947 | PyObject *shape, *a0; | |||
2948 | int mode = 0; | |||
2949 | NPY_PREPARE_ARGPARSERstatic _NpyArgParserCache __argparse_cache = {-1}; | |||
2950 | ||||
2951 | if (npy_parse_arguments("correlate2", args, len_args, kwnames,_npy_parse_arguments("correlate2", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &a0, "v", ((void*)0 ), &shape, "|mode", &PyArray_CorrelatemodeConverter, & mode, ((void*)0), ((void*)0), ((void*)0)) | |||
2952 | "a", NULL, &a0,_npy_parse_arguments("correlate2", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &a0, "v", ((void*)0 ), &shape, "|mode", &PyArray_CorrelatemodeConverter, & mode, ((void*)0), ((void*)0), ((void*)0)) | |||
2953 | "v", NULL, &shape,_npy_parse_arguments("correlate2", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &a0, "v", ((void*)0 ), &shape, "|mode", &PyArray_CorrelatemodeConverter, & mode, ((void*)0), ((void*)0), ((void*)0)) | |||
2954 | "|mode", &PyArray_CorrelatemodeConverter, &mode,_npy_parse_arguments("correlate2", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &a0, "v", ((void*)0 ), &shape, "|mode", &PyArray_CorrelatemodeConverter, & mode, ((void*)0), ((void*)0), ((void*)0)) | |||
2955 | NULL, NULL, NULL)_npy_parse_arguments("correlate2", &__argparse_cache, args , len_args, kwnames, "a", ((void*)0), &a0, "v", ((void*)0 ), &shape, "|mode", &PyArray_CorrelatemodeConverter, & mode, ((void*)0), ((void*)0), ((void*)0)) < 0) { | |||
2956 | return NULL((void*)0); | |||
2957 | } | |||
2958 | return PyArray_Correlate2(a0, shape, mode); | |||
2959 | } | |||
2960 | ||||
2961 | static PyObject * | |||
2962 | array_arange(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), | |||
2963 | PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames) | |||
2964 | { | |||
2965 | PyObject *o_start = NULL((void*)0), *o_stop = NULL((void*)0), *o_step = NULL((void*)0), *range=NULL((void*)0); | |||
2966 | PyArray_Descr *typecode = NULL((void*)0); | |||
2967 | PyObject *like = NULL((void*)0); | |||
2968 | NPY_PREPARE_ARGPARSERstatic _NpyArgParserCache __argparse_cache = {-1}; | |||
2969 | ||||
2970 | if (npy_parse_arguments("arange", args, len_args, kwnames,_npy_parse_arguments("arange", &__argparse_cache, args, len_args , kwnames, "|start", ((void*)0), &o_start, "|stop", ((void *)0), &o_stop, "|step", ((void*)0), &o_step, "|dtype" , &PyArray_DescrConverter2, &typecode, "$like", ((void *)0), &like, ((void*)0), ((void*)0), ((void*)0)) | |||
2971 | "|start", NULL, &o_start,_npy_parse_arguments("arange", &__argparse_cache, args, len_args , kwnames, "|start", ((void*)0), &o_start, "|stop", ((void *)0), &o_stop, "|step", ((void*)0), &o_step, "|dtype" , &PyArray_DescrConverter2, &typecode, "$like", ((void *)0), &like, ((void*)0), ((void*)0), ((void*)0)) | |||
2972 | "|stop", NULL, &o_stop,_npy_parse_arguments("arange", &__argparse_cache, args, len_args , kwnames, "|start", ((void*)0), &o_start, "|stop", ((void *)0), &o_stop, "|step", ((void*)0), &o_step, "|dtype" , &PyArray_DescrConverter2, &typecode, "$like", ((void *)0), &like, ((void*)0), ((void*)0), ((void*)0)) | |||
2973 | "|step", NULL, &o_step,_npy_parse_arguments("arange", &__argparse_cache, args, len_args , kwnames, "|start", ((void*)0), &o_start, "|stop", ((void *)0), &o_stop, "|step", ((void*)0), &o_step, "|dtype" , &PyArray_DescrConverter2, &typecode, "$like", ((void *)0), &like, ((void*)0), ((void*)0), ((void*)0)) | |||
2974 | "|dtype", &PyArray_DescrConverter2, &typecode,_npy_parse_arguments("arange", &__argparse_cache, args, len_args , kwnames, "|start", ((void*)0), &o_start, "|stop", ((void *)0), &o_stop, "|step", ((void*)0), &o_step, "|dtype" , &PyArray_DescrConverter2, &typecode, "$like", ((void *)0), &like, ((void*)0), ((void*)0), ((void*)0)) | |||
2975 | "$like", NULL, &like,_npy_parse_arguments("arange", &__argparse_cache, args, len_args , kwnames, "|start", ((void*)0), &o_start, "|stop", ((void *)0), &o_stop, "|step", ((void*)0), &o_step, "|dtype" , &PyArray_DescrConverter2, &typecode, "$like", ((void *)0), &like, ((void*)0), ((void*)0), ((void*)0)) | |||
2976 | NULL, NULL, NULL)_npy_parse_arguments("arange", &__argparse_cache, args, len_args , kwnames, "|start", ((void*)0), &o_start, "|stop", ((void *)0), &o_stop, "|step", ((void*)0), &o_step, "|dtype" , &PyArray_DescrConverter2, &typecode, "$like", ((void *)0), &like, ((void*)0), ((void*)0), ((void*)0)) < 0) { | |||
2977 | Py_XDECREF(typecode)_Py_XDECREF(((PyObject*)(typecode))); | |||
2978 | return NULL((void*)0); | |||
2979 | } | |||
2980 | if (like != NULL((void*)0)) { | |||
2981 | PyObject *deferred = array_implement_c_array_function_creation( | |||
2982 | "arange", like, NULL((void*)0), NULL((void*)0), args, len_args, kwnames); | |||
2983 | if (deferred != Py_NotImplemented(&_Py_NotImplementedStruct)) { | |||
2984 | Py_XDECREF(typecode)_Py_XDECREF(((PyObject*)(typecode))); | |||
2985 | return deferred; | |||
2986 | } | |||
2987 | } | |||
2988 | ||||
2989 | if (o_stop == NULL((void*)0)) { | |||
2990 | if (len_args == 0){ | |||
2991 | PyErr_SetString(PyExc_TypeError, | |||
2992 | "arange() requires stop to be specified."); | |||
2993 | Py_XDECREF(typecode)_Py_XDECREF(((PyObject*)(typecode))); | |||
2994 | return NULL((void*)0); | |||
2995 | } | |||
2996 | } | |||
2997 | else if (o_start == NULL((void*)0)) { | |||
2998 | o_start = o_stop; | |||
2999 | o_stop = NULL((void*)0); | |||
3000 | } | |||
3001 | ||||
3002 | range = PyArray_ArangeObj(o_start, o_stop, o_step, typecode); | |||
3003 | Py_XDECREF(typecode)_Py_XDECREF(((PyObject*)(typecode))); | |||
3004 | ||||
3005 | return range; | |||
3006 | } | |||
3007 | ||||
3008 | /*NUMPY_API | |||
3009 | * | |||
3010 | * Included at the very first so not auto-grabbed and thus not labeled. | |||
3011 | */ | |||
3012 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) unsigned int | |||
3013 | PyArray_GetNDArrayCVersion(void) | |||
3014 | { | |||
3015 | return (unsigned int)NPY_ABI_VERSION0x01000009; | |||
3016 | } | |||
3017 | ||||
3018 | /*NUMPY_API | |||
3019 | * Returns the built-in (at compilation time) C API version | |||
3020 | */ | |||
3021 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) unsigned int | |||
3022 | PyArray_GetNDArrayCFeatureVersion(void) | |||
3023 | { | |||
3024 | return (unsigned int)NPY_API_VERSION0x0000000E; | |||
3025 | } | |||
3026 | ||||
3027 | static PyObject * | |||
3028 | array__get_ndarray_c_version(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), PyObject *args, PyObject *kwds) | |||
3029 | { | |||
3030 | static char *kwlist[] = {NULL((void*)0)}; | |||
3031 | ||||
3032 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, kwds, "", kwlist )) { | |||
3033 | return NULL((void*)0); | |||
3034 | } | |||
3035 | return PyLong_FromLong( (long) PyArray_GetNDArrayCVersion() ); | |||
3036 | } | |||
3037 | ||||
3038 | /*NUMPY_API | |||
3039 | */ | |||
3040 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int | |||
3041 | PyArray_GetEndianness(void) | |||
3042 | { | |||
3043 | const union { | |||
3044 | npy_uint32 i; | |||
3045 | char c[4]; | |||
3046 | } bint = {0x01020304}; | |||
3047 | ||||
3048 | if (bint.c[0] == 1) { | |||
3049 | return NPY_CPU_BIG; | |||
3050 | } | |||
3051 | else if (bint.c[0] == 4) { | |||
3052 | return NPY_CPU_LITTLE; | |||
3053 | } | |||
3054 | else { | |||
3055 | return NPY_CPU_UNKNOWN_ENDIAN; | |||
3056 | } | |||
3057 | } | |||
3058 | ||||
3059 | static PyObject * | |||
3060 | array__reconstruct(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), PyObject *args) | |||
3061 | { | |||
3062 | ||||
3063 | PyObject *ret; | |||
3064 | PyTypeObject *subtype; | |||
3065 | PyArray_Dims shape = {NULL((void*)0), 0}; | |||
3066 | PyArray_Descr *dtype = NULL((void*)0); | |||
3067 | ||||
3068 | evil_global_disable_warn_O4O8_flag = 1; | |||
3069 | ||||
3070 | if (!PyArg_ParseTuple_PyArg_ParseTuple_SizeT(args, "O!O&O&:_reconstruct", | |||
3071 | &PyType_Type, &subtype, | |||
3072 | PyArray_IntpConverter, &shape, | |||
3073 | PyArray_DescrConverter, &dtype)) { | |||
3074 | goto fail; | |||
3075 | } | |||
3076 | if (!PyType_IsSubtype(subtype, &PyArray_Type)) { | |||
3077 | PyErr_SetString(PyExc_TypeError, | |||
3078 | "_reconstruct: First argument must be a sub-type of ndarray"); | |||
3079 | goto fail; | |||
3080 | } | |||
3081 | ret = PyArray_NewFromDescr(subtype, dtype, | |||
3082 | (int)shape.len, shape.ptr, NULL((void*)0), NULL((void*)0), 0, NULL((void*)0)); | |||
3083 | npy_free_cache_dim_obj(shape); | |||
3084 | ||||
3085 | evil_global_disable_warn_O4O8_flag = 0; | |||
3086 | ||||
3087 | return ret; | |||
3088 | ||||
3089 | fail: | |||
3090 | evil_global_disable_warn_O4O8_flag = 0; | |||
3091 | ||||
3092 | Py_XDECREF(dtype)_Py_XDECREF(((PyObject*)(dtype))); | |||
3093 | npy_free_cache_dim_obj(shape); | |||
3094 | return NULL((void*)0); | |||
3095 | } | |||
3096 | ||||
3097 | static PyObject * | |||
3098 | array_set_string_function(PyObject *NPY_UNUSED(self)(__NPY_UNUSED_TAGGEDself) __attribute__ ((__unused__)), PyObject *args, | |||
3099 | PyObject *kwds) | |||
3100 | { | |||
3101 | PyObject *op = NULL((void*)0); | |||
3102 | int repr = 1; | |||
3103 | static char *kwlist[] = {"f", "repr", NULL((void*)0)}; | |||
3104 | ||||
3105 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, kwds, "|Oi:set_string_function", kwlist, &op, &repr)) { | |||
3106 | return NULL((void*)0); | |||
3107 | } | |||
3108 | /* reset the array_repr function to built-in */ | |||
3109 | if (op == Py_None(&_Py_NoneStruct)) { | |||
3110 | op = NULL((void*)0); | |||
3111 | } | |||
3112 | if (op != NULL((void*)0) && !PyCallable_Check(op)) { | |||
3113 | PyErr_SetString(PyExc_TypeError, | |||
3114 | "Argument must be callable."); | |||
3115 | return NULL((void*)0); | |||
3116 | } | |||
3117 | PyArray_SetStringFunction(op, repr); | |||
3118 | Py_RETURN_NONEreturn _Py_INCREF(((PyObject*)((&_Py_NoneStruct)))), (& _Py_NoneStruct); | |||
3119 | } | |||
3120 | ||||
3121 | static PyObject * | |||
3122 | array_set_ops_function(PyObject *NPY_UNUSED(self)(__NPY_UNUSED_TAGGEDself) __attribute__ ((__unused__)), PyObject *NPY_UNUSED(args)(__NPY_UNUSED_TAGGEDargs) __attribute__ ((__unused__)), | |||
3123 | PyObject *kwds) | |||
3124 | { | |||
3125 | PyObject *oldops = NULL((void*)0); | |||
3126 | ||||
3127 | if ((oldops = _PyArray_GetNumericOps()) == NULL((void*)0)) { | |||
3128 | return NULL((void*)0); | |||
3129 | } | |||
3130 | /* | |||
3131 | * Should probably ensure that objects are at least callable | |||
3132 | * Leave this to the caller for now --- error will be raised | |||
3133 | * later when use is attempted | |||
3134 | */ | |||
3135 | if (kwds && PyArray_SetNumericOps(kwds) == -1) { | |||
3136 | Py_DECREF(oldops)_Py_DECREF(((PyObject*)(oldops))); | |||
3137 | if (PyErr_Occurred() == NULL((void*)0)) { | |||
3138 | PyErr_SetString(PyExc_ValueError, | |||
3139 | "one or more objects not callable"); | |||
3140 | } | |||
3141 | return NULL((void*)0); | |||
3142 | } | |||
3143 | return oldops; | |||
3144 | } | |||
3145 | ||||
3146 | static PyObject * | |||
3147 | array_set_datetimeparse_function(PyObject *NPY_UNUSED(self)(__NPY_UNUSED_TAGGEDself) __attribute__ ((__unused__)), | |||
3148 | PyObject *NPY_UNUSED(args)(__NPY_UNUSED_TAGGEDargs) __attribute__ ((__unused__)), PyObject *NPY_UNUSED(kwds)(__NPY_UNUSED_TAGGEDkwds) __attribute__ ((__unused__))) | |||
3149 | { | |||
3150 | PyErr_SetString(PyExc_RuntimeError, "This function has been removed"); | |||
3151 | return NULL((void*)0); | |||
3152 | } | |||
3153 | ||||
3154 | /* | |||
3155 | * inner loop with constant size memcpy arguments | |||
3156 | * this allows the compiler to replace function calls while still handling the | |||
3157 | * alignment requirements of the platform. | |||
3158 | */ | |||
3159 | #define INNER_WHERE_LOOP(size) \ | |||
3160 | do { \ | |||
3161 | npy_intp i; \ | |||
3162 | for (i = 0; i < n; i++) { \ | |||
3163 | if (*csrc) { \ | |||
3164 | memcpy(dst, xsrc, size); \ | |||
3165 | } \ | |||
3166 | else { \ | |||
3167 | memcpy(dst, ysrc, size); \ | |||
3168 | } \ | |||
3169 | dst += size; \ | |||
3170 | xsrc += xstride; \ | |||
3171 | ysrc += ystride; \ | |||
3172 | csrc += cstride; \ | |||
3173 | } \ | |||
3174 | } while(0) | |||
3175 | ||||
3176 | ||||
3177 | /*NUMPY_API | |||
3178 | * Where | |||
3179 | */ | |||
3180 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | |||
3181 | PyArray_Where(PyObject *condition, PyObject *x, PyObject *y) | |||
3182 | { | |||
3183 | PyArrayObject *arr, *ax, *ay; | |||
3184 | PyObject *ret = NULL((void*)0); | |||
3185 | ||||
3186 | arr = (PyArrayObject *)PyArray_FROM_O(condition)PyArray_FromAny(condition, ((void*)0), 0, 0, 0, ((void*)0)); | |||
3187 | if (arr == NULL((void*)0)) { | |||
3188 | return NULL((void*)0); | |||
3189 | } | |||
3190 | if ((x == NULL((void*)0)) && (y == NULL((void*)0))) { | |||
3191 | ret = PyArray_Nonzero(arr); | |||
3192 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | |||
3193 | return ret; | |||
3194 | } | |||
3195 | if ((x == NULL((void*)0)) || (y == NULL((void*)0))) { | |||
3196 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | |||
3197 | PyErr_SetString(PyExc_ValueError, | |||
3198 | "either both or neither of x and y should be given"); | |||
3199 | return NULL((void*)0); | |||
3200 | } | |||
3201 | ||||
3202 | ax = (PyArrayObject*)PyArray_FROM_O(x)PyArray_FromAny(x, ((void*)0), 0, 0, 0, ((void*)0)); | |||
3203 | ay = (PyArrayObject*)PyArray_FROM_O(y)PyArray_FromAny(y, ((void*)0), 0, 0, 0, ((void*)0)); | |||
3204 | if (ax == NULL((void*)0) || ay == NULL((void*)0)) { | |||
3205 | goto fail; | |||
3206 | } | |||
3207 | else { | |||
3208 | npy_uint32 flags = NPY_ITER_EXTERNAL_LOOP0x00000008 | NPY_ITER_BUFFERED0x00000200 | | |||
3209 | NPY_ITER_REFS_OK0x00000020 | NPY_ITER_ZEROSIZE_OK0x00000040; | |||
3210 | PyArrayObject * op_in[4] = { | |||
3211 | NULL((void*)0), arr, ax, ay | |||
3212 | }; | |||
3213 | npy_uint32 op_flags[4] = { | |||
3214 | NPY_ITER_WRITEONLY0x00040000 | NPY_ITER_ALLOCATE0x01000000 | NPY_ITER_NO_SUBTYPE0x02000000, | |||
3215 | NPY_ITER_READONLY0x00020000, NPY_ITER_READONLY0x00020000, NPY_ITER_READONLY0x00020000 | |||
3216 | }; | |||
3217 | PyArray_Descr * common_dt = PyArray_ResultType(2, &op_in[0] + 2, | |||
3218 | 0, NULL((void*)0)); | |||
3219 | PyArray_Descr * op_dt[4] = {common_dt, PyArray_DescrFromType(NPY_BOOL), | |||
3220 | common_dt, common_dt}; | |||
3221 | NpyIter * iter; | |||
3222 | int needs_api; | |||
3223 | NPY_BEGIN_THREADS_DEFPyThreadState *_save=((void*)0);; | |||
3224 | ||||
3225 | if (common_dt == NULL((void*)0) || op_dt[1] == NULL((void*)0)) { | |||
3226 | Py_XDECREF(op_dt[1])_Py_XDECREF(((PyObject*)(op_dt[1]))); | |||
3227 | Py_XDECREF(common_dt)_Py_XDECREF(((PyObject*)(common_dt))); | |||
3228 | goto fail; | |||
3229 | } | |||
3230 | iter = NpyIter_MultiNew(4, op_in, flags, | |||
3231 | NPY_KEEPORDER, NPY_UNSAFE_CASTING, | |||
3232 | op_flags, op_dt); | |||
3233 | Py_DECREF(op_dt[1])_Py_DECREF(((PyObject*)(op_dt[1]))); | |||
3234 | Py_DECREF(common_dt)_Py_DECREF(((PyObject*)(common_dt))); | |||
3235 | if (iter == NULL((void*)0)) { | |||
3236 | goto fail; | |||
3237 | } | |||
3238 | ||||
3239 | needs_api = NpyIter_IterationNeedsAPI(iter); | |||
3240 | ||||
3241 | /* Get the result from the iterator object array */ | |||
3242 | ret = (PyObject*)NpyIter_GetOperandArray(iter)[0]; | |||
3243 | ||||
3244 | NPY_BEGIN_THREADS_NDITER(iter)do { if (!NpyIter_IterationNeedsAPI(iter)) { do { if ((NpyIter_GetIterSize (iter)) > 500) { _save = PyEval_SaveThread();} } while (0) ;; } } while(0); | |||
3245 | ||||
3246 | if (NpyIter_GetIterSize(iter) != 0) { | |||
3247 | NpyIter_IterNextFunc *iternext = NpyIter_GetIterNext(iter, NULL((void*)0)); | |||
3248 | npy_intp * innersizeptr = NpyIter_GetInnerLoopSizePtr(iter); | |||
3249 | char **dataptrarray = NpyIter_GetDataPtrArray(iter); | |||
3250 | ||||
3251 | do { | |||
3252 | PyArray_Descr * dtx = NpyIter_GetDescrArray(iter)[2]; | |||
3253 | PyArray_Descr * dty = NpyIter_GetDescrArray(iter)[3]; | |||
3254 | int axswap = PyDataType_ISBYTESWAPPED(dtx)(!((((PyArray_Descr *)(dtx))->byteorder) != '>')); | |||
3255 | int ayswap = PyDataType_ISBYTESWAPPED(dty)(!((((PyArray_Descr *)(dty))->byteorder) != '>')); | |||
3256 | PyArray_CopySwapFunc *copyswapx = dtx->f->copyswap; | |||
3257 | PyArray_CopySwapFunc *copyswapy = dty->f->copyswap; | |||
3258 | int native = (axswap == ayswap) && (axswap == 0) && !needs_api; | |||
3259 | npy_intp n = (*innersizeptr); | |||
3260 | npy_intp itemsize = NpyIter_GetDescrArray(iter)[0]->elsize; | |||
3261 | npy_intp cstride = NpyIter_GetInnerStrideArray(iter)[1]; | |||
3262 | npy_intp xstride = NpyIter_GetInnerStrideArray(iter)[2]; | |||
3263 | npy_intp ystride = NpyIter_GetInnerStrideArray(iter)[3]; | |||
3264 | char * dst = dataptrarray[0]; | |||
3265 | char * csrc = dataptrarray[1]; | |||
3266 | char * xsrc = dataptrarray[2]; | |||
3267 | char * ysrc = dataptrarray[3]; | |||
3268 | ||||
3269 | /* constant sizes so compiler replaces memcpy */ | |||
3270 | if (native && itemsize == 16) { | |||
3271 | INNER_WHERE_LOOP(16); | |||
3272 | } | |||
3273 | else if (native && itemsize == 8) { | |||
3274 | INNER_WHERE_LOOP(8); | |||
3275 | } | |||
3276 | else if (native && itemsize == 4) { | |||
3277 | INNER_WHERE_LOOP(4); | |||
3278 | } | |||
3279 | else if (native && itemsize == 2) { | |||
3280 | INNER_WHERE_LOOP(2); | |||
3281 | } | |||
3282 | else if (native && itemsize == 1) { | |||
3283 | INNER_WHERE_LOOP(1); | |||
3284 | } | |||
3285 | else { | |||
3286 | /* copyswap is faster than memcpy even if we are native */ | |||
3287 | npy_intp i; | |||
3288 | for (i = 0; i < n; i++) { | |||
3289 | if (*csrc) { | |||
3290 | copyswapx(dst, xsrc, axswap, ret); | |||
3291 | } | |||
3292 | else { | |||
3293 | copyswapy(dst, ysrc, ayswap, ret); | |||
3294 | } | |||
3295 | dst += itemsize; | |||
3296 | xsrc += xstride; | |||
3297 | ysrc += ystride; | |||
3298 | csrc += cstride; | |||
3299 | } | |||
3300 | } | |||
3301 | } while (iternext(iter)); | |||
3302 | } | |||
3303 | ||||
3304 | NPY_END_THREADSdo { if (_save) { PyEval_RestoreThread(_save); _save = ((void *)0);} } while (0);; | |||
3305 | ||||
3306 | Py_INCREF(ret)_Py_INCREF(((PyObject*)(ret))); | |||
3307 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | |||
3308 | Py_DECREF(ax)_Py_DECREF(((PyObject*)(ax))); | |||
3309 | Py_DECREF(ay)_Py_DECREF(((PyObject*)(ay))); | |||
3310 | ||||
3311 | if (NpyIter_Deallocate(iter) != NPY_SUCCEED1) { | |||
3312 | Py_DECREF(ret)_Py_DECREF(((PyObject*)(ret))); | |||
3313 | return NULL((void*)0); | |||
3314 | } | |||
3315 | ||||
3316 | return ret; | |||
3317 | } | |||
3318 | ||||
3319 | fail: | |||
3320 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | |||
3321 | Py_XDECREF(ax)_Py_XDECREF(((PyObject*)(ax))); | |||
3322 | Py_XDECREF(ay)_Py_XDECREF(((PyObject*)(ay))); | |||
3323 | return NULL((void*)0); | |||
3324 | } | |||
3325 | ||||
3326 | #undef INNER_WHERE_LOOP | |||
3327 | ||||
3328 | static PyObject * | |||
3329 | array_where(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), PyObject *args) | |||
3330 | { | |||
3331 | PyObject *obj = NULL((void*)0), *x = NULL((void*)0), *y = NULL((void*)0); | |||
3332 | ||||
3333 | if (!PyArg_ParseTuple_PyArg_ParseTuple_SizeT(args, "O|OO:where", &obj, &x, &y)) { | |||
3334 | return NULL((void*)0); | |||
3335 | } | |||
3336 | return PyArray_Where(obj, x, y); | |||
3337 | } | |||
3338 | ||||
3339 | static PyObject * | |||
3340 | array_lexsort(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), PyObject *args, PyObject *kwds) | |||
3341 | { | |||
3342 | int axis = -1; | |||
3343 | PyObject *obj; | |||
3344 | static char *kwlist[] = {"keys", "axis", NULL((void*)0)}; | |||
3345 | ||||
3346 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, kwds, "O|i:lexsort", kwlist, &obj, &axis)) { | |||
3347 | return NULL((void*)0); | |||
3348 | } | |||
3349 | return PyArray_Return((PyArrayObject *)PyArray_LexSort(obj, axis)); | |||
3350 | } | |||
3351 | ||||
3352 | static PyObject * | |||
3353 | array_can_cast_safely(PyObject *NPY_UNUSED(self)(__NPY_UNUSED_TAGGEDself) __attribute__ ((__unused__)), PyObject *args, | |||
3354 | PyObject *kwds) | |||
3355 | { | |||
3356 | PyObject *from_obj = NULL((void*)0); | |||
3357 | PyArray_Descr *d1 = NULL((void*)0); | |||
3358 | PyArray_Descr *d2 = NULL((void*)0); | |||
3359 | int ret; | |||
3360 | PyObject *retobj = NULL((void*)0); | |||
3361 | NPY_CASTING casting = NPY_SAFE_CASTING; | |||
3362 | static char *kwlist[] = {"from_", "to", "casting", NULL((void*)0)}; | |||
3363 | ||||
3364 | if(!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, kwds, "OO&|O&:can_cast", kwlist, | |||
3365 | &from_obj, | |||
3366 | PyArray_DescrConverter2, &d2, | |||
3367 | PyArray_CastingConverter, &casting)) { | |||
3368 | goto finish; | |||
3369 | } | |||
3370 | if (d2 == NULL((void*)0)) { | |||
3371 | PyErr_SetString(PyExc_TypeError, | |||
3372 | "did not understand one of the types; 'None' not accepted"); | |||
3373 | goto finish; | |||
3374 | } | |||
3375 | ||||
3376 | /* If the first parameter is an object or scalar, use CanCastArrayTo */ | |||
3377 | if (PyArray_Check(from_obj)((((PyObject*)(from_obj))->ob_type) == (&PyArray_Type) || PyType_IsSubtype((((PyObject*)(from_obj))->ob_type), ( &PyArray_Type)))) { | |||
3378 | ret = PyArray_CanCastArrayTo((PyArrayObject *)from_obj, d2, casting); | |||
3379 | } | |||
3380 | else if (PyArray_IsScalar(from_obj, Generic)(((((PyObject*)(from_obj))->ob_type) == (&PyGenericArrType_Type ) || PyType_IsSubtype((((PyObject*)(from_obj))->ob_type), ( &PyGenericArrType_Type)))) || | |||
3381 | PyArray_IsPythonNumber(from_obj)(((((PyObject*)(from_obj))->ob_type) == (&PyFloat_Type ) || PyType_IsSubtype((((PyObject*)(from_obj))->ob_type), ( &PyFloat_Type))) || ((((PyObject*)(from_obj))->ob_type ) == (&PyComplex_Type) || PyType_IsSubtype((((PyObject*)( from_obj))->ob_type), (&PyComplex_Type))) || ((((((PyObject *)(from_obj))->ob_type))->tp_flags & ((1UL << 24))) != 0) || ((((PyObject*)(from_obj))->ob_type) == & PyBool_Type))) { | |||
3382 | PyArrayObject *arr; | |||
3383 | arr = (PyArrayObject *)PyArray_FROM_O(from_obj)PyArray_FromAny(from_obj, ((void*)0), 0, 0, 0, ((void*)0)); | |||
3384 | if (arr == NULL((void*)0)) { | |||
3385 | goto finish; | |||
3386 | } | |||
3387 | ret = PyArray_CanCastArrayTo(arr, d2, casting); | |||
3388 | Py_DECREF(arr)_Py_DECREF(((PyObject*)(arr))); | |||
3389 | } | |||
3390 | /* Otherwise use CanCastTypeTo */ | |||
3391 | else { | |||
3392 | if (!PyArray_DescrConverter2(from_obj, &d1) || d1 == NULL((void*)0)) { | |||
3393 | PyErr_SetString(PyExc_TypeError, | |||
3394 | "did not understand one of the types; 'None' not accepted"); | |||
3395 | goto finish; | |||
3396 | } | |||
3397 | ret = PyArray_CanCastTypeTo(d1, d2, casting); | |||
3398 | } | |||
3399 | ||||
3400 | retobj = ret ? Py_True((PyObject *) &_Py_TrueStruct) : Py_False((PyObject *) &_Py_FalseStruct); | |||
3401 | Py_INCREF(retobj)_Py_INCREF(((PyObject*)(retobj))); | |||
3402 | ||||
3403 | finish: | |||
3404 | Py_XDECREF(d1)_Py_XDECREF(((PyObject*)(d1))); | |||
3405 | Py_XDECREF(d2)_Py_XDECREF(((PyObject*)(d2))); | |||
3406 | return retobj; | |||
3407 | } | |||
3408 | ||||
3409 | static PyObject * | |||
3410 | array_promote_types(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), PyObject *args) | |||
3411 | { | |||
3412 | PyArray_Descr *d1 = NULL((void*)0); | |||
3413 | PyArray_Descr *d2 = NULL((void*)0); | |||
3414 | PyObject *ret = NULL((void*)0); | |||
3415 | if (!PyArg_ParseTuple_PyArg_ParseTuple_SizeT(args, "O&O&:promote_types", | |||
3416 | PyArray_DescrConverter2, &d1, PyArray_DescrConverter2, &d2)) { | |||
3417 | goto finish; | |||
3418 | } | |||
3419 | ||||
3420 | if (d1 == NULL((void*)0) || d2 == NULL((void*)0)) { | |||
3421 | PyErr_SetString(PyExc_TypeError, | |||
3422 | "did not understand one of the types"); | |||
3423 | goto finish; | |||
3424 | } | |||
3425 | ||||
3426 | ret = (PyObject *)PyArray_PromoteTypes(d1, d2); | |||
3427 | ||||
3428 | finish: | |||
3429 | Py_XDECREF(d1)_Py_XDECREF(((PyObject*)(d1))); | |||
3430 | Py_XDECREF(d2)_Py_XDECREF(((PyObject*)(d2))); | |||
3431 | return ret; | |||
3432 | } | |||
3433 | ||||
3434 | static PyObject * | |||
3435 | array_min_scalar_type(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), PyObject *args) | |||
3436 | { | |||
3437 | PyObject *array_in = NULL((void*)0); | |||
3438 | PyArrayObject *array; | |||
3439 | PyObject *ret = NULL((void*)0); | |||
3440 | ||||
3441 | if (!PyArg_ParseTuple_PyArg_ParseTuple_SizeT(args, "O:min_scalar_type", &array_in)) { | |||
3442 | return NULL((void*)0); | |||
3443 | } | |||
3444 | ||||
3445 | array = (PyArrayObject *)PyArray_FROM_O(array_in)PyArray_FromAny(array_in, ((void*)0), 0, 0, 0, ((void*)0)); | |||
3446 | if (array == NULL((void*)0)) { | |||
3447 | return NULL((void*)0); | |||
3448 | } | |||
3449 | ||||
3450 | ret = (PyObject *)PyArray_MinScalarType(array); | |||
3451 | Py_DECREF(array)_Py_DECREF(((PyObject*)(array))); | |||
3452 | return ret; | |||
3453 | } | |||
3454 | ||||
3455 | static PyObject * | |||
3456 | array_result_type(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), PyObject *args) | |||
3457 | { | |||
3458 | npy_intp i, len, narr = 0, ndtypes = 0; | |||
3459 | PyArrayObject **arr = NULL((void*)0); | |||
3460 | PyArray_Descr **dtypes = NULL((void*)0); | |||
3461 | PyObject *ret = NULL((void*)0); | |||
3462 | ||||
3463 | len = PyTuple_GET_SIZE(args)(((PyVarObject*)((((void) (0)), (PyTupleObject *)(args))))-> ob_size); | |||
3464 | if (len == 0) { | |||
3465 | PyErr_SetString(PyExc_ValueError, | |||
3466 | "at least one array or dtype is required"); | |||
3467 | goto finish; | |||
3468 | } | |||
3469 | ||||
3470 | arr = PyArray_mallocPyMem_RawMalloc(2 * len * sizeof(void *)); | |||
3471 | if (arr == NULL((void*)0)) { | |||
3472 | return PyErr_NoMemory(); | |||
3473 | } | |||
3474 | dtypes = (PyArray_Descr**)&arr[len]; | |||
3475 | ||||
3476 | for (i = 0; i < len; ++i) { | |||
3477 | PyObject *obj = PyTuple_GET_ITEM(args, i)((((void) (0)), (PyTupleObject *)(args))->ob_item[i]); | |||
3478 | if (PyArray_Check(obj)((((PyObject*)(obj))->ob_type) == (&PyArray_Type) || PyType_IsSubtype ((((PyObject*)(obj))->ob_type), (&PyArray_Type)))) { | |||
3479 | Py_INCREF(obj)_Py_INCREF(((PyObject*)(obj))); | |||
3480 | arr[narr] = (PyArrayObject *)obj; | |||
3481 | ++narr; | |||
3482 | } | |||
3483 | else if (PyArray_IsScalar(obj, Generic)(((((PyObject*)(obj))->ob_type) == (&PyGenericArrType_Type ) || PyType_IsSubtype((((PyObject*)(obj))->ob_type), (& PyGenericArrType_Type)))) || | |||
3484 | PyArray_IsPythonNumber(obj)(((((PyObject*)(obj))->ob_type) == (&PyFloat_Type) || PyType_IsSubtype ((((PyObject*)(obj))->ob_type), (&PyFloat_Type))) || ( (((PyObject*)(obj))->ob_type) == (&PyComplex_Type) || PyType_IsSubtype ((((PyObject*)(obj))->ob_type), (&PyComplex_Type))) || ((((((PyObject*)(obj))->ob_type))->tp_flags & ((1UL << 24))) != 0) || ((((PyObject*)(obj))->ob_type) == &PyBool_Type))) { | |||
3485 | arr[narr] = (PyArrayObject *)PyArray_FROM_O(obj)PyArray_FromAny(obj, ((void*)0), 0, 0, 0, ((void*)0)); | |||
3486 | if (arr[narr] == NULL((void*)0)) { | |||
3487 | goto finish; | |||
3488 | } | |||
3489 | if (PyLong_CheckExact(obj)((((PyObject*)(obj))->ob_type) == &PyLong_Type) || PyFloat_CheckExact(obj)((((PyObject*)(obj))->ob_type) == &PyFloat_Type) || | |||
3490 | PyComplex_CheckExact(obj)((((PyObject*)(obj))->ob_type) == &PyComplex_Type)) { | |||
3491 | ((PyArrayObject_fields *)arr[narr])->flags |= _NPY_ARRAY_WAS_PYSCALAR0x0040; | |||
3492 | } | |||
3493 | ++narr; | |||
3494 | } | |||
3495 | else { | |||
3496 | if (!PyArray_DescrConverter(obj, &dtypes[ndtypes])) { | |||
3497 | goto finish; | |||
3498 | } | |||
3499 | ++ndtypes; | |||
3500 | } | |||
3501 | } | |||
3502 | ||||
3503 | ret = (PyObject *)PyArray_ResultType(narr, arr, ndtypes, dtypes); | |||
3504 | ||||
3505 | finish: | |||
3506 | for (i = 0; i < narr; ++i) { | |||
3507 | Py_DECREF(arr[i])_Py_DECREF(((PyObject*)(arr[i]))); | |||
3508 | } | |||
3509 | for (i = 0; i < ndtypes; ++i) { | |||
3510 | Py_DECREF(dtypes[i])_Py_DECREF(((PyObject*)(dtypes[i]))); | |||
3511 | } | |||
3512 | PyArray_freePyMem_RawFree(arr); | |||
3513 | return ret; | |||
3514 | } | |||
3515 | ||||
3516 | static PyObject * | |||
3517 | array_datetime_data(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), PyObject *args) | |||
3518 | { | |||
3519 | PyArray_Descr *dtype; | |||
3520 | PyArray_DatetimeMetaData *meta; | |||
3521 | ||||
3522 | if (!PyArg_ParseTuple_PyArg_ParseTuple_SizeT(args, "O&:datetime_data", | |||
3523 | PyArray_DescrConverter, &dtype)) { | |||
3524 | return NULL((void*)0); | |||
3525 | } | |||
3526 | ||||
3527 | meta = get_datetime_metadata_from_dtype(dtype); | |||
3528 | if (meta == NULL((void*)0)) { | |||
3529 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); | |||
3530 | return NULL((void*)0); | |||
3531 | } | |||
3532 | ||||
3533 | PyObject *res = convert_datetime_metadata_to_tuple(meta); | |||
3534 | Py_DECREF(dtype)_Py_DECREF(((PyObject*)(dtype))); | |||
3535 | return res; | |||
3536 | } | |||
3537 | ||||
3538 | ||||
3539 | static int | |||
3540 | trimmode_converter(PyObject *obj, TrimMode *trim) | |||
3541 | { | |||
3542 | if (!PyUnicode_Check(obj)((((((PyObject*)(obj))->ob_type))->tp_flags & ((1UL << 28))) != 0) || PyUnicode_GetLength(obj) != 1) { | |||
3543 | goto error; | |||
3544 | } | |||
3545 | const char *trimstr = PyUnicode_AsUTF8AndSize(obj, NULL((void*)0)); | |||
3546 | ||||
3547 | if (trimstr != NULL((void*)0)) { | |||
3548 | if (trimstr[0] == 'k') { | |||
3549 | *trim = TrimMode_None; | |||
3550 | } | |||
3551 | else if (trimstr[0] == '.') { | |||
3552 | *trim = TrimMode_Zeros; | |||
3553 | } | |||
3554 | else if (trimstr[0] == '0') { | |||
3555 | *trim = TrimMode_LeaveOneZero; | |||
3556 | } | |||
3557 | else if (trimstr[0] == '-') { | |||
3558 | *trim = TrimMode_DptZeros; | |||
3559 | } | |||
3560 | else { | |||
3561 | goto error; | |||
3562 | } | |||
3563 | } | |||
3564 | return NPY_SUCCEED1; | |||
3565 | ||||
3566 | error: | |||
3567 | PyErr_Format(PyExc_TypeError, | |||
3568 | "if supplied, trim must be 'k', '.', '0' or '-' found `%100S`", | |||
3569 | obj); | |||
3570 | return NPY_FAIL0; | |||
3571 | } | |||
3572 | ||||
3573 | ||||
3574 | /* | |||
3575 | * Prints floating-point scalars using the Dragon4 algorithm, scientific mode. | |||
3576 | * See docstring of `np.format_float_scientific` for description of arguments. | |||
3577 | * The differences is that a value of -1 is valid for pad_left, exp_digits, | |||
3578 | * precision, which is equivalent to `None`. | |||
3579 | */ | |||
3580 | static PyObject * | |||
3581 | dragon4_scientific(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), | |||
3582 | PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames) | |||
3583 | { | |||
3584 | PyObject *obj; | |||
3585 | int precision=-1, pad_left=-1, exp_digits=-1, min_digits=-1; | |||
3586 | DigitMode digit_mode; | |||
3587 | TrimMode trim = TrimMode_None; | |||
3588 | int sign=0, unique=1; | |||
3589 | NPY_PREPARE_ARGPARSERstatic _NpyArgParserCache __argparse_cache = {-1}; | |||
3590 | ||||
3591 | if (npy_parse_arguments("dragon4_scientific", args, len_args, kwnames,_npy_parse_arguments("dragon4_scientific", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|exp_digits", &PyArray_PythonPyIntFromInt, & exp_digits, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3592 | "x", NULL , &obj,_npy_parse_arguments("dragon4_scientific", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|exp_digits", &PyArray_PythonPyIntFromInt, & exp_digits, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3593 | "|precision", &PyArray_PythonPyIntFromInt, &precision,_npy_parse_arguments("dragon4_scientific", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|exp_digits", &PyArray_PythonPyIntFromInt, & exp_digits, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3594 | "|unique", &PyArray_PythonPyIntFromInt, &unique,_npy_parse_arguments("dragon4_scientific", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|exp_digits", &PyArray_PythonPyIntFromInt, & exp_digits, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3595 | "|sign", &PyArray_PythonPyIntFromInt, &sign,_npy_parse_arguments("dragon4_scientific", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|exp_digits", &PyArray_PythonPyIntFromInt, & exp_digits, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3596 | "|trim", &trimmode_converter, &trim,_npy_parse_arguments("dragon4_scientific", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|exp_digits", &PyArray_PythonPyIntFromInt, & exp_digits, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3597 | "|pad_left", &PyArray_PythonPyIntFromInt, &pad_left,_npy_parse_arguments("dragon4_scientific", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|exp_digits", &PyArray_PythonPyIntFromInt, & exp_digits, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3598 | "|exp_digits", &PyArray_PythonPyIntFromInt, &exp_digits,_npy_parse_arguments("dragon4_scientific", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|exp_digits", &PyArray_PythonPyIntFromInt, & exp_digits, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3599 | "|min_digits", &PyArray_PythonPyIntFromInt, &min_digits,_npy_parse_arguments("dragon4_scientific", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|exp_digits", &PyArray_PythonPyIntFromInt, & exp_digits, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3600 | NULL, NULL, NULL)_npy_parse_arguments("dragon4_scientific", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|exp_digits", &PyArray_PythonPyIntFromInt, & exp_digits, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) < 0) { | |||
3601 | return NULL((void*)0); | |||
3602 | } | |||
3603 | ||||
3604 | digit_mode = unique ? DigitMode_Unique : DigitMode_Exact; | |||
3605 | ||||
3606 | if (unique == 0 && precision < 0) { | |||
3607 | PyErr_SetString(PyExc_TypeError, | |||
3608 | "in non-unique mode `precision` must be supplied"); | |||
3609 | return NULL((void*)0); | |||
3610 | } | |||
3611 | ||||
3612 | return Dragon4_Scientific(obj, digit_mode, precision, min_digits, sign, trim, | |||
3613 | pad_left, exp_digits); | |||
3614 | } | |||
3615 | ||||
3616 | /* | |||
3617 | * Prints floating-point scalars using the Dragon4 algorithm, positional mode. | |||
3618 | * See docstring of `np.format_float_positional` for description of arguments. | |||
3619 | * The differences is that a value of -1 is valid for pad_left, pad_right, | |||
3620 | * precision, which is equivalent to `None`. | |||
3621 | */ | |||
3622 | static PyObject * | |||
3623 | dragon4_positional(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), | |||
3624 | PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames) | |||
3625 | { | |||
3626 | PyObject *obj; | |||
3627 | int precision=-1, pad_left=-1, pad_right=-1, min_digits=-1; | |||
3628 | CutoffMode cutoff_mode; | |||
3629 | DigitMode digit_mode; | |||
3630 | TrimMode trim = TrimMode_None; | |||
3631 | int sign=0, unique=1, fractional=0; | |||
3632 | NPY_PREPARE_ARGPARSERstatic _NpyArgParserCache __argparse_cache = {-1}; | |||
3633 | ||||
3634 | if (npy_parse_arguments("dragon4_positional", args, len_args, kwnames,_npy_parse_arguments("dragon4_positional", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|fractional", &PyArray_PythonPyIntFromInt, &fractional, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|pad_right", &PyArray_PythonPyIntFromInt, & pad_right, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3635 | "x", NULL , &obj,_npy_parse_arguments("dragon4_positional", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|fractional", &PyArray_PythonPyIntFromInt, &fractional, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|pad_right", &PyArray_PythonPyIntFromInt, & pad_right, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3636 | "|precision", &PyArray_PythonPyIntFromInt, &precision,_npy_parse_arguments("dragon4_positional", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|fractional", &PyArray_PythonPyIntFromInt, &fractional, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|pad_right", &PyArray_PythonPyIntFromInt, & pad_right, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3637 | "|unique", &PyArray_PythonPyIntFromInt, &unique,_npy_parse_arguments("dragon4_positional", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|fractional", &PyArray_PythonPyIntFromInt, &fractional, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|pad_right", &PyArray_PythonPyIntFromInt, & pad_right, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3638 | "|fractional", &PyArray_PythonPyIntFromInt, &fractional,_npy_parse_arguments("dragon4_positional", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|fractional", &PyArray_PythonPyIntFromInt, &fractional, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|pad_right", &PyArray_PythonPyIntFromInt, & pad_right, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3639 | "|sign", &PyArray_PythonPyIntFromInt, &sign,_npy_parse_arguments("dragon4_positional", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|fractional", &PyArray_PythonPyIntFromInt, &fractional, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|pad_right", &PyArray_PythonPyIntFromInt, & pad_right, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3640 | "|trim", &trimmode_converter, &trim,_npy_parse_arguments("dragon4_positional", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|fractional", &PyArray_PythonPyIntFromInt, &fractional, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|pad_right", &PyArray_PythonPyIntFromInt, & pad_right, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3641 | "|pad_left", &PyArray_PythonPyIntFromInt, &pad_left,_npy_parse_arguments("dragon4_positional", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|fractional", &PyArray_PythonPyIntFromInt, &fractional, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|pad_right", &PyArray_PythonPyIntFromInt, & pad_right, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3642 | "|pad_right", &PyArray_PythonPyIntFromInt, &pad_right,_npy_parse_arguments("dragon4_positional", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|fractional", &PyArray_PythonPyIntFromInt, &fractional, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|pad_right", &PyArray_PythonPyIntFromInt, & pad_right, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3643 | "|min_digits", &PyArray_PythonPyIntFromInt, &min_digits,_npy_parse_arguments("dragon4_positional", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|fractional", &PyArray_PythonPyIntFromInt, &fractional, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|pad_right", &PyArray_PythonPyIntFromInt, & pad_right, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) | |||
3644 | NULL, NULL, NULL)_npy_parse_arguments("dragon4_positional", &__argparse_cache , args, len_args, kwnames, "x", ((void*)0) , &obj, "|precision" , &PyArray_PythonPyIntFromInt, &precision, "|unique", &PyArray_PythonPyIntFromInt, &unique, "|fractional", &PyArray_PythonPyIntFromInt, &fractional, "|sign", & PyArray_PythonPyIntFromInt, &sign, "|trim", &trimmode_converter , &trim, "|pad_left", &PyArray_PythonPyIntFromInt, & pad_left, "|pad_right", &PyArray_PythonPyIntFromInt, & pad_right, "|min_digits", &PyArray_PythonPyIntFromInt, & min_digits, ((void*)0), ((void*)0), ((void*)0)) < 0) { | |||
3645 | return NULL((void*)0); | |||
3646 | } | |||
3647 | ||||
3648 | digit_mode = unique ? DigitMode_Unique : DigitMode_Exact; | |||
3649 | cutoff_mode = fractional ? CutoffMode_FractionLength : | |||
3650 | CutoffMode_TotalLength; | |||
3651 | ||||
3652 | if (unique == 0 && precision < 0) { | |||
3653 | PyErr_SetString(PyExc_TypeError, | |||
3654 | "in non-unique mode `precision` must be supplied"); | |||
3655 | return NULL((void*)0); | |||
3656 | } | |||
3657 | ||||
3658 | return Dragon4_Positional(obj, digit_mode, cutoff_mode, precision, | |||
3659 | min_digits, sign, trim, pad_left, pad_right); | |||
3660 | } | |||
3661 | ||||
3662 | static PyObject * | |||
3663 | format_longfloat(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), PyObject *args, PyObject *kwds) | |||
3664 | { | |||
3665 | PyObject *obj; | |||
3666 | unsigned int precision; | |||
3667 | static char *kwlist[] = {"x", "precision", NULL((void*)0)}; | |||
3668 | ||||
3669 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, kwds, "OI:format_longfloat", kwlist, | |||
3670 | &obj, &precision)) { | |||
3671 | return NULL((void*)0); | |||
3672 | } | |||
3673 | if (!PyArray_IsScalar(obj, LongDouble)(((((PyObject*)(obj))->ob_type) == (&PyLongDoubleArrType_Type ) || PyType_IsSubtype((((PyObject*)(obj))->ob_type), (& PyLongDoubleArrType_Type))))) { | |||
3674 | PyErr_SetString(PyExc_TypeError, | |||
3675 | "not a longfloat"); | |||
3676 | return NULL((void*)0); | |||
3677 | } | |||
3678 | return Dragon4_Scientific(obj, DigitMode_Unique, precision, -1, 0, | |||
3679 | TrimMode_LeaveOneZero, -1, -1); | |||
3680 | } | |||
3681 | ||||
3682 | static PyObject * | |||
3683 | compare_chararrays(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), PyObject *args, PyObject *kwds) | |||
3684 | { | |||
3685 | PyObject *array; | |||
3686 | PyObject *other; | |||
3687 | PyArrayObject *newarr, *newoth; | |||
3688 | int cmp_op; | |||
3689 | npy_bool rstrip; | |||
3690 | char *cmp_str; | |||
3691 | Py_ssize_t strlength; | |||
3692 | PyObject *res = NULL((void*)0); | |||
3693 | static char msg[] = "comparison must be '==', '!=', '<', '>', '<=', '>='"; | |||
3694 | static char *kwlist[] = {"a1", "a2", "cmp", "rstrip", NULL((void*)0)}; | |||
3695 | ||||
3696 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, kwds, "OOs#O&:compare_chararrays", | |||
3697 | kwlist, | |||
3698 | &array, &other, &cmp_str, &strlength, | |||
3699 | PyArray_BoolConverter, &rstrip)) { | |||
3700 | return NULL((void*)0); | |||
3701 | } | |||
3702 | if (strlength < 1 || strlength > 2) { | |||
3703 | goto err; | |||
3704 | } | |||
3705 | if (strlength > 1) { | |||
3706 | if (cmp_str[1] != '=') { | |||
3707 | goto err; | |||
3708 | } | |||
3709 | if (cmp_str[0] == '=') { | |||
3710 | cmp_op = Py_EQ2; | |||
3711 | } | |||
3712 | else if (cmp_str[0] == '!') { | |||
3713 | cmp_op = Py_NE3; | |||
3714 | } | |||
3715 | else if (cmp_str[0] == '<') { | |||
3716 | cmp_op = Py_LE1; | |||
3717 | } | |||
3718 | else if (cmp_str[0] == '>') { | |||
3719 | cmp_op = Py_GE5; | |||
3720 | } | |||
3721 | else { | |||
3722 | goto err; | |||
3723 | } | |||
3724 | } | |||
3725 | else { | |||
3726 | if (cmp_str[0] == '<') { | |||
3727 | cmp_op = Py_LT0; | |||
3728 | } | |||
3729 | else if (cmp_str[0] == '>') { | |||
3730 | cmp_op = Py_GT4; | |||
3731 | } | |||
3732 | else { | |||
3733 | goto err; | |||
3734 | } | |||
3735 | } | |||
3736 | ||||
3737 | newarr = (PyArrayObject *)PyArray_FROM_O(array)PyArray_FromAny(array, ((void*)0), 0, 0, 0, ((void*)0)); | |||
3738 | if (newarr == NULL((void*)0)) { | |||
3739 | return NULL((void*)0); | |||
3740 | } | |||
3741 | newoth = (PyArrayObject *)PyArray_FROM_O(other)PyArray_FromAny(other, ((void*)0), 0, 0, 0, ((void*)0)); | |||
3742 | if (newoth == NULL((void*)0)) { | |||
3743 | Py_DECREF(newarr)_Py_DECREF(((PyObject*)(newarr))); | |||
3744 | return NULL((void*)0); | |||
3745 | } | |||
3746 | if (PyArray_ISSTRING(newarr)(((PyArray_TYPE(newarr)) == NPY_STRING) || ((PyArray_TYPE(newarr )) == NPY_UNICODE)) && PyArray_ISSTRING(newoth)(((PyArray_TYPE(newoth)) == NPY_STRING) || ((PyArray_TYPE(newoth )) == NPY_UNICODE))) { | |||
3747 | res = _strings_richcompare(newarr, newoth, cmp_op, rstrip != 0); | |||
3748 | } | |||
3749 | else { | |||
3750 | PyErr_SetString(PyExc_TypeError, | |||
3751 | "comparison of non-string arrays"); | |||
3752 | } | |||
3753 | Py_DECREF(newarr)_Py_DECREF(((PyObject*)(newarr))); | |||
3754 | Py_DECREF(newoth)_Py_DECREF(((PyObject*)(newoth))); | |||
3755 | return res; | |||
3756 | ||||
3757 | err: | |||
3758 | PyErr_SetString(PyExc_ValueError, msg); | |||
3759 | return NULL((void*)0); | |||
3760 | } | |||
3761 | ||||
3762 | static PyObject * | |||
3763 | _vec_string_with_args(PyArrayObject* char_array, PyArray_Descr* type, | |||
3764 | PyObject* method, PyObject* args) | |||
3765 | { | |||
3766 | PyObject* broadcast_args[NPY_MAXARGS32]; | |||
3767 | PyArrayMultiIterObject* in_iter = NULL((void*)0); | |||
3768 | PyArrayObject* result = NULL((void*)0); | |||
3769 | PyArrayIterObject* out_iter = NULL((void*)0); | |||
3770 | Py_ssize_t i, n, nargs; | |||
3771 | ||||
3772 | nargs = PySequence_Size(args) + 1; | |||
3773 | if (nargs == -1 || nargs > NPY_MAXARGS32) { | |||
3774 | PyErr_Format(PyExc_ValueError, | |||
3775 | "len(args) must be < %d", NPY_MAXARGS32 - 1); | |||
3776 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); | |||
3777 | goto err; | |||
3778 | } | |||
3779 | ||||
3780 | broadcast_args[0] = (PyObject*)char_array; | |||
3781 | for (i = 1; i < nargs; i++) { | |||
3782 | PyObject* item = PySequence_GetItem(args, i-1); | |||
3783 | if (item == NULL((void*)0)) { | |||
3784 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); | |||
3785 | goto err; | |||
3786 | } | |||
3787 | broadcast_args[i] = item; | |||
3788 | Py_DECREF(item)_Py_DECREF(((PyObject*)(item))); | |||
3789 | } | |||
3790 | in_iter = (PyArrayMultiIterObject*)PyArray_MultiIterFromObjects | |||
3791 | (broadcast_args, nargs, 0); | |||
3792 | if (in_iter == NULL((void*)0)) { | |||
3793 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); | |||
3794 | goto err; | |||
3795 | } | |||
3796 | n = in_iter->numiter; | |||
3797 | ||||
3798 | result = (PyArrayObject*)PyArray_SimpleNewFromDescr(in_iter->nd,PyArray_NewFromDescr(&PyArray_Type, type, in_iter->nd, in_iter->dimensions, ((void*)0), ((void*)0), 0, ((void*)0 )) | |||
3799 | in_iter->dimensions, type)PyArray_NewFromDescr(&PyArray_Type, type, in_iter->nd, in_iter->dimensions, ((void*)0), ((void*)0), 0, ((void*)0 )); | |||
3800 | if (result == NULL((void*)0)) { | |||
3801 | goto err; | |||
3802 | } | |||
3803 | ||||
3804 | out_iter = (PyArrayIterObject*)PyArray_IterNew((PyObject*)result); | |||
3805 | if (out_iter == NULL((void*)0)) { | |||
3806 | goto err; | |||
3807 | } | |||
3808 | ||||
3809 | while (PyArray_MultiIter_NOTDONE(in_iter)(((PyArrayMultiIterObject *)(in_iter))->index < ((PyArrayMultiIterObject *)(in_iter))->size)) { | |||
3810 | PyObject* item_result; | |||
3811 | PyObject* args_tuple = PyTuple_New(n); | |||
3812 | if (args_tuple == NULL((void*)0)) { | |||
3813 | goto err; | |||
3814 | } | |||
3815 | ||||
3816 | for (i = 0; i < n; i++) { | |||
3817 | PyArrayIterObject* it = in_iter->iters[i]; | |||
3818 | PyObject* arg = PyArray_ToScalar(PyArray_ITER_DATA(it), it->ao)PyArray_Scalar(((void *)(((PyArrayIterObject *)(it))->dataptr )), PyArray_DESCR(it->ao), (PyObject *)it->ao); | |||
3819 | if (arg == NULL((void*)0)) { | |||
3820 | Py_DECREF(args_tuple)_Py_DECREF(((PyObject*)(args_tuple))); | |||
3821 | goto err; | |||
3822 | } | |||
3823 | /* Steals ref to arg */ | |||
3824 | PyTuple_SetItem(args_tuple, i, arg); | |||
3825 | } | |||
3826 | ||||
3827 | item_result = PyObject_CallObject(method, args_tuple); | |||
3828 | Py_DECREF(args_tuple)_Py_DECREF(((PyObject*)(args_tuple))); | |||
3829 | if (item_result == NULL((void*)0)) { | |||
3830 | goto err; | |||
3831 | } | |||
3832 | ||||
3833 | if (PyArray_SETITEM(result, PyArray_ITER_DATA(out_iter)((void *)(((PyArrayIterObject *)(out_iter))->dataptr)), item_result)) { | |||
3834 | Py_DECREF(item_result)_Py_DECREF(((PyObject*)(item_result))); | |||
3835 | PyErr_SetString( PyExc_TypeError, | |||
3836 | "result array type does not match underlying function"); | |||
3837 | goto err; | |||
3838 | } | |||
3839 | Py_DECREF(item_result)_Py_DECREF(((PyObject*)(item_result))); | |||
3840 | ||||
3841 | PyArray_MultiIter_NEXT(in_iter)do { int __npy_mi; ((PyArrayMultiIterObject *)(in_iter))-> index++; for (__npy_mi=0; __npy_mi < ((PyArrayMultiIterObject *)(in_iter))->numiter; __npy_mi++) { do { ((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi] ))->index++; if (((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi]))->nd_m1 == 0) { do { (( (PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))-> iters[__npy_mi])))->dataptr += ((PyArrayIterObject *)(((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi] ))))->strides[0]; (((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi])))->coordinates[0]++; } while (0); } else if (((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi]))->contiguous) ((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi] ))->dataptr += PyArray_DESCR(((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi]))->ao)->elsize; else if (((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter) )->iters[__npy_mi]))->nd_m1 == 1) { do { if ((((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi] )))->coordinates[1] < (((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi])))->dims_m1[1]) { (((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi] )))->coordinates[1]++; (((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi])))->dataptr += (((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi] )))->strides[1]; } else { (((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi])))->coordinates[1] = 0; ( ((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))-> iters[__npy_mi])))->coordinates[0]++; (((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi] )))->dataptr += (((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi])))->strides[0] - (((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi] )))->backstrides[1]; } } while (0); } else { int __npy_i; for (__npy_i=((PyArrayIterObject *)(((PyArrayMultiIterObject *)( in_iter))->iters[__npy_mi]))->nd_m1; __npy_i >= 0; __npy_i --) { if (((PyArrayIterObject *)(((PyArrayMultiIterObject *)( in_iter))->iters[__npy_mi]))->coordinates[__npy_i] < ((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter)) ->iters[__npy_mi]))->dims_m1[__npy_i]) { ((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi] ))->coordinates[__npy_i]++; ((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi]))->dataptr += ((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi] ))->strides[__npy_i]; break; } else { ((PyArrayIterObject * )(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi])) ->coordinates[__npy_i] = 0; ((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi]))->dataptr -= ((PyArrayIterObject *)(((PyArrayMultiIterObject *)(in_iter))->iters[__npy_mi] ))->backstrides[__npy_i]; } } } } while (0); } } while (0); | |||
3842 | PyArray_ITER_NEXT(out_iter)do { ((PyArrayIterObject *)(out_iter))->index++; if (((PyArrayIterObject *)(out_iter))->nd_m1 == 0) { do { (((PyArrayIterObject *) (out_iter)))->dataptr += ((PyArrayIterObject *)(((PyArrayIterObject *)(out_iter))))->strides[0]; (((PyArrayIterObject *)(out_iter )))->coordinates[0]++; } while (0); } else if (((PyArrayIterObject *)(out_iter))->contiguous) ((PyArrayIterObject *)(out_iter ))->dataptr += PyArray_DESCR(((PyArrayIterObject *)(out_iter ))->ao)->elsize; else if (((PyArrayIterObject *)(out_iter ))->nd_m1 == 1) { do { if ((((PyArrayIterObject *)(out_iter )))->coordinates[1] < (((PyArrayIterObject *)(out_iter) ))->dims_m1[1]) { (((PyArrayIterObject *)(out_iter)))-> coordinates[1]++; (((PyArrayIterObject *)(out_iter)))->dataptr += (((PyArrayIterObject *)(out_iter)))->strides[1]; } else { (((PyArrayIterObject *)(out_iter)))->coordinates[1] = 0 ; (((PyArrayIterObject *)(out_iter)))->coordinates[0]++; ( ((PyArrayIterObject *)(out_iter)))->dataptr += (((PyArrayIterObject *)(out_iter)))->strides[0] - (((PyArrayIterObject *)(out_iter )))->backstrides[1]; } } while (0); } else { int __npy_i; for (__npy_i=((PyArrayIterObject *)(out_iter))->nd_m1; __npy_i >= 0; __npy_i--) { if (((PyArrayIterObject *)(out_iter))-> coordinates[__npy_i] < ((PyArrayIterObject *)(out_iter))-> dims_m1[__npy_i]) { ((PyArrayIterObject *)(out_iter))->coordinates [__npy_i]++; ((PyArrayIterObject *)(out_iter))->dataptr += ((PyArrayIterObject *)(out_iter))->strides[__npy_i]; break ; } else { ((PyArrayIterObject *)(out_iter))->coordinates[ __npy_i] = 0; ((PyArrayIterObject *)(out_iter))->dataptr -= ((PyArrayIterObject *)(out_iter))->backstrides[__npy_i]; } } } } while (0); | |||
3843 | } | |||
3844 | ||||
3845 | Py_DECREF(in_iter)_Py_DECREF(((PyObject*)(in_iter))); | |||
3846 | Py_DECREF(out_iter)_Py_DECREF(((PyObject*)(out_iter))); | |||
3847 | ||||
3848 | return (PyObject*)result; | |||
3849 | ||||
3850 | err: | |||
3851 | Py_XDECREF(in_iter)_Py_XDECREF(((PyObject*)(in_iter))); | |||
3852 | Py_XDECREF(out_iter)_Py_XDECREF(((PyObject*)(out_iter))); | |||
3853 | Py_XDECREF(result)_Py_XDECREF(((PyObject*)(result))); | |||
3854 | ||||
3855 | return 0; | |||
3856 | } | |||
3857 | ||||
3858 | static PyObject * | |||
3859 | _vec_string_no_args(PyArrayObject* char_array, | |||
3860 | PyArray_Descr* type, PyObject* method) | |||
3861 | { | |||
3862 | /* | |||
3863 | * This is a faster version of _vec_string_args to use when there | |||
3864 | * are no additional arguments to the string method. This doesn't | |||
3865 | * require a broadcast iterator (and broadcast iterators don't work | |||
3866 | * with 1 argument anyway). | |||
3867 | */ | |||
3868 | PyArrayIterObject* in_iter = NULL((void*)0); | |||
3869 | PyArrayObject* result = NULL((void*)0); | |||
3870 | PyArrayIterObject* out_iter = NULL((void*)0); | |||
3871 | ||||
3872 | in_iter = (PyArrayIterObject*)PyArray_IterNew((PyObject*)char_array); | |||
3873 | if (in_iter == NULL((void*)0)) { | |||
3874 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); | |||
3875 | goto err; | |||
3876 | } | |||
3877 | ||||
3878 | result = (PyArrayObject*)PyArray_SimpleNewFromDescr(PyArray_NewFromDescr(&PyArray_Type, type, PyArray_NDIM(char_array ), PyArray_DIMS(char_array), ((void*)0), ((void*)0), 0, ((void *)0)) | |||
3879 | PyArray_NDIM(char_array), PyArray_DIMS(char_array), type)PyArray_NewFromDescr(&PyArray_Type, type, PyArray_NDIM(char_array ), PyArray_DIMS(char_array), ((void*)0), ((void*)0), 0, ((void *)0)); | |||
3880 | if (result == NULL((void*)0)) { | |||
3881 | goto err; | |||
3882 | } | |||
3883 | ||||
3884 | out_iter = (PyArrayIterObject*)PyArray_IterNew((PyObject*)result); | |||
3885 | if (out_iter == NULL((void*)0)) { | |||
3886 | goto err; | |||
3887 | } | |||
3888 | ||||
3889 | while (PyArray_ITER_NOTDONE(in_iter)(((PyArrayIterObject *)(in_iter))->index < ((PyArrayIterObject *)(in_iter))->size)) { | |||
3890 | PyObject* item_result; | |||
3891 | PyObject* item = PyArray_ToScalar(in_iter->dataptr, in_iter->ao)PyArray_Scalar(in_iter->dataptr, PyArray_DESCR(in_iter-> ao), (PyObject *)in_iter->ao); | |||
3892 | if (item == NULL((void*)0)) { | |||
3893 | goto err; | |||
3894 | } | |||
3895 | ||||
3896 | item_result = PyObject_CallFunctionObjArgs(method, item, NULL((void*)0)); | |||
3897 | Py_DECREF(item)_Py_DECREF(((PyObject*)(item))); | |||
3898 | if (item_result == NULL((void*)0)) { | |||
3899 | goto err; | |||
3900 | } | |||
3901 | ||||
3902 | if (PyArray_SETITEM(result, PyArray_ITER_DATA(out_iter)((void *)(((PyArrayIterObject *)(out_iter))->dataptr)), item_result)) { | |||
3903 | Py_DECREF(item_result)_Py_DECREF(((PyObject*)(item_result))); | |||
3904 | PyErr_SetString( PyExc_TypeError, | |||
3905 | "result array type does not match underlying function"); | |||
3906 | goto err; | |||
3907 | } | |||
3908 | Py_DECREF(item_result)_Py_DECREF(((PyObject*)(item_result))); | |||
3909 | ||||
3910 | PyArray_ITER_NEXT(in_iter)do { ((PyArrayIterObject *)(in_iter))->index++; if (((PyArrayIterObject *)(in_iter))->nd_m1 == 0) { do { (((PyArrayIterObject *)( in_iter)))->dataptr += ((PyArrayIterObject *)(((PyArrayIterObject *)(in_iter))))->strides[0]; (((PyArrayIterObject *)(in_iter )))->coordinates[0]++; } while (0); } else if (((PyArrayIterObject *)(in_iter))->contiguous) ((PyArrayIterObject *)(in_iter) )->dataptr += PyArray_DESCR(((PyArrayIterObject *)(in_iter ))->ao)->elsize; else if (((PyArrayIterObject *)(in_iter ))->nd_m1 == 1) { do { if ((((PyArrayIterObject *)(in_iter )))->coordinates[1] < (((PyArrayIterObject *)(in_iter)) )->dims_m1[1]) { (((PyArrayIterObject *)(in_iter)))->coordinates [1]++; (((PyArrayIterObject *)(in_iter)))->dataptr += (((PyArrayIterObject *)(in_iter)))->strides[1]; } else { (((PyArrayIterObject * )(in_iter)))->coordinates[1] = 0; (((PyArrayIterObject *)( in_iter)))->coordinates[0]++; (((PyArrayIterObject *)(in_iter )))->dataptr += (((PyArrayIterObject *)(in_iter)))->strides [0] - (((PyArrayIterObject *)(in_iter)))->backstrides[1]; } } while (0); } else { int __npy_i; for (__npy_i=((PyArrayIterObject *)(in_iter))->nd_m1; __npy_i >= 0; __npy_i--) { if ((( PyArrayIterObject *)(in_iter))->coordinates[__npy_i] < ( (PyArrayIterObject *)(in_iter))->dims_m1[__npy_i]) { ((PyArrayIterObject *)(in_iter))->coordinates[__npy_i]++; ((PyArrayIterObject *)(in_iter))->dataptr += ((PyArrayIterObject *)(in_iter)) ->strides[__npy_i]; break; } else { ((PyArrayIterObject *) (in_iter))->coordinates[__npy_i] = 0; ((PyArrayIterObject * )(in_iter))->dataptr -= ((PyArrayIterObject *)(in_iter))-> backstrides[__npy_i]; } } } } while (0); | |||
3911 | PyArray_ITER_NEXT(out_iter)do { ((PyArrayIterObject *)(out_iter))->index++; if (((PyArrayIterObject *)(out_iter))->nd_m1 == 0) { do { (((PyArrayIterObject *) (out_iter)))->dataptr += ((PyArrayIterObject *)(((PyArrayIterObject *)(out_iter))))->strides[0]; (((PyArrayIterObject *)(out_iter )))->coordinates[0]++; } while (0); } else if (((PyArrayIterObject *)(out_iter))->contiguous) ((PyArrayIterObject *)(out_iter ))->dataptr += PyArray_DESCR(((PyArrayIterObject *)(out_iter ))->ao)->elsize; else if (((PyArrayIterObject *)(out_iter ))->nd_m1 == 1) { do { if ((((PyArrayIterObject *)(out_iter )))->coordinates[1] < (((PyArrayIterObject *)(out_iter) ))->dims_m1[1]) { (((PyArrayIterObject *)(out_iter)))-> coordinates[1]++; (((PyArrayIterObject *)(out_iter)))->dataptr += (((PyArrayIterObject *)(out_iter)))->strides[1]; } else { (((PyArrayIterObject *)(out_iter)))->coordinates[1] = 0 ; (((PyArrayIterObject *)(out_iter)))->coordinates[0]++; ( ((PyArrayIterObject *)(out_iter)))->dataptr += (((PyArrayIterObject *)(out_iter)))->strides[0] - (((PyArrayIterObject *)(out_iter )))->backstrides[1]; } } while (0); } else { int __npy_i; for (__npy_i=((PyArrayIterObject *)(out_iter))->nd_m1; __npy_i >= 0; __npy_i--) { if (((PyArrayIterObject *)(out_iter))-> coordinates[__npy_i] < ((PyArrayIterObject *)(out_iter))-> dims_m1[__npy_i]) { ((PyArrayIterObject *)(out_iter))->coordinates [__npy_i]++; ((PyArrayIterObject *)(out_iter))->dataptr += ((PyArrayIterObject *)(out_iter))->strides[__npy_i]; break ; } else { ((PyArrayIterObject *)(out_iter))->coordinates[ __npy_i] = 0; ((PyArrayIterObject *)(out_iter))->dataptr -= ((PyArrayIterObject *)(out_iter))->backstrides[__npy_i]; } } } } while (0); | |||
3912 | } | |||
3913 | ||||
3914 | Py_DECREF(in_iter)_Py_DECREF(((PyObject*)(in_iter))); | |||
3915 | Py_DECREF(out_iter)_Py_DECREF(((PyObject*)(out_iter))); | |||
3916 | ||||
3917 | return (PyObject*)result; | |||
3918 | ||||
3919 | err: | |||
3920 | Py_XDECREF(in_iter)_Py_XDECREF(((PyObject*)(in_iter))); | |||
3921 | Py_XDECREF(out_iter)_Py_XDECREF(((PyObject*)(out_iter))); | |||
3922 | Py_XDECREF(result)_Py_XDECREF(((PyObject*)(result))); | |||
3923 | ||||
3924 | return 0; | |||
3925 | } | |||
3926 | ||||
3927 | static PyObject * | |||
3928 | _vec_string(PyObject *NPY_UNUSED(dummy)(__NPY_UNUSED_TAGGEDdummy) __attribute__ ((__unused__)), PyObject *args, PyObject *NPY_UNUSED(kwds)(__NPY_UNUSED_TAGGEDkwds) __attribute__ ((__unused__))) | |||
3929 | { | |||
3930 | PyArrayObject* char_array = NULL((void*)0); | |||
3931 | PyArray_Descr *type; | |||
3932 | PyObject* method_name; | |||
3933 | PyObject* args_seq = NULL((void*)0); | |||
3934 | ||||
3935 | PyObject* method = NULL((void*)0); | |||
3936 | PyObject* result = NULL((void*)0); | |||
3937 | ||||
3938 | if (!PyArg_ParseTuple_PyArg_ParseTuple_SizeT(args, "O&O&O|O", | |||
3939 | PyArray_Converter, &char_array, | |||
3940 | PyArray_DescrConverter, &type, | |||
3941 | &method_name, &args_seq)) { | |||
3942 | goto err; | |||
3943 | } | |||
3944 | ||||
3945 | if (PyArray_TYPE(char_array) == NPY_STRING) { | |||
3946 | method = PyObject_GetAttr((PyObject *)&PyBytes_Type, method_name); | |||
3947 | } | |||
3948 | else if (PyArray_TYPE(char_array) == NPY_UNICODE) { | |||
3949 | method = PyObject_GetAttr((PyObject *)&PyUnicode_Type, method_name); | |||
3950 | } | |||
3951 | else { | |||
3952 | PyErr_SetString(PyExc_TypeError, | |||
3953 | "string operation on non-string array"); | |||
3954 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); | |||
3955 | goto err; | |||
3956 | } | |||
3957 | if (method == NULL((void*)0)) { | |||
3958 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); | |||
3959 | goto err; | |||
3960 | } | |||
3961 | ||||
3962 | if (args_seq == NULL((void*)0) | |||
3963 | || (PySequence_Check(args_seq) && PySequence_Size(args_seq) == 0)) { | |||
3964 | result = _vec_string_no_args(char_array, type, method); | |||
3965 | } | |||
3966 | else if (PySequence_Check(args_seq)) { | |||
3967 | result = _vec_string_with_args(char_array, type, method, args_seq); | |||
3968 | } | |||
3969 | else { | |||
3970 | Py_DECREF(type)_Py_DECREF(((PyObject*)(type))); | |||
3971 | PyErr_SetString(PyExc_TypeError, | |||
3972 | "'args' must be a sequence of arguments"); | |||
3973 | goto err; | |||
3974 | } | |||
3975 | if (result == NULL((void*)0)) { | |||
3976 | goto err; | |||
3977 | } | |||
3978 | ||||
3979 | Py_DECREF(char_array)_Py_DECREF(((PyObject*)(char_array))); | |||
3980 | Py_DECREF(method)_Py_DECREF(((PyObject*)(method))); | |||
3981 | ||||
3982 | return (PyObject*)result; | |||
3983 | ||||
3984 | err: | |||
3985 | Py_XDECREF(char_array)_Py_XDECREF(((PyObject*)(char_array))); | |||
3986 | Py_XDECREF(method)_Py_XDECREF(((PyObject*)(method))); | |||
3987 | ||||
3988 | return 0; | |||
3989 | } | |||
3990 | ||||
3991 | #ifndef __NPY_PRIVATE_NO_SIGNAL | |||
3992 | ||||
3993 | static NPY_TLS__thread int sigint_buf_init = 0; | |||
3994 | static NPY_TLS__thread NPY_SIGJMP_BUFsigjmp_buf _NPY_SIGINT_BUF; | |||
3995 | ||||
3996 | /*NUMPY_API | |||
3997 | */ | |||
3998 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) void | |||
3999 | _PyArray_SigintHandler(int signum) | |||
4000 | { | |||
4001 | PyOS_setsig(signum, SIG_IGN((__sighandler_t) 1)); | |||
4002 | /* | |||
4003 | * jump buffer may be uninitialized as SIGINT allowing functions are usually | |||
4004 | * run in other threads than the master thread that receives the signal | |||
4005 | */ | |||
4006 | if (sigint_buf_init > 0) { | |||
4007 | NPY_SIGLONGJMP(_NPY_SIGINT_BUF, signum)siglongjmp(_NPY_SIGINT_BUF, signum); | |||
4008 | } | |||
4009 | /* | |||
4010 | * sending SIGINT to the worker threads to cancel them is job of the | |||
4011 | * application | |||
4012 | */ | |||
4013 | } | |||
4014 | ||||
4015 | /*NUMPY_API | |||
4016 | */ | |||
4017 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) void* | |||
4018 | _PyArray_GetSigintBuf(void) | |||
4019 | { | |||
4020 | sigint_buf_init = 1; | |||
4021 | return (void *)&_NPY_SIGINT_BUF; | |||
4022 | } | |||
4023 | ||||
4024 | #else | |||
4025 | ||||
4026 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) void | |||
4027 | _PyArray_SigintHandler(int signum) | |||
4028 | { | |||
4029 | return; | |||
4030 | } | |||
4031 | ||||
4032 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) void* | |||
4033 | _PyArray_GetSigintBuf(void) | |||
4034 | { | |||
4035 | return NULL((void*)0); | |||
4036 | } | |||
4037 | ||||
4038 | #endif | |||
4039 | ||||
4040 | ||||
4041 | static PyObject * | |||
4042 | array_shares_memory_impl(PyObject *args, PyObject *kwds, Py_ssize_t default_max_work, | |||
4043 | int raise_exceptions) | |||
4044 | { | |||
4045 | PyObject * self_obj = NULL((void*)0); | |||
4046 | PyObject * other_obj = NULL((void*)0); | |||
4047 | PyArrayObject * self = NULL((void*)0); | |||
4048 | PyArrayObject * other = NULL((void*)0); | |||
4049 | PyObject *max_work_obj = NULL((void*)0); | |||
4050 | static char *kwlist[] = {"self", "other", "max_work", NULL((void*)0)}; | |||
4051 | ||||
4052 | mem_overlap_t result; | |||
4053 | static PyObject *too_hard_cls = NULL((void*)0); | |||
4054 | Py_ssize_t max_work; | |||
4055 | NPY_BEGIN_THREADS_DEFPyThreadState *_save=((void*)0);; | |||
4056 | ||||
4057 | max_work = default_max_work; | |||
4058 | ||||
4059 | if (!PyArg_ParseTupleAndKeywords_PyArg_ParseTupleAndKeywords_SizeT(args, kwds, "OO|O:shares_memory_impl", kwlist, | |||
4060 | &self_obj, &other_obj, &max_work_obj)) { | |||
4061 | return NULL((void*)0); | |||
4062 | } | |||
4063 | ||||
4064 | if (PyArray_Check(self_obj)((((PyObject*)(self_obj))->ob_type) == (&PyArray_Type) || PyType_IsSubtype((((PyObject*)(self_obj))->ob_type), ( &PyArray_Type)))) { | |||
4065 | self = (PyArrayObject*)self_obj; | |||
4066 | Py_INCREF(self)_Py_INCREF(((PyObject*)(self))); | |||
4067 | } | |||
4068 | else { | |||
4069 | /* Use FromAny to enable checking overlap for objects exposing array | |||
4070 | interfaces etc. */ | |||
4071 | self = (PyArrayObject*)PyArray_FROM_O(self_obj)PyArray_FromAny(self_obj, ((void*)0), 0, 0, 0, ((void*)0)); | |||
4072 | if (self == NULL((void*)0)) { | |||
4073 | goto fail; | |||
4074 | } | |||
4075 | } | |||
4076 | ||||
4077 | if (PyArray_Check(other_obj)((((PyObject*)(other_obj))->ob_type) == (&PyArray_Type ) || PyType_IsSubtype((((PyObject*)(other_obj))->ob_type), (&PyArray_Type)))) { | |||
4078 | other = (PyArrayObject*)other_obj; | |||
4079 | Py_INCREF(other)_Py_INCREF(((PyObject*)(other))); | |||
4080 | } | |||
4081 | else { | |||
4082 | other = (PyArrayObject*)PyArray_FROM_O(other_obj)PyArray_FromAny(other_obj, ((void*)0), 0, 0, 0, ((void*)0)); | |||
4083 | if (other == NULL((void*)0)) { | |||
4084 | goto fail; | |||
4085 | } | |||
4086 | } | |||
4087 | ||||
4088 | if (max_work_obj == NULL((void*)0) || max_work_obj == Py_None(&_Py_NoneStruct)) { | |||
4089 | /* noop */ | |||
4090 | } | |||
4091 | else if (PyLong_Check(max_work_obj)((((((PyObject*)(max_work_obj))->ob_type))->tp_flags & ((1UL << 24))) != 0)) { | |||
4092 | max_work = PyLong_AsSsize_t(max_work_obj); | |||
4093 | if (PyErr_Occurred()) { | |||
4094 | goto fail; | |||
4095 | } | |||
4096 | } | |||
4097 | else { | |||
4098 | PyErr_SetString(PyExc_ValueError, "max_work must be an integer"); | |||
4099 | goto fail; | |||
4100 | } | |||
4101 | ||||
4102 | if (max_work < -2) { | |||
4103 | PyErr_SetString(PyExc_ValueError, "Invalid value for max_work"); | |||
4104 | goto fail; | |||
4105 | } | |||
4106 | ||||
4107 | NPY_BEGIN_THREADSdo {_save = PyEval_SaveThread();} while (0);; | |||
4108 | result = solve_may_share_memory(self, other, max_work); | |||
4109 | NPY_END_THREADSdo { if (_save) { PyEval_RestoreThread(_save); _save = ((void *)0);} } while (0);; | |||
4110 | ||||
4111 | Py_XDECREF(self)_Py_XDECREF(((PyObject*)(self))); | |||
4112 | Py_XDECREF(other)_Py_XDECREF(((PyObject*)(other))); | |||
4113 | ||||
4114 | if (result == MEM_OVERLAP_NO) { | |||
4115 | Py_RETURN_FALSEreturn _Py_INCREF(((PyObject*)(((PyObject *) &_Py_FalseStruct )))), ((PyObject *) &_Py_FalseStruct); | |||
4116 | } | |||
4117 | else if (result == MEM_OVERLAP_YES) { | |||
4118 | Py_RETURN_TRUEreturn _Py_INCREF(((PyObject*)(((PyObject *) &_Py_TrueStruct )))), ((PyObject *) &_Py_TrueStruct); | |||
4119 | } | |||
4120 | else if (result == MEM_OVERLAP_OVERFLOW) { | |||
4121 | if (raise_exceptions) { | |||
4122 | PyErr_SetString(PyExc_OverflowError, | |||
4123 | "Integer overflow in computing overlap"); | |||
4124 | return NULL((void*)0); | |||
4125 | } | |||
4126 | else { | |||
4127 | /* Don't know, so say yes */ | |||
4128 | Py_RETURN_TRUEreturn _Py_INCREF(((PyObject*)(((PyObject *) &_Py_TrueStruct )))), ((PyObject *) &_Py_TrueStruct); | |||
4129 | } | |||
4130 | } | |||
4131 | else if (result == MEM_OVERLAP_TOO_HARD) { | |||
4132 | if (raise_exceptions) { | |||
4133 | npy_cache_import("numpy.core._exceptions", "TooHardError", | |||
4134 | &too_hard_cls); | |||
4135 | if (too_hard_cls) { | |||
4136 | PyErr_SetString(too_hard_cls, "Exceeded max_work"); | |||
4137 | } | |||
4138 | return NULL((void*)0); | |||
4139 | } | |||
4140 | else { | |||
4141 | /* Don't know, so say yes */ | |||
4142 | Py_RETURN_TRUEreturn _Py_INCREF(((PyObject*)(((PyObject *) &_Py_TrueStruct )))), ((PyObject *) &_Py_TrueStruct); | |||
4143 | } | |||
4144 | } | |||
4145 | else { | |||
4146 | /* Doesn't happen usually */ | |||
4147 | PyErr_SetString(PyExc_RuntimeError, | |||
4148 | "Error in computing overlap"); | |||
4149 | return NULL((void*)0); | |||
4150 | } | |||
4151 | ||||
4152 | fail: | |||
4153 | Py_XDECREF(self)_Py_XDECREF(((PyObject*)(self))); | |||
4154 | Py_XDECREF(other)_Py_XDECREF(((PyObject*)(other))); | |||
4155 | return NULL((void*)0); | |||
4156 | } | |||
4157 | ||||
4158 | ||||
4159 | static PyObject * | |||
4160 | array_shares_memory(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), PyObject *args, PyObject *kwds) | |||
4161 | { | |||
4162 | return array_shares_memory_impl(args, kwds, NPY_MAY_SHARE_EXACT-1, 1); | |||
4163 | } | |||
4164 | ||||
4165 | ||||
4166 | static PyObject * | |||
4167 | array_may_share_memory(PyObject *NPY_UNUSED(ignored)(__NPY_UNUSED_TAGGEDignored) __attribute__ ((__unused__)), PyObject *args, PyObject *kwds) | |||
4168 | { | |||
4169 | return array_shares_memory_impl(args, kwds, NPY_MAY_SHARE_BOUNDS0, 0); | |||
4170 | } | |||
4171 | ||||
4172 | static PyObject * | |||
4173 | normalize_axis_index(PyObject *NPY_UNUSED(self)(__NPY_UNUSED_TAGGEDself) __attribute__ ((__unused__)), | |||
4174 | PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames) | |||
4175 | { | |||
4176 | int axis; | |||
4177 | int ndim; | |||
4178 | PyObject *msg_prefix = Py_None(&_Py_NoneStruct); | |||
4179 | NPY_PREPARE_ARGPARSERstatic _NpyArgParserCache __argparse_cache = {-1}; | |||
4180 | ||||
4181 | if (npy_parse_arguments("normalize_axis_index", args, len_args, kwnames,_npy_parse_arguments("normalize_axis_index", &__argparse_cache , args, len_args, kwnames, "axis", &PyArray_PythonPyIntFromInt , &axis, "ndim", &PyArray_PythonPyIntFromInt, &ndim , "|msg_prefix", ((void*)0), &msg_prefix, ((void*)0), ((void *)0), ((void*)0)) | |||
4182 | "axis", &PyArray_PythonPyIntFromInt, &axis,_npy_parse_arguments("normalize_axis_index", &__argparse_cache , args, len_args, kwnames, "axis", &PyArray_PythonPyIntFromInt , &axis, "ndim", &PyArray_PythonPyIntFromInt, &ndim , "|msg_prefix", ((void*)0), &msg_prefix, ((void*)0), ((void *)0), ((void*)0)) | |||
4183 | "ndim", &PyArray_PythonPyIntFromInt, &ndim,_npy_parse_arguments("normalize_axis_index", &__argparse_cache , args, len_args, kwnames, "axis", &PyArray_PythonPyIntFromInt , &axis, "ndim", &PyArray_PythonPyIntFromInt, &ndim , "|msg_prefix", ((void*)0), &msg_prefix, ((void*)0), ((void *)0), ((void*)0)) | |||
4184 | "|msg_prefix", NULL, &msg_prefix,_npy_parse_arguments("normalize_axis_index", &__argparse_cache , args, len_args, kwnames, "axis", &PyArray_PythonPyIntFromInt , &axis, "ndim", &PyArray_PythonPyIntFromInt, &ndim , "|msg_prefix", ((void*)0), &msg_prefix, ((void*)0), ((void *)0), ((void*)0)) | |||
4185 | NULL, NULL, NULL)_npy_parse_arguments("normalize_axis_index", &__argparse_cache , args, len_args, kwnames, "axis", &PyArray_PythonPyIntFromInt , &axis, "ndim", &PyArray_PythonPyIntFromInt, &ndim , "|msg_prefix", ((void*)0), &msg_prefix, ((void*)0), ((void *)0), ((void*)0)) < 0) { | |||
4186 | return NULL((void*)0); | |||
4187 | } | |||
4188 | if (check_and_adjust_axis_msg(&axis, ndim, msg_prefix) < 0) { | |||
4189 | return NULL((void*)0); | |||
4190 | } | |||
4191 | ||||
4192 | return PyLong_FromLong(axis); | |||
4193 | } | |||
4194 | ||||
4195 | ||||
4196 | static PyObject * | |||
4197 | _reload_guard(PyObject *NPY_UNUSED(self)(__NPY_UNUSED_TAGGEDself) __attribute__ ((__unused__))) { | |||
4198 | static int initialized = 0; | |||
4199 | ||||
4200 | #if !defined(PYPY_VERSION) | |||
4201 | if (PyThreadState_Get()->interp != PyInterpreterState_Main()) { | |||
4202 | if (PyErr_WarnEx(PyExc_UserWarning, | |||
4203 | "NumPy was imported from a Python sub-interpreter but " | |||
4204 | "NumPy does not properly support sub-interpreters. " | |||
4205 | "This will likely work for most users but might cause hard to " | |||
4206 | "track down issues or subtle bugs. " | |||
4207 | "A common user of the rare sub-interpreter feature is wsgi " | |||
4208 | "which also allows single-interpreter mode.\n" | |||
4209 | "Improvements in the case of bugs are welcome, but is not " | |||
4210 | "on the NumPy roadmap, and full support may require " | |||
4211 | "significant effort to achieve.", 2) < 0) { | |||
4212 | return NULL((void*)0); | |||
4213 | } | |||
4214 | /* No need to give the other warning in a sub-interpreter as well... */ | |||
4215 | initialized = 1; | |||
4216 | Py_RETURN_NONEreturn _Py_INCREF(((PyObject*)((&_Py_NoneStruct)))), (& _Py_NoneStruct); | |||
4217 | } | |||
4218 | #endif | |||
4219 | if (initialized) { | |||
4220 | if (PyErr_WarnEx(PyExc_UserWarning, | |||
4221 | "The NumPy module was reloaded (imported a second time). " | |||
4222 | "This can in some cases result in small but subtle issues " | |||
4223 | "and is discouraged.", 2) < 0) { | |||
4224 | return NULL((void*)0); | |||
4225 | } | |||
4226 | } | |||
4227 | initialized = 1; | |||
4228 | Py_RETURN_NONEreturn _Py_INCREF(((PyObject*)((&_Py_NoneStruct)))), (& _Py_NoneStruct); | |||
4229 | } | |||
4230 | ||||
4231 | ||||
4232 | static struct PyMethodDef array_module_methods[] = { | |||
4233 | {"_get_implementing_args", | |||
4234 | (PyCFunction)array__get_implementing_args, | |||
4235 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4236 | {"_get_ndarray_c_version", | |||
4237 | (PyCFunction)array__get_ndarray_c_version, | |||
4238 | METH_VARARGS0x0001|METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4239 | {"_reconstruct", | |||
4240 | (PyCFunction)array__reconstruct, | |||
4241 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4242 | {"set_string_function", | |||
4243 | (PyCFunction)array_set_string_function, | |||
4244 | METH_VARARGS0x0001|METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4245 | {"set_numeric_ops", | |||
4246 | (PyCFunction)array_set_ops_function, | |||
4247 | METH_VARARGS0x0001|METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4248 | {"set_datetimeparse_function", | |||
4249 | (PyCFunction)array_set_datetimeparse_function, | |||
4250 | METH_VARARGS0x0001|METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4251 | {"set_typeDict", | |||
4252 | (PyCFunction)array_set_typeDict, | |||
4253 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4254 | {"array", | |||
4255 | (PyCFunction)array_array, | |||
4256 | METH_FASTCALL0x0080 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4257 | {"asarray", | |||
4258 | (PyCFunction)array_asarray, | |||
4259 | METH_FASTCALL0x0080 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4260 | {"asanyarray", | |||
4261 | (PyCFunction)array_asanyarray, | |||
4262 | METH_FASTCALL0x0080 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4263 | {"ascontiguousarray", | |||
4264 | (PyCFunction)array_ascontiguousarray, | |||
4265 | METH_FASTCALL0x0080 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4266 | {"asfortranarray", | |||
4267 | (PyCFunction)array_asfortranarray, | |||
4268 | METH_FASTCALL0x0080 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4269 | {"copyto", | |||
4270 | (PyCFunction)array_copyto, | |||
4271 | METH_VARARGS0x0001|METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4272 | {"nested_iters", | |||
4273 | (PyCFunction)NpyIter_NestedIters, | |||
4274 | METH_VARARGS0x0001|METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4275 | {"arange", | |||
4276 | (PyCFunction)array_arange, | |||
4277 | METH_FASTCALL0x0080 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4278 | {"zeros", | |||
4279 | (PyCFunction)array_zeros, | |||
4280 | METH_FASTCALL0x0080 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4281 | {"count_nonzero", | |||
4282 | (PyCFunction)array_count_nonzero, | |||
4283 | METH_VARARGS0x0001|METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4284 | {"empty", | |||
4285 | (PyCFunction)array_empty, | |||
4286 | METH_FASTCALL0x0080 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4287 | {"empty_like", | |||
4288 | (PyCFunction)array_empty_like, | |||
4289 | METH_VARARGS0x0001|METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4290 | {"scalar", | |||
4291 | (PyCFunction)array_scalar, | |||
4292 | METH_VARARGS0x0001|METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4293 | {"where", | |||
4294 | (PyCFunction)array_where, | |||
4295 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4296 | {"lexsort", | |||
4297 | (PyCFunction)array_lexsort, | |||
4298 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4299 | {"putmask", | |||
4300 | (PyCFunction)array_putmask, | |||
4301 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4302 | {"fromstring", | |||
4303 | (PyCFunction)array_fromstring, | |||
4304 | METH_VARARGS0x0001|METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4305 | {"fromiter", | |||
4306 | (PyCFunction)array_fromiter, | |||
4307 | METH_VARARGS0x0001|METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4308 | {"concatenate", | |||
4309 | (PyCFunction)array_concatenate, | |||
4310 | METH_VARARGS0x0001|METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4311 | {"inner", | |||
4312 | (PyCFunction)array_innerproduct, | |||
4313 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4314 | {"dot", | |||
4315 | (PyCFunction)array_matrixproduct, | |||
4316 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4317 | {"vdot", | |||
4318 | (PyCFunction)array_vdot, | |||
4319 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4320 | {"c_einsum", | |||
4321 | (PyCFunction)array_einsum, | |||
4322 | METH_VARARGS0x0001|METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4323 | {"_fastCopyAndTranspose", | |||
4324 | (PyCFunction)array_fastCopyAndTranspose, | |||
4325 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4326 | {"correlate", | |||
4327 | (PyCFunction)array_correlate, | |||
4328 | METH_FASTCALL0x0080 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4329 | {"correlate2", | |||
4330 | (PyCFunction)array_correlate2, | |||
4331 | METH_FASTCALL0x0080 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4332 | {"frombuffer", | |||
4333 | (PyCFunction)array_frombuffer, | |||
4334 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4335 | {"fromfile", | |||
4336 | (PyCFunction)array_fromfile, | |||
4337 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4338 | {"can_cast", | |||
4339 | (PyCFunction)array_can_cast_safely, | |||
4340 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4341 | {"promote_types", | |||
4342 | (PyCFunction)array_promote_types, | |||
4343 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4344 | {"min_scalar_type", | |||
4345 | (PyCFunction)array_min_scalar_type, | |||
4346 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4347 | {"result_type", | |||
4348 | (PyCFunction)array_result_type, | |||
4349 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4350 | {"shares_memory", | |||
4351 | (PyCFunction)array_shares_memory, | |||
4352 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4353 | {"may_share_memory", | |||
4354 | (PyCFunction)array_may_share_memory, | |||
4355 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4356 | /* Datetime-related functions */ | |||
4357 | {"datetime_data", | |||
4358 | (PyCFunction)array_datetime_data, | |||
4359 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4360 | {"datetime_as_string", | |||
4361 | (PyCFunction)array_datetime_as_string, | |||
4362 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4363 | /* Datetime business-day API */ | |||
4364 | {"busday_offset", | |||
4365 | (PyCFunction)array_busday_offset, | |||
4366 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4367 | {"busday_count", | |||
4368 | (PyCFunction)array_busday_count, | |||
4369 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4370 | {"is_busday", | |||
4371 | (PyCFunction)array_is_busday, | |||
4372 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4373 | {"format_longfloat", | |||
4374 | (PyCFunction)format_longfloat, | |||
4375 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4376 | {"dragon4_positional", | |||
4377 | (PyCFunction)dragon4_positional, | |||
4378 | METH_FASTCALL0x0080 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4379 | {"dragon4_scientific", | |||
4380 | (PyCFunction)dragon4_scientific, | |||
4381 | METH_FASTCALL0x0080 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4382 | {"compare_chararrays", | |||
4383 | (PyCFunction)compare_chararrays, | |||
4384 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4385 | {"_vec_string", | |||
4386 | (PyCFunction)_vec_string, | |||
4387 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4388 | {"_insert", (PyCFunction)arr_insert, | |||
4389 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, | |||
4390 | "Insert vals sequentially into equivalent 1-d positions " | |||
4391 | "indicated by mask."}, | |||
4392 | {"bincount", (PyCFunction)arr_bincount, | |||
4393 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4394 | {"_monotonicity", (PyCFunction)arr__monotonicity, | |||
4395 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4396 | {"implement_array_function", | |||
4397 | (PyCFunction)array_implement_array_function, | |||
4398 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4399 | {"interp", (PyCFunction)arr_interp, | |||
4400 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4401 | {"interp_complex", (PyCFunction)arr_interp_complex, | |||
4402 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4403 | {"ravel_multi_index", (PyCFunction)arr_ravel_multi_index, | |||
4404 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4405 | {"unravel_index", (PyCFunction)arr_unravel_index, | |||
4406 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4407 | {"add_docstring", (PyCFunction)arr_add_docstring, | |||
4408 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4409 | {"packbits", (PyCFunction)io_pack, | |||
4410 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4411 | {"unpackbits", (PyCFunction)io_unpack, | |||
4412 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4413 | {"normalize_axis_index", (PyCFunction)normalize_axis_index, | |||
4414 | METH_FASTCALL0x0080 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4415 | {"set_legacy_print_mode", (PyCFunction)set_legacy_print_mode, | |||
4416 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4417 | {"_discover_array_parameters", (PyCFunction)_discover_array_parameters, | |||
4418 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4419 | {"_get_castingimpl", (PyCFunction)_get_castingimpl, | |||
4420 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4421 | /* from umath */ | |||
4422 | {"frompyfunc", | |||
4423 | (PyCFunction) ufunc_frompyfunc, | |||
4424 | METH_VARARGS0x0001 | METH_KEYWORDS0x0002, NULL((void*)0)}, | |||
4425 | {"seterrobj", | |||
4426 | (PyCFunction) ufunc_seterr, | |||
4427 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4428 | {"geterrobj", | |||
4429 | (PyCFunction) ufunc_geterr, | |||
4430 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4431 | {"_add_newdoc_ufunc", (PyCFunction)add_newdoc_ufunc, | |||
4432 | METH_VARARGS0x0001, NULL((void*)0)}, | |||
4433 | {"_set_madvise_hugepage", (PyCFunction)_set_madvise_hugepage, | |||
4434 | METH_O0x0008, NULL((void*)0)}, | |||
4435 | {"_reload_guard", (PyCFunction)_reload_guard, | |||
4436 | METH_NOARGS0x0004, | |||
4437 | "Give a warning on reload and big warning in sub-interpreters."}, | |||
4438 | {NULL((void*)0), NULL((void*)0), 0, NULL((void*)0)} /* sentinel */ | |||
4439 | }; | |||
4440 | ||||
4441 | #include "__multiarray_api.c" | |||
4442 | #include "array_method.h" | |||
4443 | ||||
4444 | /* Establish scalar-type hierarchy | |||
4445 | * | |||
4446 | * For dual inheritance we need to make sure that the objects being | |||
4447 | * inherited from have the tp->mro object initialized. This is | |||
4448 | * not necessarily true for the basic type objects of Python (it is | |||
4449 | * checked for single inheritance but not dual in PyType_Ready). | |||
4450 | * | |||
4451 | * Thus, we call PyType_Ready on the standard Python Types, here. | |||
4452 | */ | |||
4453 | static int | |||
4454 | setup_scalartypes(PyObject *NPY_UNUSED(dict)(__NPY_UNUSED_TAGGEDdict) __attribute__ ((__unused__))) | |||
4455 | { | |||
4456 | if (PyType_Ready(&PyBool_Type) < 0) { | |||
4457 | return -1; | |||
4458 | } | |||
4459 | if (PyType_Ready(&PyFloat_Type) < 0) { | |||
4460 | return -1; | |||
4461 | } | |||
4462 | if (PyType_Ready(&PyComplex_Type) < 0) { | |||
4463 | return -1; | |||
4464 | } | |||
4465 | if (PyType_Ready(&PyBytes_Type) < 0) { | |||
4466 | return -1; | |||
4467 | } | |||
4468 | if (PyType_Ready(&PyUnicode_Type) < 0) { | |||
4469 | return -1; | |||
4470 | } | |||
4471 | ||||
4472 | #define SINGLE_INHERIT(child, parent) \ | |||
4473 | Py##child##ArrType_Type.tp_base = &Py##parent##ArrType_Type; \ | |||
4474 | if (PyType_Ready(&Py##child##ArrType_Type) < 0) { \ | |||
4475 | PyErr_Print(); \ | |||
4476 | PyErr_Format(PyExc_SystemError, \ | |||
4477 | "could not initialize Py%sArrType_Type", \ | |||
4478 | #child); \ | |||
4479 | return -1; \ | |||
4480 | } | |||
4481 | ||||
4482 | if (PyType_Ready(&PyGenericArrType_Type) < 0) { | |||
4483 | return -1; | |||
4484 | } | |||
4485 | SINGLE_INHERIT(Number, Generic); | |||
4486 | SINGLE_INHERIT(Integer, Number); | |||
4487 | SINGLE_INHERIT(Inexact, Number); | |||
4488 | SINGLE_INHERIT(SignedInteger, Integer); | |||
4489 | SINGLE_INHERIT(UnsignedInteger, Integer); | |||
4490 | SINGLE_INHERIT(Floating, Inexact); | |||
4491 | SINGLE_INHERIT(ComplexFloating, Inexact); | |||
4492 | SINGLE_INHERIT(Flexible, Generic); | |||
4493 | SINGLE_INHERIT(Character, Flexible); | |||
4494 | ||||
4495 | #define DUAL_INHERIT(child, parent1, parent2) \ | |||
4496 | Py##child##ArrType_Type.tp_base = &Py##parent2##ArrType_Type; \ | |||
4497 | Py##child##ArrType_Type.tp_bases = \ | |||
4498 | Py_BuildValue_Py_BuildValue_SizeT("(OO)", &Py##parent2##ArrType_Type, \ | |||
4499 | &Py##parent1##_Type); \ | |||
4500 | Py##child##ArrType_Type.tp_hash = Py##parent1##_Type.tp_hash; \ | |||
4501 | if (PyType_Ready(&Py##child##ArrType_Type) < 0) { \ | |||
4502 | PyErr_Print(); \ | |||
4503 | PyErr_Format(PyExc_SystemError, \ | |||
4504 | "could not initialize Py%sArrType_Type", \ | |||
4505 | #child); \ | |||
4506 | return -1; \ | |||
4507 | } | |||
4508 | ||||
4509 | #define DUAL_INHERIT2(child, parent1, parent2) \ | |||
4510 | Py##child##ArrType_Type.tp_base = &Py##parent1##_Type; \ | |||
4511 | Py##child##ArrType_Type.tp_bases = \ | |||
4512 | Py_BuildValue_Py_BuildValue_SizeT("(OO)", &Py##parent1##_Type, \ | |||
4513 | &Py##parent2##ArrType_Type); \ | |||
4514 | Py##child##ArrType_Type.tp_richcompare = \ | |||
4515 | Py##parent1##_Type.tp_richcompare; \ | |||
4516 | Py##child##ArrType_Type.tp_hash = Py##parent1##_Type.tp_hash; \ | |||
4517 | if (PyType_Ready(&Py##child##ArrType_Type) < 0) { \ | |||
4518 | PyErr_Print(); \ | |||
4519 | PyErr_Format(PyExc_SystemError, \ | |||
4520 | "could not initialize Py%sArrType_Type", \ | |||
4521 | #child); \ | |||
4522 | return -1; \ | |||
4523 | } | |||
4524 | ||||
4525 | SINGLE_INHERIT(Bool, Generic); | |||
4526 | SINGLE_INHERIT(Byte, SignedInteger); | |||
4527 | SINGLE_INHERIT(Short, SignedInteger); | |||
4528 | SINGLE_INHERIT(Int, SignedInteger); | |||
4529 | SINGLE_INHERIT(Long, SignedInteger); | |||
4530 | SINGLE_INHERIT(LongLong, SignedInteger); | |||
4531 | ||||
4532 | /* Datetime doesn't fit in any category */ | |||
4533 | SINGLE_INHERIT(Datetime, Generic); | |||
4534 | /* Timedelta is an integer with an associated unit */ | |||
4535 | SINGLE_INHERIT(Timedelta, SignedInteger); | |||
4536 | ||||
4537 | SINGLE_INHERIT(UByte, UnsignedInteger); | |||
4538 | SINGLE_INHERIT(UShort, UnsignedInteger); | |||
4539 | SINGLE_INHERIT(UInt, UnsignedInteger); | |||
4540 | SINGLE_INHERIT(ULong, UnsignedInteger); | |||
4541 | SINGLE_INHERIT(ULongLong, UnsignedInteger); | |||
4542 | ||||
4543 | SINGLE_INHERIT(Half, Floating); | |||
4544 | SINGLE_INHERIT(Float, Floating); | |||
4545 | DUAL_INHERIT(Double, Float, Floating); | |||
4546 | SINGLE_INHERIT(LongDouble, Floating); | |||
4547 | ||||
4548 | SINGLE_INHERIT(CFloat, ComplexFloating); | |||
4549 | DUAL_INHERIT(CDouble, Complex, ComplexFloating); | |||
4550 | SINGLE_INHERIT(CLongDouble, ComplexFloating); | |||
4551 | ||||
4552 | DUAL_INHERIT2(String, String, Character); | |||
4553 | DUAL_INHERIT2(Unicode, Unicode, Character); | |||
4554 | ||||
4555 | SINGLE_INHERIT(Void, Flexible); | |||
4556 | ||||
4557 | SINGLE_INHERIT(Object, Generic); | |||
4558 | ||||
4559 | return 0; | |||
4560 | ||||
4561 | #undef SINGLE_INHERIT | |||
4562 | #undef DUAL_INHERIT | |||
4563 | #undef DUAL_INHERIT2 | |||
4564 | ||||
4565 | /* | |||
4566 | * Clean up string and unicode array types so they act more like | |||
4567 | * strings -- get their tables from the standard types. | |||
4568 | */ | |||
4569 | } | |||
4570 | ||||
4571 | /* place a flag dictionary in d */ | |||
4572 | ||||
4573 | static void | |||
4574 | set_flaginfo(PyObject *d) | |||
4575 | { | |||
4576 | PyObject *s; | |||
4577 | PyObject *newd; | |||
4578 | ||||
4579 | newd = PyDict_New(); | |||
4580 | ||||
4581 | #define _addnew(key, val, one) \ | |||
4582 | PyDict_SetItemString(newd, #key, s=PyLong_FromLong(val)); \ | |||
4583 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))); \ | |||
4584 | PyDict_SetItemString(newd, #one, s=PyLong_FromLong(val)); \ | |||
4585 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))) | |||
4586 | ||||
4587 | #define _addone(key, val) \ | |||
4588 | PyDict_SetItemString(newd, #key, s=PyLong_FromLong(val)); \ | |||
4589 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))) | |||
4590 | ||||
4591 | _addnew(OWNDATA, NPY_ARRAY_OWNDATA0x0004, O); | |||
4592 | _addnew(FORTRAN, NPY_ARRAY_F_CONTIGUOUS0x0002, F); | |||
4593 | _addnew(CONTIGUOUS, NPY_ARRAY_C_CONTIGUOUS0x0001, C); | |||
4594 | _addnew(ALIGNED, NPY_ARRAY_ALIGNED0x0100, A); | |||
4595 | _addnew(UPDATEIFCOPY, NPY_ARRAY_UPDATEIFCOPY0x1000, U); | |||
4596 | _addnew(WRITEBACKIFCOPY, NPY_ARRAY_WRITEBACKIFCOPY0x2000, X); | |||
4597 | _addnew(WRITEABLE, NPY_ARRAY_WRITEABLE0x0400, W); | |||
4598 | _addone(C_CONTIGUOUS, NPY_ARRAY_C_CONTIGUOUS0x0001); | |||
4599 | _addone(F_CONTIGUOUS, NPY_ARRAY_F_CONTIGUOUS0x0002); | |||
4600 | ||||
4601 | #undef _addone | |||
4602 | #undef _addnew | |||
4603 | ||||
4604 | PyDict_SetItemString(d, "_flagdict", newd); | |||
4605 | Py_DECREF(newd)_Py_DECREF(((PyObject*)(newd))); | |||
4606 | return; | |||
4607 | } | |||
4608 | ||||
4609 | NPY_VISIBILITY_HIDDEN__attribute__((visibility("hidden"))) PyObject * npy_ma_str_array = NULL((void*)0); | |||
4610 | NPY_VISIBILITY_HIDDEN__attribute__((visibility("hidden"))) PyObject * npy_ma_str_array_prepare = NULL((void*)0); | |||
4611 | NPY_VISIBILITY_HIDDEN__attribute__((visibility("hidden"))) PyObject * npy_ma_str_array_wrap = NULL((void*)0); | |||
4612 | NPY_VISIBILITY_HIDDEN__attribute__((visibility("hidden"))) PyObject * npy_ma_str_array_finalize = NULL((void*)0); | |||
4613 | NPY_VISIBILITY_HIDDEN__attribute__((visibility("hidden"))) PyObject * npy_ma_str_ufunc = NULL((void*)0); | |||
4614 | NPY_VISIBILITY_HIDDEN__attribute__((visibility("hidden"))) PyObject * npy_ma_str_implementation = NULL((void*)0); | |||
4615 | NPY_VISIBILITY_HIDDEN__attribute__((visibility("hidden"))) PyObject * npy_ma_str_order = NULL((void*)0); | |||
4616 | NPY_VISIBILITY_HIDDEN__attribute__((visibility("hidden"))) PyObject * npy_ma_str_copy = NULL((void*)0); | |||
4617 | NPY_VISIBILITY_HIDDEN__attribute__((visibility("hidden"))) PyObject * npy_ma_str_dtype = NULL((void*)0); | |||
4618 | NPY_VISIBILITY_HIDDEN__attribute__((visibility("hidden"))) PyObject * npy_ma_str_ndmin = NULL((void*)0); | |||
4619 | NPY_VISIBILITY_HIDDEN__attribute__((visibility("hidden"))) PyObject * npy_ma_str_axis1 = NULL((void*)0); | |||
4620 | NPY_VISIBILITY_HIDDEN__attribute__((visibility("hidden"))) PyObject * npy_ma_str_axis2 = NULL((void*)0); | |||
4621 | NPY_VISIBILITY_HIDDEN__attribute__((visibility("hidden"))) PyObject * npy_ma_str_like = NULL((void*)0); | |||
4622 | NPY_VISIBILITY_HIDDEN__attribute__((visibility("hidden"))) PyObject * npy_ma_str_numpy = NULL((void*)0); | |||
4623 | ||||
4624 | static int | |||
4625 | intern_strings(void) | |||
4626 | { | |||
4627 | npy_ma_str_array = PyUnicode_InternFromString("__array__"); | |||
4628 | npy_ma_str_array_prepare = PyUnicode_InternFromString("__array_prepare__"); | |||
4629 | npy_ma_str_array_wrap = PyUnicode_InternFromString("__array_wrap__"); | |||
4630 | npy_ma_str_array_finalize = PyUnicode_InternFromString("__array_finalize__"); | |||
4631 | npy_ma_str_ufunc = PyUnicode_InternFromString("__array_ufunc__"); | |||
4632 | npy_ma_str_implementation = PyUnicode_InternFromString("_implementation"); | |||
4633 | npy_ma_str_order = PyUnicode_InternFromString("order"); | |||
4634 | npy_ma_str_copy = PyUnicode_InternFromString("copy"); | |||
4635 | npy_ma_str_dtype = PyUnicode_InternFromString("dtype"); | |||
4636 | npy_ma_str_ndmin = PyUnicode_InternFromString("ndmin"); | |||
4637 | npy_ma_str_axis1 = PyUnicode_InternFromString("axis1"); | |||
4638 | npy_ma_str_axis2 = PyUnicode_InternFromString("axis2"); | |||
4639 | npy_ma_str_like = PyUnicode_InternFromString("like"); | |||
4640 | npy_ma_str_numpy = PyUnicode_InternFromString("numpy"); | |||
4641 | ||||
4642 | return npy_ma_str_array && npy_ma_str_array_prepare && | |||
4643 | npy_ma_str_array_wrap && npy_ma_str_array_finalize && | |||
4644 | npy_ma_str_ufunc && npy_ma_str_implementation && | |||
4645 | npy_ma_str_order && npy_ma_str_copy && npy_ma_str_dtype && | |||
4646 | npy_ma_str_ndmin && npy_ma_str_axis1 && npy_ma_str_axis2 && | |||
4647 | npy_ma_str_like && npy_ma_str_numpy; | |||
4648 | } | |||
4649 | ||||
4650 | static struct PyModuleDef moduledef = { | |||
4651 | PyModuleDef_HEAD_INIT{ { 1, ((void*)0) }, ((void*)0), 0, ((void*)0), }, | |||
4652 | "_multiarray_umath", | |||
4653 | NULL((void*)0), | |||
4654 | -1, | |||
4655 | array_module_methods, | |||
4656 | NULL((void*)0), | |||
4657 | NULL((void*)0), | |||
4658 | NULL((void*)0), | |||
4659 | NULL((void*)0) | |||
4660 | }; | |||
4661 | ||||
4662 | /* Initialization function for the module */ | |||
4663 | PyMODINIT_FUNCPyObject* PyInit__multiarray_umath(void) { | |||
4664 | PyObject *m, *d, *s; | |||
4665 | PyObject *c_api; | |||
4666 | ||||
4667 | /* Initialize CPU features */ | |||
4668 | if (npy_cpu_init() < 0) { | |||
| ||||
4669 | goto err; | |||
4670 | } | |||
4671 | ||||
4672 | /* Create the module and add the functions */ | |||
4673 | m = PyModule_Create(&moduledef)PyModule_Create2(&moduledef, 1013); | |||
| ||||
4674 | if (!m) { | |||
4675 | goto err; | |||
4676 | } | |||
4677 | ||||
4678 | #if defined(MS_WIN64) && defined(__GNUC__4) | |||
4679 | PyErr_WarnEx(PyExc_Warning, | |||
4680 | "Numpy built with MINGW-W64 on Windows 64 bits is experimental, " \ | |||
4681 | "and only available for \n" \ | |||
4682 | "testing. You are advised not to use it for production. \n\n" \ | |||
4683 | "CRASHES ARE TO BE EXPECTED - PLEASE REPORT THEM TO NUMPY DEVELOPERS", | |||
4684 | 1); | |||
4685 | #endif | |||
4686 | ||||
4687 | /* Initialize access to the PyDateTime API */ | |||
4688 | numpy_pydatetime_import(); | |||
4689 | ||||
4690 | if (PyErr_Occurred()) { | |||
4691 | goto err; | |||
4692 | } | |||
4693 | ||||
4694 | /* Add some symbolic constants to the module */ | |||
4695 | d = PyModule_GetDict(m); | |||
4696 | if (!d) { | |||
4697 | goto err; | |||
4698 | } | |||
4699 | ||||
4700 | if (PyType_Ready(&PyUFunc_Type) < 0) { | |||
4701 | goto err; | |||
4702 | } | |||
4703 | ||||
4704 | /* Load the ufunc operators into the array module's namespace */ | |||
4705 | if (InitOperators(d) < 0) { | |||
4706 | goto err; | |||
4707 | } | |||
4708 | ||||
4709 | if (set_matmul_flags(d) < 0) { | |||
4710 | goto err; | |||
4711 | } | |||
4712 | ||||
4713 | PyArrayDTypeMeta_Type.tp_base = &PyType_Type; | |||
4714 | if (PyType_Ready(&PyArrayDTypeMeta_Type) < 0) { | |||
4715 | goto err; | |||
4716 | } | |||
4717 | ||||
4718 | PyArrayDescr_Type(*(PyTypeObject *)(&PyArrayDescr_TypeFull)).tp_hash = PyArray_DescrHash; | |||
4719 | Py_SET_TYPE(&PyArrayDescr_Type, &PyArrayDTypeMeta_Type)(((((PyObject*)(&(*(PyTypeObject *)(&PyArrayDescr_TypeFull ))))->ob_type) = (&PyArrayDTypeMeta_Type)), (void)0); | |||
4720 | if (PyType_Ready(&PyArrayDescr_Type(*(PyTypeObject *)(&PyArrayDescr_TypeFull))) < 0) { | |||
4721 | goto err; | |||
4722 | } | |||
4723 | ||||
4724 | initialize_casting_tables(); | |||
4725 | initialize_numeric_types(); | |||
4726 | if (initscalarmath(m) < 0) { | |||
4727 | goto err; | |||
4728 | } | |||
4729 | ||||
4730 | if (PyType_Ready(&PyArray_Type) < 0) { | |||
4731 | goto err; | |||
4732 | } | |||
4733 | if (setup_scalartypes(d) < 0) { | |||
4734 | goto err; | |||
4735 | } | |||
4736 | PyArrayIter_Type.tp_iter = PyObject_SelfIter; | |||
4737 | NpyIter_Type.tp_iter = PyObject_SelfIter; | |||
4738 | PyArrayMultiIter_Type.tp_iter = PyObject_SelfIter; | |||
4739 | PyArrayMultiIter_Type.tp_free = PyArray_freePyMem_RawFree; | |||
4740 | if (PyType_Ready(&PyArrayIter_Type) < 0) { | |||
4741 | goto err; | |||
4742 | } | |||
4743 | if (PyType_Ready(&PyArrayMapIter_Type) < 0) { | |||
4744 | goto err; | |||
4745 | } | |||
4746 | if (PyType_Ready(&PyArrayMultiIter_Type) < 0) { | |||
4747 | goto err; | |||
4748 | } | |||
4749 | PyArrayNeighborhoodIter_Type.tp_new = PyType_GenericNew; | |||
4750 | if (PyType_Ready(&PyArrayNeighborhoodIter_Type) < 0) { | |||
4751 | goto err; | |||
4752 | } | |||
4753 | if (PyType_Ready(&NpyIter_Type) < 0) { | |||
4754 | goto err; | |||
4755 | } | |||
4756 | ||||
4757 | if (PyType_Ready(&PyArrayFlags_Type) < 0) { | |||
4758 | goto err; | |||
4759 | } | |||
4760 | NpyBusDayCalendar_Type.tp_new = PyType_GenericNew; | |||
4761 | if (PyType_Ready(&NpyBusDayCalendar_Type) < 0) { | |||
4762 | goto err; | |||
4763 | } | |||
4764 | ||||
4765 | c_api = PyCapsule_New((void *)PyArray_API, NULL((void*)0), NULL((void*)0)); | |||
4766 | if (c_api == NULL((void*)0)) { | |||
4767 | goto err; | |||
4768 | } | |||
4769 | PyDict_SetItemString(d, "_ARRAY_API", c_api); | |||
4770 | Py_DECREF(c_api)_Py_DECREF(((PyObject*)(c_api))); | |||
4771 | ||||
4772 | c_api = PyCapsule_New((void *)PyUFunc_API, NULL((void*)0), NULL((void*)0)); | |||
4773 | if (c_api == NULL((void*)0)) { | |||
4774 | goto err; | |||
4775 | } | |||
4776 | PyDict_SetItemString(d, "_UFUNC_API", c_api); | |||
4777 | Py_DECREF(c_api)_Py_DECREF(((PyObject*)(c_api))); | |||
4778 | if (PyErr_Occurred()) { | |||
4779 | goto err; | |||
4780 | } | |||
4781 | ||||
4782 | /* | |||
4783 | * PyExc_Exception should catch all the standard errors that are | |||
4784 | * now raised instead of the string exception "multiarray.error" | |||
4785 | ||||
4786 | * This is for backward compatibility with existing code. | |||
4787 | */ | |||
4788 | PyDict_SetItemString (d, "error", PyExc_Exception); | |||
4789 | ||||
4790 | s = PyLong_FromLong(NPY_TRACE_DOMAIN389047); | |||
4791 | PyDict_SetItemString(d, "tracemalloc_domain", s); | |||
4792 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))); | |||
4793 | ||||
4794 | s = PyUnicode_FromString("3.1"); | |||
4795 | PyDict_SetItemString(d, "__version__", s); | |||
4796 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))); | |||
4797 | ||||
4798 | s = npy_cpu_features_dict(); | |||
4799 | if (s == NULL((void*)0)) { | |||
4800 | goto err; | |||
4801 | } | |||
4802 | if (PyDict_SetItemString(d, "__cpu_features__", s) < 0) { | |||
4803 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))); | |||
4804 | goto err; | |||
4805 | } | |||
4806 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))); | |||
4807 | ||||
4808 | s = npy_cpu_baseline_list(); | |||
4809 | if (s == NULL((void*)0)) { | |||
4810 | goto err; | |||
4811 | } | |||
4812 | if (PyDict_SetItemString(d, "__cpu_baseline__", s) < 0) { | |||
4813 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))); | |||
4814 | goto err; | |||
4815 | } | |||
4816 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))); | |||
4817 | ||||
4818 | s = npy_cpu_dispatch_list(); | |||
4819 | if (s == NULL((void*)0)) { | |||
4820 | goto err; | |||
4821 | } | |||
4822 | if (PyDict_SetItemString(d, "__cpu_dispatch__", s) < 0) { | |||
4823 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))); | |||
4824 | goto err; | |||
4825 | } | |||
4826 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))); | |||
4827 | ||||
4828 | s = PyCapsule_New((void *)_datetime_strings, NULL((void*)0), NULL((void*)0)); | |||
4829 | if (s == NULL((void*)0)) { | |||
4830 | goto err; | |||
4831 | } | |||
4832 | PyDict_SetItemString(d, "DATETIMEUNITS", s); | |||
4833 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))); | |||
4834 | ||||
4835 | #define ADDCONST(NAME) \ | |||
4836 | s = PyLong_FromLong(NPY_##NAME); \ | |||
4837 | PyDict_SetItemString(d, #NAME, s); \ | |||
4838 | Py_DECREF(s)_Py_DECREF(((PyObject*)(s))) | |||
4839 | ||||
4840 | ||||
4841 | ADDCONST(ALLOW_THREADS); | |||
4842 | ADDCONST(BUFSIZE); | |||
4843 | ADDCONST(CLIP); | |||
4844 | ||||
4845 | ADDCONST(ITEM_HASOBJECT); | |||
4846 | ADDCONST(LIST_PICKLE); | |||
4847 | ADDCONST(ITEM_IS_POINTER); | |||
4848 | ADDCONST(NEEDS_INIT); | |||
4849 | ADDCONST(NEEDS_PYAPI); | |||
4850 | ADDCONST(USE_GETITEM); | |||
4851 | ADDCONST(USE_SETITEM); | |||
4852 | ||||
4853 | ADDCONST(RAISE); | |||
4854 | ADDCONST(WRAP); | |||
4855 | ADDCONST(MAXDIMS); | |||
4856 | ||||
4857 | ADDCONST(MAY_SHARE_BOUNDS); | |||
4858 | ADDCONST(MAY_SHARE_EXACT); | |||
4859 | #undef ADDCONST | |||
4860 | ||||
4861 | PyDict_SetItemString(d, "ndarray", (PyObject *)&PyArray_Type); | |||
4862 | PyDict_SetItemString(d, "flatiter", (PyObject *)&PyArrayIter_Type); | |||
4863 | PyDict_SetItemString(d, "nditer", (PyObject *)&NpyIter_Type); | |||
4864 | PyDict_SetItemString(d, "broadcast", | |||
4865 | (PyObject *)&PyArrayMultiIter_Type); | |||
4866 | PyDict_SetItemString(d, "dtype", (PyObject *)&PyArrayDescr_Type(*(PyTypeObject *)(&PyArrayDescr_TypeFull))); | |||
4867 | PyDict_SetItemString(d, "flagsobj", (PyObject *)&PyArrayFlags_Type); | |||
4868 | ||||
4869 | /* Business day calendar object */ | |||
4870 | PyDict_SetItemString(d, "busdaycalendar", | |||
4871 | (PyObject *)&NpyBusDayCalendar_Type); | |||
4872 | set_flaginfo(d); | |||
4873 | ||||
4874 | /* Create the typeinfo types */ | |||
4875 | if (typeinfo_init_structsequences(d) < 0) { | |||
4876 | goto err; | |||
4877 | } | |||
4878 | ||||
4879 | if (!intern_strings()) { | |||
4880 | goto err; | |||
4881 | } | |||
4882 | ||||
4883 | if (set_typeinfo(d) != 0) { | |||
4884 | goto err; | |||
4885 | } | |||
4886 | if (PyType_Ready(&PyArrayMethod_Type) < 0) { | |||
4887 | goto err; | |||
4888 | } | |||
4889 | if (PyType_Ready(&PyBoundArrayMethod_Type) < 0) { | |||
4890 | goto err; | |||
4891 | } | |||
4892 | if (initialize_and_map_pytypes_to_dtypes() < 0) { | |||
4893 | goto err; | |||
4894 | } | |||
4895 | ||||
4896 | if (PyArray_InitializeCasts() < 0) { | |||
4897 | goto err; | |||
4898 | } | |||
4899 | ||||
4900 | if (initumath(m) != 0) { | |||
4901 | goto err; | |||
4902 | } | |||
4903 | return m; | |||
4904 | ||||
4905 | err: | |||
4906 | if (!PyErr_Occurred()) { | |||
4907 | PyErr_SetString(PyExc_RuntimeError, | |||
4908 | "cannot load multiarray module."); | |||
4909 | } | |||
4910 | return NULL((void*)0); | |||
4911 | } |
1 | #ifndef PyModule_Create2 |
2 | struct _object; |
3 | typedef struct _object PyObject; |
4 | PyObject* clang_analyzer_PyObject_New_Reference(); |
5 | PyObject* PyModule_Create2(PyModuleDef *def, int module_api_version) { |
6 | return clang_analyzer_PyObject_New_Reference(); |
7 | } |
8 | #else |
9 | #warning "API PyModule_Create2 is defined as a macro." |
10 | #endif |