| File: | numpy/core/src/multiarray/number.c |
| Warning: | line 423, column 27 PyObject ownership leak with reference count of 1 |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | #define PY_SSIZE_T_CLEAN | ||||
| 2 | #include <Python.h> | ||||
| 3 | #include "structmember.h" | ||||
| 4 | |||||
| 5 | /*#include <stdio.h>*/ | ||||
| 6 | #define NPY_NO_DEPRECATED_API0x0000000E NPY_API_VERSION0x0000000E | ||||
| 7 | #define _MULTIARRAYMODULE | ||||
| 8 | #include "numpy/arrayobject.h" | ||||
| 9 | |||||
| 10 | #include "npy_config.h" | ||||
| 11 | #include "npy_pycompat.h" | ||||
| 12 | #include "npy_import.h" | ||||
| 13 | #include "common.h" | ||||
| 14 | #include "number.h" | ||||
| 15 | #include "temp_elide.h" | ||||
| 16 | |||||
| 17 | #include "binop_override.h" | ||||
| 18 | #include "ufunc_override.h" | ||||
| 19 | #include "abstractdtypes.h" | ||||
| 20 | #include "common_dtype.h" | ||||
| 21 | #include "convert_datatype.h" | ||||
| 22 | |||||
| 23 | /************************************************************************* | ||||
| 24 | **************** Implement Number Protocol **************************** | ||||
| 25 | *************************************************************************/ | ||||
| 26 | |||||
| 27 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) NumericOps n_ops; /* NB: static objects initialized to zero */ | ||||
| 28 | |||||
| 29 | /* | ||||
| 30 | * Forward declarations. Might want to move functions around instead | ||||
| 31 | */ | ||||
| 32 | static PyObject * | ||||
| 33 | array_inplace_add(PyArrayObject *m1, PyObject *m2); | ||||
| 34 | static PyObject * | ||||
| 35 | array_inplace_subtract(PyArrayObject *m1, PyObject *m2); | ||||
| 36 | static PyObject * | ||||
| 37 | array_inplace_multiply(PyArrayObject *m1, PyObject *m2); | ||||
| 38 | static PyObject * | ||||
| 39 | array_inplace_true_divide(PyArrayObject *m1, PyObject *m2); | ||||
| 40 | static PyObject * | ||||
| 41 | array_inplace_floor_divide(PyArrayObject *m1, PyObject *m2); | ||||
| 42 | static PyObject * | ||||
| 43 | array_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2); | ||||
| 44 | static PyObject * | ||||
| 45 | array_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2); | ||||
| 46 | static PyObject * | ||||
| 47 | array_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2); | ||||
| 48 | static PyObject * | ||||
| 49 | array_inplace_left_shift(PyArrayObject *m1, PyObject *m2); | ||||
| 50 | static PyObject * | ||||
| 51 | array_inplace_right_shift(PyArrayObject *m1, PyObject *m2); | ||||
| 52 | static PyObject * | ||||
| 53 | array_inplace_remainder(PyArrayObject *m1, PyObject *m2); | ||||
| 54 | static PyObject * | ||||
| 55 | array_inplace_power(PyArrayObject *a1, PyObject *o2, PyObject *NPY_UNUSED(modulo)(__NPY_UNUSED_TAGGEDmodulo) __attribute__ ((__unused__))); | ||||
| 56 | |||||
| 57 | /* | ||||
| 58 | * Dictionary can contain any of the numeric operations, by name. | ||||
| 59 | * Those not present will not be changed | ||||
| 60 | */ | ||||
| 61 | |||||
| 62 | /* FIXME - macro contains a return */ | ||||
| 63 | #define SET(op)temp = _PyDict_GetItemStringWithError(dict, "op"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.op))); n_ops.op = temp; } temp = _PyDict_GetItemStringWithError(dict, #op); \ | ||||
| 64 | if (temp == NULL((void*)0) && PyErr_Occurred()) { \ | ||||
| 65 | return -1; \ | ||||
| 66 | } \ | ||||
| 67 | else if (temp != NULL((void*)0)) { \ | ||||
| 68 | if (!(PyCallable_Check(temp))) { \ | ||||
| 69 | return -1; \ | ||||
| 70 | } \ | ||||
| 71 | Py_INCREF(temp)_Py_INCREF(((PyObject*)(temp))); \ | ||||
| 72 | Py_XDECREF(n_ops.op)_Py_XDECREF(((PyObject*)(n_ops.op))); \ | ||||
| 73 | n_ops.op = temp; \ | ||||
| 74 | } | ||||
| 75 | |||||
| 76 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int | ||||
| 77 | _PyArray_SetNumericOps(PyObject *dict) | ||||
| 78 | { | ||||
| 79 | PyObject *temp = NULL((void*)0); | ||||
| 80 | SET(add)temp = _PyDict_GetItemStringWithError(dict, "add"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.add))); n_ops.add = temp; }; | ||||
| 81 | SET(subtract)temp = _PyDict_GetItemStringWithError(dict, "subtract"); if ( temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp)) ) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.subtract))); n_ops.subtract = temp; }; | ||||
| 82 | SET(multiply)temp = _PyDict_GetItemStringWithError(dict, "multiply"); if ( temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp)) ) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.multiply))); n_ops.multiply = temp; }; | ||||
| 83 | SET(divide)temp = _PyDict_GetItemStringWithError(dict, "divide"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.divide))); n_ops.divide = temp; }; | ||||
| 84 | SET(remainder)temp = _PyDict_GetItemStringWithError(dict, "remainder"); if ( temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp)) ) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.remainder))); n_ops.remainder = temp; }; | ||||
| 85 | SET(divmod)temp = _PyDict_GetItemStringWithError(dict, "divmod"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.divmod))); n_ops.divmod = temp; }; | ||||
| 86 | SET(power)temp = _PyDict_GetItemStringWithError(dict, "power"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.power))); n_ops.power = temp; }; | ||||
| 87 | SET(square)temp = _PyDict_GetItemStringWithError(dict, "square"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.square))); n_ops.square = temp; }; | ||||
| 88 | SET(reciprocal)temp = _PyDict_GetItemStringWithError(dict, "reciprocal"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1 ; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp ))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.reciprocal))); n_ops.reciprocal = temp; }; | ||||
| 89 | SET(_ones_like)temp = _PyDict_GetItemStringWithError(dict, "_ones_like"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1 ; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp ))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops._ones_like))); n_ops._ones_like = temp; }; | ||||
| 90 | SET(sqrt)temp = _PyDict_GetItemStringWithError(dict, "sqrt"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.sqrt))); n_ops.sqrt = temp; }; | ||||
| 91 | SET(cbrt)temp = _PyDict_GetItemStringWithError(dict, "cbrt"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.cbrt))); n_ops.cbrt = temp; }; | ||||
| 92 | SET(negative)temp = _PyDict_GetItemStringWithError(dict, "negative"); if ( temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp)) ) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.negative))); n_ops.negative = temp; }; | ||||
| 93 | SET(positive)temp = _PyDict_GetItemStringWithError(dict, "positive"); if ( temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp)) ) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.positive))); n_ops.positive = temp; }; | ||||
| 94 | SET(absolute)temp = _PyDict_GetItemStringWithError(dict, "absolute"); if ( temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp)) ) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.absolute))); n_ops.absolute = temp; }; | ||||
| 95 | SET(invert)temp = _PyDict_GetItemStringWithError(dict, "invert"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.invert))); n_ops.invert = temp; }; | ||||
| 96 | SET(left_shift)temp = _PyDict_GetItemStringWithError(dict, "left_shift"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1 ; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp ))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.left_shift))); n_ops.left_shift = temp; }; | ||||
| 97 | SET(right_shift)temp = _PyDict_GetItemStringWithError(dict, "right_shift"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1 ; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp ))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.right_shift))); n_ops.right_shift = temp; }; | ||||
| 98 | SET(bitwise_and)temp = _PyDict_GetItemStringWithError(dict, "bitwise_and"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1 ; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp ))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.bitwise_and))); n_ops.bitwise_and = temp; }; | ||||
| 99 | SET(bitwise_or)temp = _PyDict_GetItemStringWithError(dict, "bitwise_or"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1 ; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp ))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.bitwise_or))); n_ops.bitwise_or = temp; }; | ||||
| 100 | SET(bitwise_xor)temp = _PyDict_GetItemStringWithError(dict, "bitwise_xor"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1 ; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp ))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.bitwise_xor))); n_ops.bitwise_xor = temp; }; | ||||
| 101 | SET(less)temp = _PyDict_GetItemStringWithError(dict, "less"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.less))); n_ops.less = temp; }; | ||||
| 102 | SET(less_equal)temp = _PyDict_GetItemStringWithError(dict, "less_equal"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1 ; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp ))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.less_equal))); n_ops.less_equal = temp; }; | ||||
| 103 | SET(equal)temp = _PyDict_GetItemStringWithError(dict, "equal"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.equal))); n_ops.equal = temp; }; | ||||
| 104 | SET(not_equal)temp = _PyDict_GetItemStringWithError(dict, "not_equal"); if ( temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp)) ) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.not_equal))); n_ops.not_equal = temp; }; | ||||
| 105 | SET(greater)temp = _PyDict_GetItemStringWithError(dict, "greater"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.greater))); n_ops.greater = temp; }; | ||||
| 106 | SET(greater_equal)temp = _PyDict_GetItemStringWithError(dict, "greater_equal"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check( temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.greater_equal))); n_ops.greater_equal = temp ; }; | ||||
| 107 | SET(floor_divide)temp = _PyDict_GetItemStringWithError(dict, "floor_divide"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1 ; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp ))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.floor_divide))); n_ops.floor_divide = temp ; }; | ||||
| 108 | SET(true_divide)temp = _PyDict_GetItemStringWithError(dict, "true_divide"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1 ; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp ))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.true_divide))); n_ops.true_divide = temp; }; | ||||
| 109 | SET(logical_or)temp = _PyDict_GetItemStringWithError(dict, "logical_or"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1 ; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp ))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.logical_or))); n_ops.logical_or = temp; }; | ||||
| 110 | SET(logical_and)temp = _PyDict_GetItemStringWithError(dict, "logical_and"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1 ; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp ))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.logical_and))); n_ops.logical_and = temp; }; | ||||
| 111 | SET(floor)temp = _PyDict_GetItemStringWithError(dict, "floor"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.floor))); n_ops.floor = temp; }; | ||||
| 112 | SET(ceil)temp = _PyDict_GetItemStringWithError(dict, "ceil"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.ceil))); n_ops.ceil = temp; }; | ||||
| 113 | SET(maximum)temp = _PyDict_GetItemStringWithError(dict, "maximum"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.maximum))); n_ops.maximum = temp; }; | ||||
| 114 | SET(minimum)temp = _PyDict_GetItemStringWithError(dict, "minimum"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.minimum))); n_ops.minimum = temp; }; | ||||
| 115 | SET(rint)temp = _PyDict_GetItemStringWithError(dict, "rint"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.rint))); n_ops.rint = temp; }; | ||||
| 116 | SET(conjugate)temp = _PyDict_GetItemStringWithError(dict, "conjugate"); if ( temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp)) ) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF (((PyObject*)(n_ops.conjugate))); n_ops.conjugate = temp; }; | ||||
| 117 | SET(matmul)temp = _PyDict_GetItemStringWithError(dict, "matmul"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.matmul))); n_ops.matmul = temp; }; | ||||
| 118 | SET(clip)temp = _PyDict_GetItemStringWithError(dict, "clip"); if (temp == ((void*)0) && PyErr_Occurred()) { return -1; } else if (temp != ((void*)0)) { if (!(PyCallable_Check(temp))) { return -1; } _Py_INCREF(((PyObject*)(temp))); _Py_XDECREF(((PyObject *)(n_ops.clip))); n_ops.clip = temp; }; | ||||
| 119 | return 0; | ||||
| 120 | } | ||||
| 121 | |||||
| 122 | /*NUMPY_API | ||||
| 123 | *Set internal structure with number functions that all arrays will use | ||||
| 124 | */ | ||||
| 125 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) int | ||||
| 126 | PyArray_SetNumericOps(PyObject *dict) | ||||
| 127 | { | ||||
| 128 | /* 2018-09-09, 1.16 */ | ||||
| 129 | if (DEPRECATE("PyArray_SetNumericOps is deprecated. Use "PyErr_WarnEx(PyExc_DeprecationWarning,"PyArray_SetNumericOps is deprecated. Use " "PyUFunc_ReplaceLoopBySignature to replace ufunc inner loop functions " "instead.",1) | ||||
| 130 | "PyUFunc_ReplaceLoopBySignature to replace ufunc inner loop functions "PyErr_WarnEx(PyExc_DeprecationWarning,"PyArray_SetNumericOps is deprecated. Use " "PyUFunc_ReplaceLoopBySignature to replace ufunc inner loop functions " "instead.",1) | ||||
| 131 | "instead.")PyErr_WarnEx(PyExc_DeprecationWarning,"PyArray_SetNumericOps is deprecated. Use " "PyUFunc_ReplaceLoopBySignature to replace ufunc inner loop functions " "instead.",1) < 0) { | ||||
| 132 | return -1; | ||||
| 133 | } | ||||
| 134 | return _PyArray_SetNumericOps(dict); | ||||
| 135 | } | ||||
| 136 | |||||
| 137 | /* Note - macro contains goto */ | ||||
| 138 | #define GET(op)if (n_ops.op && (PyDict_SetItemString(dict, "op", n_ops .op)==-1)) goto fail; if (n_ops.op && \ | ||||
| 139 | (PyDict_SetItemString(dict, #op, n_ops.op)==-1)) \ | ||||
| 140 | goto fail; | ||||
| 141 | |||||
| 142 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||
| 143 | _PyArray_GetNumericOps(void) | ||||
| 144 | { | ||||
| 145 | PyObject *dict; | ||||
| 146 | if ((dict = PyDict_New())==NULL((void*)0)) | ||||
| 147 | return NULL((void*)0); | ||||
| 148 | GET(add)if (n_ops.add && (PyDict_SetItemString(dict, "add", n_ops .add)==-1)) goto fail;; | ||||
| 149 | GET(subtract)if (n_ops.subtract && (PyDict_SetItemString(dict, "subtract" , n_ops.subtract)==-1)) goto fail;; | ||||
| 150 | GET(multiply)if (n_ops.multiply && (PyDict_SetItemString(dict, "multiply" , n_ops.multiply)==-1)) goto fail;; | ||||
| 151 | GET(divide)if (n_ops.divide && (PyDict_SetItemString(dict, "divide" , n_ops.divide)==-1)) goto fail;; | ||||
| 152 | GET(remainder)if (n_ops.remainder && (PyDict_SetItemString(dict, "remainder" , n_ops.remainder)==-1)) goto fail;; | ||||
| 153 | GET(divmod)if (n_ops.divmod && (PyDict_SetItemString(dict, "divmod" , n_ops.divmod)==-1)) goto fail;; | ||||
| 154 | GET(power)if (n_ops.power && (PyDict_SetItemString(dict, "power" , n_ops.power)==-1)) goto fail;; | ||||
| 155 | GET(square)if (n_ops.square && (PyDict_SetItemString(dict, "square" , n_ops.square)==-1)) goto fail;; | ||||
| 156 | GET(reciprocal)if (n_ops.reciprocal && (PyDict_SetItemString(dict, "reciprocal" , n_ops.reciprocal)==-1)) goto fail;; | ||||
| 157 | GET(_ones_like)if (n_ops._ones_like && (PyDict_SetItemString(dict, "_ones_like" , n_ops._ones_like)==-1)) goto fail;; | ||||
| 158 | GET(sqrt)if (n_ops.sqrt && (PyDict_SetItemString(dict, "sqrt", n_ops.sqrt)==-1)) goto fail;; | ||||
| 159 | GET(negative)if (n_ops.negative && (PyDict_SetItemString(dict, "negative" , n_ops.negative)==-1)) goto fail;; | ||||
| 160 | GET(positive)if (n_ops.positive && (PyDict_SetItemString(dict, "positive" , n_ops.positive)==-1)) goto fail;; | ||||
| 161 | GET(absolute)if (n_ops.absolute && (PyDict_SetItemString(dict, "absolute" , n_ops.absolute)==-1)) goto fail;; | ||||
| 162 | GET(invert)if (n_ops.invert && (PyDict_SetItemString(dict, "invert" , n_ops.invert)==-1)) goto fail;; | ||||
| 163 | GET(left_shift)if (n_ops.left_shift && (PyDict_SetItemString(dict, "left_shift" , n_ops.left_shift)==-1)) goto fail;; | ||||
| 164 | GET(right_shift)if (n_ops.right_shift && (PyDict_SetItemString(dict, "right_shift" , n_ops.right_shift)==-1)) goto fail;; | ||||
| 165 | GET(bitwise_and)if (n_ops.bitwise_and && (PyDict_SetItemString(dict, "bitwise_and" , n_ops.bitwise_and)==-1)) goto fail;; | ||||
| 166 | GET(bitwise_or)if (n_ops.bitwise_or && (PyDict_SetItemString(dict, "bitwise_or" , n_ops.bitwise_or)==-1)) goto fail;; | ||||
| 167 | GET(bitwise_xor)if (n_ops.bitwise_xor && (PyDict_SetItemString(dict, "bitwise_xor" , n_ops.bitwise_xor)==-1)) goto fail;; | ||||
| 168 | GET(less)if (n_ops.less && (PyDict_SetItemString(dict, "less", n_ops.less)==-1)) goto fail;; | ||||
| 169 | GET(less_equal)if (n_ops.less_equal && (PyDict_SetItemString(dict, "less_equal" , n_ops.less_equal)==-1)) goto fail;; | ||||
| 170 | GET(equal)if (n_ops.equal && (PyDict_SetItemString(dict, "equal" , n_ops.equal)==-1)) goto fail;; | ||||
| 171 | GET(not_equal)if (n_ops.not_equal && (PyDict_SetItemString(dict, "not_equal" , n_ops.not_equal)==-1)) goto fail;; | ||||
| 172 | GET(greater)if (n_ops.greater && (PyDict_SetItemString(dict, "greater" , n_ops.greater)==-1)) goto fail;; | ||||
| 173 | GET(greater_equal)if (n_ops.greater_equal && (PyDict_SetItemString(dict , "greater_equal", n_ops.greater_equal)==-1)) goto fail;; | ||||
| 174 | GET(floor_divide)if (n_ops.floor_divide && (PyDict_SetItemString(dict, "floor_divide", n_ops.floor_divide)==-1)) goto fail;; | ||||
| 175 | GET(true_divide)if (n_ops.true_divide && (PyDict_SetItemString(dict, "true_divide" , n_ops.true_divide)==-1)) goto fail;; | ||||
| 176 | GET(logical_or)if (n_ops.logical_or && (PyDict_SetItemString(dict, "logical_or" , n_ops.logical_or)==-1)) goto fail;; | ||||
| 177 | GET(logical_and)if (n_ops.logical_and && (PyDict_SetItemString(dict, "logical_and" , n_ops.logical_and)==-1)) goto fail;; | ||||
| 178 | GET(floor)if (n_ops.floor && (PyDict_SetItemString(dict, "floor" , n_ops.floor)==-1)) goto fail;; | ||||
| 179 | GET(ceil)if (n_ops.ceil && (PyDict_SetItemString(dict, "ceil", n_ops.ceil)==-1)) goto fail;; | ||||
| 180 | GET(maximum)if (n_ops.maximum && (PyDict_SetItemString(dict, "maximum" , n_ops.maximum)==-1)) goto fail;; | ||||
| 181 | GET(minimum)if (n_ops.minimum && (PyDict_SetItemString(dict, "minimum" , n_ops.minimum)==-1)) goto fail;; | ||||
| 182 | GET(rint)if (n_ops.rint && (PyDict_SetItemString(dict, "rint", n_ops.rint)==-1)) goto fail;; | ||||
| 183 | GET(conjugate)if (n_ops.conjugate && (PyDict_SetItemString(dict, "conjugate" , n_ops.conjugate)==-1)) goto fail;; | ||||
| 184 | GET(matmul)if (n_ops.matmul && (PyDict_SetItemString(dict, "matmul" , n_ops.matmul)==-1)) goto fail;; | ||||
| 185 | GET(clip)if (n_ops.clip && (PyDict_SetItemString(dict, "clip", n_ops.clip)==-1)) goto fail;; | ||||
| 186 | return dict; | ||||
| 187 | |||||
| 188 | fail: | ||||
| 189 | Py_DECREF(dict)_Py_DECREF(((PyObject*)(dict))); | ||||
| 190 | return NULL((void*)0); | ||||
| 191 | } | ||||
| 192 | |||||
| 193 | /*NUMPY_API | ||||
| 194 | Get dictionary showing number functions that all arrays will use | ||||
| 195 | */ | ||||
| 196 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||
| 197 | PyArray_GetNumericOps(void) | ||||
| 198 | { | ||||
| 199 | /* 2018-09-09, 1.16 */ | ||||
| 200 | if (DEPRECATE("PyArray_GetNumericOps is deprecated.")PyErr_WarnEx(PyExc_DeprecationWarning,"PyArray_GetNumericOps is deprecated." ,1) < 0) { | ||||
| 201 | return NULL((void*)0); | ||||
| 202 | } | ||||
| 203 | return _PyArray_GetNumericOps(); | ||||
| 204 | } | ||||
| 205 | |||||
| 206 | static PyObject * | ||||
| 207 | _get_keywords(int rtype, PyArrayObject *out) | ||||
| 208 | { | ||||
| 209 | PyObject *kwds = NULL((void*)0); | ||||
| 210 | if (rtype != NPY_NOTYPE || out != NULL((void*)0)) { | ||||
| 211 | kwds = PyDict_New(); | ||||
| 212 | if (rtype != NPY_NOTYPE) { | ||||
| 213 | PyArray_Descr *descr; | ||||
| 214 | descr = PyArray_DescrFromType(rtype); | ||||
| 215 | if (descr) { | ||||
| 216 | PyDict_SetItemString(kwds, "dtype", (PyObject *)descr); | ||||
| 217 | Py_DECREF(descr)_Py_DECREF(((PyObject*)(descr))); | ||||
| 218 | } | ||||
| 219 | } | ||||
| 220 | if (out != NULL((void*)0)) { | ||||
| 221 | PyDict_SetItemString(kwds, "out", (PyObject *)out); | ||||
| 222 | } | ||||
| 223 | } | ||||
| 224 | return kwds; | ||||
| 225 | } | ||||
| 226 | |||||
| 227 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||
| 228 | PyArray_GenericReduceFunction(PyArrayObject *m1, PyObject *op, int axis, | ||||
| 229 | int rtype, PyArrayObject *out) | ||||
| 230 | { | ||||
| 231 | PyObject *args, *ret = NULL((void*)0), *meth; | ||||
| 232 | PyObject *kwds; | ||||
| 233 | |||||
| 234 | args = Py_BuildValue_Py_BuildValue_SizeT("(Oi)", m1, axis); | ||||
| 235 | kwds = _get_keywords(rtype, out); | ||||
| 236 | meth = PyObject_GetAttrString(op, "reduce"); | ||||
| 237 | if (meth && PyCallable_Check(meth)) { | ||||
| 238 | ret = PyObject_Call(meth, args, kwds); | ||||
| 239 | } | ||||
| 240 | Py_DECREF(args)_Py_DECREF(((PyObject*)(args))); | ||||
| 241 | Py_DECREF(meth)_Py_DECREF(((PyObject*)(meth))); | ||||
| 242 | Py_XDECREF(kwds)_Py_XDECREF(((PyObject*)(kwds))); | ||||
| 243 | return ret; | ||||
| 244 | } | ||||
| 245 | |||||
| 246 | |||||
| 247 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||
| 248 | PyArray_GenericAccumulateFunction(PyArrayObject *m1, PyObject *op, int axis, | ||||
| 249 | int rtype, PyArrayObject *out) | ||||
| 250 | { | ||||
| 251 | PyObject *args, *ret = NULL((void*)0), *meth; | ||||
| 252 | PyObject *kwds; | ||||
| 253 | |||||
| 254 | args = Py_BuildValue_Py_BuildValue_SizeT("(Oi)", m1, axis); | ||||
| 255 | kwds = _get_keywords(rtype, out); | ||||
| 256 | meth = PyObject_GetAttrString(op, "accumulate"); | ||||
| 257 | if (meth && PyCallable_Check(meth)) { | ||||
| 258 | ret = PyObject_Call(meth, args, kwds); | ||||
| 259 | } | ||||
| 260 | Py_DECREF(args)_Py_DECREF(((PyObject*)(args))); | ||||
| 261 | Py_DECREF(meth)_Py_DECREF(((PyObject*)(meth))); | ||||
| 262 | Py_XDECREF(kwds)_Py_XDECREF(((PyObject*)(kwds))); | ||||
| 263 | return ret; | ||||
| 264 | } | ||||
| 265 | |||||
| 266 | |||||
| 267 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||
| 268 | PyArray_GenericBinaryFunction(PyObject *m1, PyObject *m2, PyObject *op) | ||||
| 269 | { | ||||
| 270 | return PyObject_CallFunctionObjArgs(op, m1, m2, NULL((void*)0)); | ||||
| 271 | } | ||||
| 272 | |||||
| 273 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||
| 274 | PyArray_GenericUnaryFunction(PyArrayObject *m1, PyObject *op) | ||||
| 275 | { | ||||
| 276 | return PyObject_CallFunctionObjArgs(op, m1, NULL((void*)0)); | ||||
| 277 | } | ||||
| 278 | |||||
| 279 | static PyObject * | ||||
| 280 | PyArray_GenericInplaceBinaryFunction(PyArrayObject *m1, | ||||
| 281 | PyObject *m2, PyObject *op) | ||||
| 282 | { | ||||
| 283 | return PyObject_CallFunctionObjArgs(op, m1, m2, m1, NULL((void*)0)); | ||||
| 284 | } | ||||
| 285 | |||||
| 286 | static PyObject * | ||||
| 287 | PyArray_GenericInplaceUnaryFunction(PyArrayObject *m1, PyObject *op) | ||||
| 288 | { | ||||
| 289 | return PyObject_CallFunctionObjArgs(op, m1, m1, NULL((void*)0)); | ||||
| 290 | } | ||||
| 291 | |||||
| 292 | static PyObject * | ||||
| 293 | array_add(PyObject *m1, PyObject *m2) | ||||
| 294 | { | ||||
| 295 | PyObject *res; | ||||
| 296 | |||||
| 297 | BINOP_GIVE_UP_IF_NEEDED(m1, m2, nb_add, array_add)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_add) != (void*)(array_add)) && binop_should_defer((PyObject*)m1, (PyObject*)m2, 0)) { _Py_INCREF (((PyObject*)((&_Py_NotImplementedStruct)))); return (& _Py_NotImplementedStruct); } } while (0); | ||||
| 298 | if (try_binary_elide(m1, m2, &array_inplace_add, &res, 1)) { | ||||
| 299 | return res; | ||||
| 300 | } | ||||
| 301 | return PyArray_GenericBinaryFunction(m1, m2, n_ops.add); | ||||
| 302 | } | ||||
| 303 | |||||
| 304 | static PyObject * | ||||
| 305 | array_subtract(PyObject *m1, PyObject *m2) | ||||
| 306 | { | ||||
| 307 | PyObject *res; | ||||
| 308 | |||||
| 309 | BINOP_GIVE_UP_IF_NEEDED(m1, m2, nb_subtract, array_subtract)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_subtract) != (void*)(array_subtract )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 0)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 310 | if (try_binary_elide(m1, m2, &array_inplace_subtract, &res, 0)) { | ||||
| 311 | return res; | ||||
| 312 | } | ||||
| 313 | return PyArray_GenericBinaryFunction(m1, m2, n_ops.subtract); | ||||
| 314 | } | ||||
| 315 | |||||
| 316 | static PyObject * | ||||
| 317 | array_multiply(PyObject *m1, PyObject *m2) | ||||
| 318 | { | ||||
| 319 | PyObject *res; | ||||
| 320 | |||||
| 321 | BINOP_GIVE_UP_IF_NEEDED(m1, m2, nb_multiply, array_multiply)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_multiply) != (void*)(array_multiply )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 0)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 322 | if (try_binary_elide(m1, m2, &array_inplace_multiply, &res, 1)) { | ||||
| 323 | return res; | ||||
| 324 | } | ||||
| 325 | return PyArray_GenericBinaryFunction(m1, m2, n_ops.multiply); | ||||
| 326 | } | ||||
| 327 | |||||
| 328 | static PyObject * | ||||
| 329 | array_remainder(PyObject *m1, PyObject *m2) | ||||
| 330 | { | ||||
| 331 | BINOP_GIVE_UP_IF_NEEDED(m1, m2, nb_remainder, array_remainder)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_remainder) != (void*)(array_remainder )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 0)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 332 | return PyArray_GenericBinaryFunction(m1, m2, n_ops.remainder); | ||||
| 333 | } | ||||
| 334 | |||||
| 335 | static PyObject * | ||||
| 336 | array_divmod(PyObject *m1, PyObject *m2) | ||||
| 337 | { | ||||
| 338 | BINOP_GIVE_UP_IF_NEEDED(m1, m2, nb_divmod, array_divmod)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_divmod) != (void*)(array_divmod)) && binop_should_defer((PyObject*)m1, (PyObject*)m2, 0)) { _Py_INCREF (((PyObject*)((&_Py_NotImplementedStruct)))); return (& _Py_NotImplementedStruct); } } while (0); | ||||
| 339 | return PyArray_GenericBinaryFunction(m1, m2, n_ops.divmod); | ||||
| 340 | } | ||||
| 341 | |||||
| 342 | /* Need this to be version dependent on account of the slot check */ | ||||
| 343 | static PyObject * | ||||
| 344 | array_matrix_multiply(PyObject *m1, PyObject *m2) | ||||
| 345 | { | ||||
| 346 | BINOP_GIVE_UP_IF_NEEDED(m1, m2, nb_matrix_multiply, array_matrix_multiply)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_matrix_multiply) != (void*)(array_matrix_multiply )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 0)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 347 | return PyArray_GenericBinaryFunction(m1, m2, n_ops.matmul); | ||||
| 348 | } | ||||
| 349 | |||||
| 350 | static PyObject * | ||||
| 351 | array_inplace_matrix_multiply( | ||||
| 352 | PyArrayObject *NPY_UNUSED(m1)(__NPY_UNUSED_TAGGEDm1) __attribute__ ((__unused__)), PyObject *NPY_UNUSED(m2)(__NPY_UNUSED_TAGGEDm2) __attribute__ ((__unused__))) | ||||
| 353 | { | ||||
| 354 | PyErr_SetString(PyExc_TypeError, | ||||
| 355 | "In-place matrix multiplication is not (yet) supported. " | ||||
| 356 | "Use 'a = a @ b' instead of 'a @= b'."); | ||||
| 357 | return NULL((void*)0); | ||||
| 358 | } | ||||
| 359 | |||||
| 360 | /* | ||||
| 361 | * Determine if object is a scalar and if so, convert the object | ||||
| 362 | * to a double and place it in the out_exponent argument | ||||
| 363 | * and return the "scalar kind" as a result. If the object is | ||||
| 364 | * not a scalar (or if there are other error conditions) | ||||
| 365 | * return NPY_NOSCALAR, and out_exponent is undefined. | ||||
| 366 | */ | ||||
| 367 | static NPY_SCALARKIND | ||||
| 368 | is_scalar_with_conversion(PyObject *o2, double* out_exponent) | ||||
| 369 | { | ||||
| 370 | PyObject *temp; | ||||
| 371 | const int optimize_fpexps = 1; | ||||
| 372 | |||||
| 373 | if (PyLong_Check(o2)((((((PyObject*)(o2))->ob_type))->tp_flags & ((1UL << 24))) != 0)) { | ||||
| 374 | long tmp = PyLong_AsLong(o2); | ||||
| 375 | if (error_converting(tmp)(((tmp) == -1) && PyErr_Occurred())) { | ||||
| 376 | PyErr_Clear(); | ||||
| 377 | return NPY_NOSCALAR; | ||||
| 378 | } | ||||
| 379 | *out_exponent = (double)tmp; | ||||
| 380 | return NPY_INTPOS_SCALAR; | ||||
| 381 | } | ||||
| 382 | |||||
| 383 | if (optimize_fpexps
((((PyObject*)(o2))->ob_type), (&PyFloat_Type)))) { | ||||
| 384 | *out_exponent = PyFloat_AsDouble(o2); | ||||
| 385 | return NPY_FLOAT_SCALAR; | ||||
| 386 | } | ||||
| 387 | |||||
| 388 | if (PyArray_Check(o2)((((PyObject*)(o2))->ob_type) == (&PyArray_Type) || PyType_IsSubtype ((((PyObject*)(o2))->ob_type), (&PyArray_Type)))) { | ||||
| 389 | if ((PyArray_NDIM((PyArrayObject *)o2) == 0) && | ||||
| 390 | ((PyArray_ISINTEGER((PyArrayObject *)o2)(((PyArray_TYPE((PyArrayObject *)o2)) >= NPY_BYTE) && ((PyArray_TYPE((PyArrayObject *)o2)) <= NPY_ULONGLONG)) || | ||||
| 391 | (optimize_fpexps && PyArray_ISFLOAT((PyArrayObject *)o2)((((PyArray_TYPE((PyArrayObject *)o2)) >= NPY_FLOAT) && ((PyArray_TYPE((PyArrayObject *)o2)) <= NPY_LONGDOUBLE)) || ((PyArray_TYPE((PyArrayObject *)o2)) == NPY_HALF)))))) { | ||||
| 392 | temp = Py_TYPE(o2)(((PyObject*)(o2))->ob_type)->tp_as_number->nb_float(o2); | ||||
| 393 | if (temp == NULL((void*)0)) { | ||||
| 394 | return NPY_NOSCALAR; | ||||
| 395 | } | ||||
| 396 | *out_exponent = PyFloat_AsDouble(o2); | ||||
| 397 | Py_DECREF(temp)_Py_DECREF(((PyObject*)(temp))); | ||||
| 398 | if (PyArray_ISINTEGER((PyArrayObject *)o2)(((PyArray_TYPE((PyArrayObject *)o2)) >= NPY_BYTE) && ((PyArray_TYPE((PyArrayObject *)o2)) <= NPY_ULONGLONG))) { | ||||
| 399 | return NPY_INTPOS_SCALAR; | ||||
| 400 | } | ||||
| 401 | else { /* ISFLOAT */ | ||||
| 402 | return NPY_FLOAT_SCALAR; | ||||
| 403 | } | ||||
| 404 | } | ||||
| 405 | } | ||||
| 406 | else if (PyArray_IsScalar(o2, Integer)(((((PyObject*)(o2))->ob_type) == (&PyIntegerArrType_Type ) || PyType_IsSubtype((((PyObject*)(o2))->ob_type), (& PyIntegerArrType_Type)))) || | ||||
| 407 | (optimize_fpexps
) || PyType_IsSubtype((((PyObject*)(o2))->ob_type), (& PyFloatingArrType_Type)))))) { | ||||
| 408 | temp = Py_TYPE(o2)(((PyObject*)(o2))->ob_type)->tp_as_number->nb_float(o2); | ||||
| 409 | if (temp == NULL((void*)0)) { | ||||
| 410 | return NPY_NOSCALAR; | ||||
| 411 | } | ||||
| 412 | *out_exponent = PyFloat_AsDouble(o2); | ||||
| 413 | Py_DECREF(temp)_Py_DECREF(((PyObject*)(temp))); | ||||
| 414 | |||||
| 415 | if (PyArray_IsScalar(o2, Integer)(((((PyObject*)(o2))->ob_type) == (&PyIntegerArrType_Type ) || PyType_IsSubtype((((PyObject*)(o2))->ob_type), (& PyIntegerArrType_Type))))) { | ||||
| 416 | return NPY_INTPOS_SCALAR; | ||||
| 417 | } | ||||
| 418 | else { /* IsScalar(o2, Floating) */ | ||||
| 419 | return NPY_FLOAT_SCALAR; | ||||
| 420 | } | ||||
| 421 | } | ||||
| 422 | else if (PyIndex_Check(o2)((o2)->ob_type->tp_as_number != ((void*)0) && ( o2)->ob_type->tp_as_number->nb_index != ((void*)0))) { | ||||
| 423 | PyObject* value = PyNumber_Index(o2); | ||||
| |||||
| 424 | Py_ssize_t val; | ||||
| 425 | if (value == NULL((void*)0)) { | ||||
| 426 | if (PyErr_Occurred()) { | ||||
| 427 | PyErr_Clear(); | ||||
| 428 | } | ||||
| 429 | return NPY_NOSCALAR; | ||||
| 430 | } | ||||
| 431 | val = PyLong_AsSsize_t(value); | ||||
| 432 | if (error_converting(val)(((val) == -1) && PyErr_Occurred())) { | ||||
| 433 | PyErr_Clear(); | ||||
| 434 | return NPY_NOSCALAR; | ||||
| 435 | } | ||||
| 436 | *out_exponent = (double) val; | ||||
| 437 | return NPY_INTPOS_SCALAR; | ||||
| 438 | } | ||||
| 439 | return NPY_NOSCALAR; | ||||
| 440 | } | ||||
| 441 | |||||
| 442 | /* | ||||
| 443 | * optimize float array or complex array to a scalar power | ||||
| 444 | * returns 0 on success, -1 if no optimization is possible | ||||
| 445 | * the result is in value (can be NULL if an error occurred) | ||||
| 446 | */ | ||||
| 447 | static int | ||||
| 448 | fast_scalar_power(PyObject *o1, PyObject *o2, int inplace, | ||||
| 449 | PyObject **value) | ||||
| 450 | { | ||||
| 451 | double exponent; | ||||
| 452 | NPY_SCALARKIND kind; /* NPY_NOSCALAR is not scalar */ | ||||
| 453 | |||||
| 454 | if (PyArray_Check(o1)((((PyObject*)(o1))->ob_type) == (&PyArray_Type) || PyType_IsSubtype ((((PyObject*)(o1))->ob_type), (&PyArray_Type))) && | ||||
| 455 | !PyArray_ISOBJECT((PyArrayObject *)o1)((PyArray_TYPE((PyArrayObject *)o1)) == NPY_OBJECT) && | ||||
| 456 | ((kind=is_scalar_with_conversion(o2, &exponent))>0)) { | ||||
| 457 | PyArrayObject *a1 = (PyArrayObject *)o1; | ||||
| 458 | PyObject *fastop = NULL((void*)0); | ||||
| 459 | if (PyArray_ISFLOAT(a1)((((PyArray_TYPE(a1)) >= NPY_FLOAT) && ((PyArray_TYPE (a1)) <= NPY_LONGDOUBLE)) || ((PyArray_TYPE(a1)) == NPY_HALF )) || PyArray_ISCOMPLEX(a1)(((PyArray_TYPE(a1)) >= NPY_CFLOAT) && ((PyArray_TYPE (a1)) <= NPY_CLONGDOUBLE))) { | ||||
| 460 | if (exponent == 1.0) { | ||||
| 461 | fastop = n_ops.positive; | ||||
| 462 | } | ||||
| 463 | else if (exponent == -1.0) { | ||||
| 464 | fastop = n_ops.reciprocal; | ||||
| 465 | } | ||||
| 466 | else if (exponent == 0.0) { | ||||
| 467 | fastop = n_ops._ones_like; | ||||
| 468 | } | ||||
| 469 | else if (exponent == 0.5) { | ||||
| 470 | fastop = n_ops.sqrt; | ||||
| 471 | } | ||||
| 472 | else if (exponent == 2.0) { | ||||
| 473 | fastop = n_ops.square; | ||||
| 474 | } | ||||
| 475 | else { | ||||
| 476 | return -1; | ||||
| 477 | } | ||||
| 478 | |||||
| 479 | if (inplace || can_elide_temp_unary(a1)) { | ||||
| 480 | *value = PyArray_GenericInplaceUnaryFunction(a1, fastop); | ||||
| 481 | } | ||||
| 482 | else { | ||||
| 483 | *value = PyArray_GenericUnaryFunction(a1, fastop); | ||||
| 484 | } | ||||
| 485 | return 0; | ||||
| 486 | } | ||||
| 487 | /* Because this is called with all arrays, we need to | ||||
| 488 | * change the output if the kind of the scalar is different | ||||
| 489 | * than that of the input and inplace is not on --- | ||||
| 490 | * (thus, the input should be up-cast) | ||||
| 491 | */ | ||||
| 492 | else if (exponent == 2.0) { | ||||
| 493 | fastop = n_ops.square; | ||||
| 494 | if (inplace) { | ||||
| 495 | *value = PyArray_GenericInplaceUnaryFunction(a1, fastop); | ||||
| 496 | } | ||||
| 497 | else { | ||||
| 498 | /* We only special-case the FLOAT_SCALAR and integer types */ | ||||
| 499 | if (kind == NPY_FLOAT_SCALAR && PyArray_ISINTEGER(a1)(((PyArray_TYPE(a1)) >= NPY_BYTE) && ((PyArray_TYPE (a1)) <= NPY_ULONGLONG))) { | ||||
| 500 | PyArray_Descr *dtype = PyArray_DescrFromType(NPY_DOUBLE); | ||||
| 501 | a1 = (PyArrayObject *)PyArray_CastToType(a1, dtype, | ||||
| 502 | PyArray_ISFORTRAN(a1)(PyArray_CHKFLAGS(a1, 0x0002) && (!PyArray_CHKFLAGS(a1 , 0x0001)))); | ||||
| 503 | if (a1 != NULL((void*)0)) { | ||||
| 504 | /* cast always creates a new array */ | ||||
| 505 | *value = PyArray_GenericInplaceUnaryFunction(a1, fastop); | ||||
| 506 | Py_DECREF(a1)_Py_DECREF(((PyObject*)(a1))); | ||||
| 507 | } | ||||
| 508 | } | ||||
| 509 | else { | ||||
| 510 | *value = PyArray_GenericUnaryFunction(a1, fastop); | ||||
| 511 | } | ||||
| 512 | } | ||||
| 513 | return 0; | ||||
| 514 | } | ||||
| 515 | } | ||||
| 516 | /* no fast operation found */ | ||||
| 517 | return -1; | ||||
| 518 | } | ||||
| 519 | |||||
| 520 | static PyObject * | ||||
| 521 | array_power(PyObject *a1, PyObject *o2, PyObject *modulo) | ||||
| 522 | { | ||||
| 523 | PyObject *value = NULL((void*)0); | ||||
| 524 | |||||
| 525 | if (modulo != Py_None(&_Py_NoneStruct)) { | ||||
| 526 | /* modular exponentiation is not implemented (gh-8804) */ | ||||
| 527 | Py_INCREF(Py_NotImplemented)_Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct)))); | ||||
| 528 | return Py_NotImplemented(&_Py_NotImplementedStruct); | ||||
| 529 | } | ||||
| 530 | |||||
| 531 | BINOP_GIVE_UP_IF_NEEDED(a1, o2, nb_power, array_power)do { if (((((PyObject*)(o2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(o2))->ob_type )->tp_as_number->nb_power) != (void*)(array_power)) && binop_should_defer((PyObject*)a1, (PyObject*)o2, 0)) { _Py_INCREF (((PyObject*)((&_Py_NotImplementedStruct)))); return (& _Py_NotImplementedStruct); } } while (0); | ||||
| 532 | if (fast_scalar_power(a1, o2, 0, &value) != 0) { | ||||
| 533 | value = PyArray_GenericBinaryFunction(a1, o2, n_ops.power); | ||||
| 534 | } | ||||
| 535 | return value; | ||||
| 536 | } | ||||
| 537 | |||||
| 538 | static PyObject * | ||||
| 539 | array_positive(PyArrayObject *m1) | ||||
| 540 | { | ||||
| 541 | /* | ||||
| 542 | * For backwards compatibility, where + just implied a copy, | ||||
| 543 | * we cannot just call n_ops.positive. Instead, we do the following | ||||
| 544 | * 1. Try n_ops.positive | ||||
| 545 | * 2. If we get an exception, check whether __array_ufunc__ is | ||||
| 546 | * overridden; if so, we live in the future and we allow the | ||||
| 547 | * TypeError to be passed on. | ||||
| 548 | * 3. If not, give a deprecation warning and return a copy. | ||||
| 549 | */ | ||||
| 550 | PyObject *value; | ||||
| 551 | if (can_elide_temp_unary(m1)) { | ||||
| 552 | value = PyArray_GenericInplaceUnaryFunction(m1, n_ops.positive); | ||||
| 553 | } | ||||
| 554 | else { | ||||
| 555 | value = PyArray_GenericUnaryFunction(m1, n_ops.positive); | ||||
| 556 | } | ||||
| 557 | if (value == NULL((void*)0)) { | ||||
| 558 | /* | ||||
| 559 | * We first fetch the error, as it needs to be clear to check | ||||
| 560 | * for the override. When the deprecation is removed, | ||||
| 561 | * this whole stanza can be deleted. | ||||
| 562 | */ | ||||
| 563 | PyObject *exc, *val, *tb; | ||||
| 564 | PyErr_Fetch(&exc, &val, &tb); | ||||
| 565 | if (PyUFunc_HasOverride((PyObject *)m1)) { | ||||
| 566 | PyErr_Restore(exc, val, tb); | ||||
| 567 | return NULL((void*)0); | ||||
| 568 | } | ||||
| 569 | Py_XDECREF(exc)_Py_XDECREF(((PyObject*)(exc))); | ||||
| 570 | Py_XDECREF(val)_Py_XDECREF(((PyObject*)(val))); | ||||
| 571 | Py_XDECREF(tb)_Py_XDECREF(((PyObject*)(tb))); | ||||
| 572 | |||||
| 573 | /* 2018-06-28, 1.16.0 */ | ||||
| 574 | if (DEPRECATE("Applying '+' to a non-numerical array is "PyErr_WarnEx(PyExc_DeprecationWarning,"Applying '+' to a non-numerical array is " "ill-defined. Returning a copy, but in the future " "this will error." ,1) | ||||
| 575 | "ill-defined. Returning a copy, but in the future "PyErr_WarnEx(PyExc_DeprecationWarning,"Applying '+' to a non-numerical array is " "ill-defined. Returning a copy, but in the future " "this will error." ,1) | ||||
| 576 | "this will error.")PyErr_WarnEx(PyExc_DeprecationWarning,"Applying '+' to a non-numerical array is " "ill-defined. Returning a copy, but in the future " "this will error." ,1) < 0) { | ||||
| 577 | return NULL((void*)0); | ||||
| 578 | } | ||||
| 579 | value = PyArray_Return((PyArrayObject *)PyArray_Copy(m1)PyArray_NewCopy(m1, NPY_CORDER)); | ||||
| 580 | } | ||||
| 581 | return value; | ||||
| 582 | } | ||||
| 583 | |||||
| 584 | static PyObject * | ||||
| 585 | array_negative(PyArrayObject *m1) | ||||
| 586 | { | ||||
| 587 | if (can_elide_temp_unary(m1)) { | ||||
| 588 | return PyArray_GenericInplaceUnaryFunction(m1, n_ops.negative); | ||||
| 589 | } | ||||
| 590 | return PyArray_GenericUnaryFunction(m1, n_ops.negative); | ||||
| 591 | } | ||||
| 592 | |||||
| 593 | static PyObject * | ||||
| 594 | array_absolute(PyArrayObject *m1) | ||||
| 595 | { | ||||
| 596 | if (can_elide_temp_unary(m1) && !PyArray_ISCOMPLEX(m1)(((PyArray_TYPE(m1)) >= NPY_CFLOAT) && ((PyArray_TYPE (m1)) <= NPY_CLONGDOUBLE))) { | ||||
| 597 | return PyArray_GenericInplaceUnaryFunction(m1, n_ops.absolute); | ||||
| 598 | } | ||||
| 599 | return PyArray_GenericUnaryFunction(m1, n_ops.absolute); | ||||
| 600 | } | ||||
| 601 | |||||
| 602 | static PyObject * | ||||
| 603 | array_invert(PyArrayObject *m1) | ||||
| 604 | { | ||||
| 605 | if (can_elide_temp_unary(m1)) { | ||||
| 606 | return PyArray_GenericInplaceUnaryFunction(m1, n_ops.invert); | ||||
| 607 | } | ||||
| 608 | return PyArray_GenericUnaryFunction(m1, n_ops.invert); | ||||
| 609 | } | ||||
| 610 | |||||
| 611 | static PyObject * | ||||
| 612 | array_left_shift(PyObject *m1, PyObject *m2) | ||||
| 613 | { | ||||
| 614 | PyObject *res; | ||||
| 615 | |||||
| 616 | BINOP_GIVE_UP_IF_NEEDED(m1, m2, nb_lshift, array_left_shift)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_lshift) != (void*)(array_left_shift )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 0)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 617 | if (try_binary_elide(m1, m2, &array_inplace_left_shift, &res, 0)) { | ||||
| 618 | return res; | ||||
| 619 | } | ||||
| 620 | return PyArray_GenericBinaryFunction(m1, m2, n_ops.left_shift); | ||||
| 621 | } | ||||
| 622 | |||||
| 623 | static PyObject * | ||||
| 624 | array_right_shift(PyObject *m1, PyObject *m2) | ||||
| 625 | { | ||||
| 626 | PyObject *res; | ||||
| 627 | |||||
| 628 | BINOP_GIVE_UP_IF_NEEDED(m1, m2, nb_rshift, array_right_shift)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_rshift) != (void*)(array_right_shift )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 0)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 629 | if (try_binary_elide(m1, m2, &array_inplace_right_shift, &res, 0)) { | ||||
| 630 | return res; | ||||
| 631 | } | ||||
| 632 | return PyArray_GenericBinaryFunction(m1, m2, n_ops.right_shift); | ||||
| 633 | } | ||||
| 634 | |||||
| 635 | static PyObject * | ||||
| 636 | array_bitwise_and(PyObject *m1, PyObject *m2) | ||||
| 637 | { | ||||
| 638 | PyObject *res; | ||||
| 639 | |||||
| 640 | BINOP_GIVE_UP_IF_NEEDED(m1, m2, nb_and, array_bitwise_and)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_and) != (void*)(array_bitwise_and)) && binop_should_defer((PyObject*)m1, (PyObject*)m2, 0 )) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct)) )); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 641 | if (try_binary_elide(m1, m2, &array_inplace_bitwise_and, &res, 1)) { | ||||
| 642 | return res; | ||||
| 643 | } | ||||
| 644 | return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_and); | ||||
| 645 | } | ||||
| 646 | |||||
| 647 | static PyObject * | ||||
| 648 | array_bitwise_or(PyObject *m1, PyObject *m2) | ||||
| 649 | { | ||||
| 650 | PyObject *res; | ||||
| 651 | |||||
| 652 | BINOP_GIVE_UP_IF_NEEDED(m1, m2, nb_or, array_bitwise_or)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_or) != (void*)(array_bitwise_or)) && binop_should_defer((PyObject*)m1, (PyObject*)m2, 0)) { _Py_INCREF (((PyObject*)((&_Py_NotImplementedStruct)))); return (& _Py_NotImplementedStruct); } } while (0); | ||||
| 653 | if (try_binary_elide(m1, m2, &array_inplace_bitwise_or, &res, 1)) { | ||||
| 654 | return res; | ||||
| 655 | } | ||||
| 656 | return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_or); | ||||
| 657 | } | ||||
| 658 | |||||
| 659 | static PyObject * | ||||
| 660 | array_bitwise_xor(PyObject *m1, PyObject *m2) | ||||
| 661 | { | ||||
| 662 | PyObject *res; | ||||
| 663 | |||||
| 664 | BINOP_GIVE_UP_IF_NEEDED(m1, m2, nb_xor, array_bitwise_xor)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_xor) != (void*)(array_bitwise_xor)) && binop_should_defer((PyObject*)m1, (PyObject*)m2, 0 )) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct)) )); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 665 | if (try_binary_elide(m1, m2, &array_inplace_bitwise_xor, &res, 1)) { | ||||
| 666 | return res; | ||||
| 667 | } | ||||
| 668 | return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_xor); | ||||
| 669 | } | ||||
| 670 | |||||
| 671 | static PyObject * | ||||
| 672 | array_inplace_add(PyArrayObject *m1, PyObject *m2) | ||||
| 673 | { | ||||
| 674 | INPLACE_GIVE_UP_IF_NEEDED(do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_add) != (void*)(array_inplace_add )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0) | ||||
| 675 | m1, m2, nb_inplace_add, array_inplace_add)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_add) != (void*)(array_inplace_add )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 676 | return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.add); | ||||
| 677 | } | ||||
| 678 | |||||
| 679 | static PyObject * | ||||
| 680 | array_inplace_subtract(PyArrayObject *m1, PyObject *m2) | ||||
| 681 | { | ||||
| 682 | INPLACE_GIVE_UP_IF_NEEDED(do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_subtract) != (void*)(array_inplace_subtract )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0) | ||||
| 683 | m1, m2, nb_inplace_subtract, array_inplace_subtract)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_subtract) != (void*)(array_inplace_subtract )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 684 | return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.subtract); | ||||
| 685 | } | ||||
| 686 | |||||
| 687 | static PyObject * | ||||
| 688 | array_inplace_multiply(PyArrayObject *m1, PyObject *m2) | ||||
| 689 | { | ||||
| 690 | INPLACE_GIVE_UP_IF_NEEDED(do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_multiply) != (void*)(array_inplace_multiply )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0) | ||||
| 691 | m1, m2, nb_inplace_multiply, array_inplace_multiply)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_multiply) != (void*)(array_inplace_multiply )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 692 | return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.multiply); | ||||
| 693 | } | ||||
| 694 | |||||
| 695 | static PyObject * | ||||
| 696 | array_inplace_remainder(PyArrayObject *m1, PyObject *m2) | ||||
| 697 | { | ||||
| 698 | INPLACE_GIVE_UP_IF_NEEDED(do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_remainder) != (void*)(array_inplace_remainder )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0) | ||||
| 699 | m1, m2, nb_inplace_remainder, array_inplace_remainder)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_remainder) != (void*)(array_inplace_remainder )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 700 | return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.remainder); | ||||
| 701 | } | ||||
| 702 | |||||
| 703 | static PyObject * | ||||
| 704 | array_inplace_power(PyArrayObject *a1, PyObject *o2, PyObject *NPY_UNUSED(modulo)(__NPY_UNUSED_TAGGEDmodulo) __attribute__ ((__unused__))) | ||||
| 705 | { | ||||
| 706 | /* modulo is ignored! */ | ||||
| 707 | PyObject *value = NULL((void*)0); | ||||
| 708 | |||||
| 709 | INPLACE_GIVE_UP_IF_NEEDED(do { if (((((PyObject*)(o2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(o2))->ob_type )->tp_as_number->nb_inplace_power) != (void*)(array_inplace_power )) && binop_should_defer((PyObject*)a1, (PyObject*)o2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0) | ||||
| |||||
| 710 | a1, o2, nb_inplace_power, array_inplace_power)do { if (((((PyObject*)(o2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(o2))->ob_type )->tp_as_number->nb_inplace_power) != (void*)(array_inplace_power )) && binop_should_defer((PyObject*)a1, (PyObject*)o2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 711 | if (fast_scalar_power((PyObject *)a1, o2, 1, &value) != 0) { | ||||
| 712 | value = PyArray_GenericInplaceBinaryFunction(a1, o2, n_ops.power); | ||||
| 713 | } | ||||
| 714 | return value; | ||||
| 715 | } | ||||
| 716 | |||||
| 717 | static PyObject * | ||||
| 718 | array_inplace_left_shift(PyArrayObject *m1, PyObject *m2) | ||||
| 719 | { | ||||
| 720 | INPLACE_GIVE_UP_IF_NEEDED(do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_lshift) != (void*)(array_inplace_left_shift )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0) | ||||
| 721 | m1, m2, nb_inplace_lshift, array_inplace_left_shift)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_lshift) != (void*)(array_inplace_left_shift )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 722 | return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.left_shift); | ||||
| 723 | } | ||||
| 724 | |||||
| 725 | static PyObject * | ||||
| 726 | array_inplace_right_shift(PyArrayObject *m1, PyObject *m2) | ||||
| 727 | { | ||||
| 728 | INPLACE_GIVE_UP_IF_NEEDED(do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_rshift) != (void*)(array_inplace_right_shift )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0) | ||||
| 729 | m1, m2, nb_inplace_rshift, array_inplace_right_shift)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_rshift) != (void*)(array_inplace_right_shift )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 730 | return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.right_shift); | ||||
| 731 | } | ||||
| 732 | |||||
| 733 | static PyObject * | ||||
| 734 | array_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) | ||||
| 735 | { | ||||
| 736 | INPLACE_GIVE_UP_IF_NEEDED(do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_and) != (void*)(array_inplace_bitwise_and )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0) | ||||
| 737 | m1, m2, nb_inplace_and, array_inplace_bitwise_and)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_and) != (void*)(array_inplace_bitwise_and )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 738 | return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_and); | ||||
| 739 | } | ||||
| 740 | |||||
| 741 | static PyObject * | ||||
| 742 | array_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) | ||||
| 743 | { | ||||
| 744 | INPLACE_GIVE_UP_IF_NEEDED(do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_or) != (void*)(array_inplace_bitwise_or )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0) | ||||
| 745 | m1, m2, nb_inplace_or, array_inplace_bitwise_or)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_or) != (void*)(array_inplace_bitwise_or )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 746 | return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_or); | ||||
| 747 | } | ||||
| 748 | |||||
| 749 | static PyObject * | ||||
| 750 | array_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) | ||||
| 751 | { | ||||
| 752 | INPLACE_GIVE_UP_IF_NEEDED(do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_xor) != (void*)(array_inplace_bitwise_xor )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0) | ||||
| 753 | m1, m2, nb_inplace_xor, array_inplace_bitwise_xor)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_xor) != (void*)(array_inplace_bitwise_xor )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 754 | return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_xor); | ||||
| 755 | } | ||||
| 756 | |||||
| 757 | static PyObject * | ||||
| 758 | array_floor_divide(PyObject *m1, PyObject *m2) | ||||
| 759 | { | ||||
| 760 | PyObject *res; | ||||
| 761 | |||||
| 762 | BINOP_GIVE_UP_IF_NEEDED(m1, m2, nb_floor_divide, array_floor_divide)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_floor_divide) != (void*)(array_floor_divide )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 0)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 763 | if (try_binary_elide(m1, m2, &array_inplace_floor_divide, &res, 0)) { | ||||
| 764 | return res; | ||||
| 765 | } | ||||
| 766 | return PyArray_GenericBinaryFunction(m1, m2, n_ops.floor_divide); | ||||
| 767 | } | ||||
| 768 | |||||
| 769 | static PyObject * | ||||
| 770 | array_true_divide(PyObject *m1, PyObject *m2) | ||||
| 771 | { | ||||
| 772 | PyObject *res; | ||||
| 773 | PyArrayObject *a1 = (PyArrayObject *)m1; | ||||
| 774 | |||||
| 775 | BINOP_GIVE_UP_IF_NEEDED(m1, m2, nb_true_divide, array_true_divide)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_true_divide) != (void*)(array_true_divide )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 0)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 776 | if (PyArray_CheckExact(m1)(((PyObject*)(m1))->ob_type == &PyArray_Type) && | ||||
| 777 | (PyArray_ISFLOAT(a1)((((PyArray_TYPE(a1)) >= NPY_FLOAT) && ((PyArray_TYPE (a1)) <= NPY_LONGDOUBLE)) || ((PyArray_TYPE(a1)) == NPY_HALF )) || PyArray_ISCOMPLEX(a1)(((PyArray_TYPE(a1)) >= NPY_CFLOAT) && ((PyArray_TYPE (a1)) <= NPY_CLONGDOUBLE))) && | ||||
| 778 | try_binary_elide(m1, m2, &array_inplace_true_divide, &res, 0)) { | ||||
| 779 | return res; | ||||
| 780 | } | ||||
| 781 | return PyArray_GenericBinaryFunction(m1, m2, n_ops.true_divide); | ||||
| 782 | } | ||||
| 783 | |||||
| 784 | static PyObject * | ||||
| 785 | array_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) | ||||
| 786 | { | ||||
| 787 | INPLACE_GIVE_UP_IF_NEEDED(do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_floor_divide) != (void*)(array_inplace_floor_divide )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0) | ||||
| 788 | m1, m2, nb_inplace_floor_divide, array_inplace_floor_divide)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_floor_divide) != (void*)(array_inplace_floor_divide )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 789 | return PyArray_GenericInplaceBinaryFunction(m1, m2, | ||||
| 790 | n_ops.floor_divide); | ||||
| 791 | } | ||||
| 792 | |||||
| 793 | static PyObject * | ||||
| 794 | array_inplace_true_divide(PyArrayObject *m1, PyObject *m2) | ||||
| 795 | { | ||||
| 796 | INPLACE_GIVE_UP_IF_NEEDED(do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_true_divide) != (void*)(array_inplace_true_divide )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0) | ||||
| 797 | m1, m2, nb_inplace_true_divide, array_inplace_true_divide)do { if (((((PyObject*)(m2))->ob_type)->tp_as_number != ((void*)0) && (void*)((((PyObject*)(m2))->ob_type )->tp_as_number->nb_inplace_true_divide) != (void*)(array_inplace_true_divide )) && binop_should_defer((PyObject*)m1, (PyObject*)m2 , 1)) { _Py_INCREF(((PyObject*)((&_Py_NotImplementedStruct )))); return (&_Py_NotImplementedStruct); } } while (0); | ||||
| 798 | return PyArray_GenericInplaceBinaryFunction(m1, m2, | ||||
| 799 | n_ops.true_divide); | ||||
| 800 | } | ||||
| 801 | |||||
| 802 | |||||
| 803 | static int | ||||
| 804 | _array_nonzero(PyArrayObject *mp) | ||||
| 805 | { | ||||
| 806 | npy_intp n; | ||||
| 807 | |||||
| 808 | n = PyArray_SIZE(mp)PyArray_MultiplyList(PyArray_DIMS(mp), PyArray_NDIM(mp)); | ||||
| 809 | if (n == 1) { | ||||
| 810 | int res; | ||||
| 811 | if (Py_EnterRecursiveCall(" while converting array to bool")((++(PyThreadState_Get()->recursion_depth) > _Py_CheckRecursionLimit ) && _Py_CheckRecursiveCall(" while converting array to bool" ))) { | ||||
| 812 | return -1; | ||||
| 813 | } | ||||
| 814 | res = PyArray_DESCR(mp)->f->nonzero(PyArray_DATA(mp), mp); | ||||
| 815 | /* nonzero has no way to indicate an error, but one can occur */ | ||||
| 816 | if (PyErr_Occurred()) { | ||||
| 817 | res = -1; | ||||
| 818 | } | ||||
| 819 | Py_LeaveRecursiveCall()do{ if((--(PyThreadState_Get()->recursion_depth) < (((_Py_CheckRecursionLimit ) > 200) ? ((_Py_CheckRecursionLimit) - 50) : (3 * ((_Py_CheckRecursionLimit ) >> 2))))) PyThreadState_Get()->overflowed = 0; } while (0); | ||||
| 820 | return res; | ||||
| 821 | } | ||||
| 822 | else if (n == 0) { | ||||
| 823 | /* 2017-09-25, 1.14 */ | ||||
| 824 | if (DEPRECATE("The truth value of an empty array is ambiguous. "PyErr_WarnEx(PyExc_DeprecationWarning,"The truth value of an empty array is ambiguous. " "Returning False, but in future this will result in an error. " "Use `array.size > 0` to check that an array is not empty." ,1) | ||||
| 825 | "Returning False, but in future this will result in an error. "PyErr_WarnEx(PyExc_DeprecationWarning,"The truth value of an empty array is ambiguous. " "Returning False, but in future this will result in an error. " "Use `array.size > 0` to check that an array is not empty." ,1) | ||||
| 826 | "Use `array.size > 0` to check that an array is not empty.")PyErr_WarnEx(PyExc_DeprecationWarning,"The truth value of an empty array is ambiguous. " "Returning False, but in future this will result in an error. " "Use `array.size > 0` to check that an array is not empty." ,1) < 0) { | ||||
| 827 | return -1; | ||||
| 828 | } | ||||
| 829 | return 0; | ||||
| 830 | } | ||||
| 831 | else { | ||||
| 832 | PyErr_SetString(PyExc_ValueError, | ||||
| 833 | "The truth value of an array " | ||||
| 834 | "with more than one element is ambiguous. " | ||||
| 835 | "Use a.any() or a.all()"); | ||||
| 836 | return -1; | ||||
| 837 | } | ||||
| 838 | } | ||||
| 839 | |||||
| 840 | /* | ||||
| 841 | * Convert the array to a scalar if allowed, and apply the builtin function | ||||
| 842 | * to it. The where argument is passed onto Py_EnterRecursiveCall when the | ||||
| 843 | * array contains python objects. | ||||
| 844 | */ | ||||
| 845 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||
| 846 | array_scalar_forward(PyArrayObject *v, | ||||
| 847 | PyObject *(*builtin_func)(PyObject *), | ||||
| 848 | const char *where) | ||||
| 849 | { | ||||
| 850 | PyObject *scalar; | ||||
| 851 | if (PyArray_SIZE(v)PyArray_MultiplyList(PyArray_DIMS(v), PyArray_NDIM(v)) != 1) { | ||||
| 852 | PyErr_SetString(PyExc_TypeError, "only size-1 arrays can be"\ | ||||
| 853 | " converted to Python scalars"); | ||||
| 854 | return NULL((void*)0); | ||||
| 855 | } | ||||
| 856 | |||||
| 857 | scalar = PyArray_GETITEM(v, PyArray_DATA(v)); | ||||
| 858 | if (scalar == NULL((void*)0)) { | ||||
| 859 | return NULL((void*)0); | ||||
| 860 | } | ||||
| 861 | |||||
| 862 | /* Need to guard against recursion if our array holds references */ | ||||
| 863 | if (PyDataType_REFCHK(PyArray_DESCR(v))(((PyArray_DESCR(v))->flags & (0x01)) == (0x01))) { | ||||
| 864 | PyObject *res; | ||||
| 865 | if (Py_EnterRecursiveCall(where)((++(PyThreadState_Get()->recursion_depth) > _Py_CheckRecursionLimit ) && _Py_CheckRecursiveCall(where)) != 0) { | ||||
| 866 | Py_DECREF(scalar)_Py_DECREF(((PyObject*)(scalar))); | ||||
| 867 | return NULL((void*)0); | ||||
| 868 | } | ||||
| 869 | res = builtin_func(scalar); | ||||
| 870 | Py_DECREF(scalar)_Py_DECREF(((PyObject*)(scalar))); | ||||
| 871 | Py_LeaveRecursiveCall()do{ if((--(PyThreadState_Get()->recursion_depth) < (((_Py_CheckRecursionLimit ) > 200) ? ((_Py_CheckRecursionLimit) - 50) : (3 * ((_Py_CheckRecursionLimit ) >> 2))))) PyThreadState_Get()->overflowed = 0; } while (0); | ||||
| 872 | return res; | ||||
| 873 | } | ||||
| 874 | else { | ||||
| 875 | PyObject *res; | ||||
| 876 | res = builtin_func(scalar); | ||||
| 877 | Py_DECREF(scalar)_Py_DECREF(((PyObject*)(scalar))); | ||||
| 878 | return res; | ||||
| 879 | } | ||||
| 880 | } | ||||
| 881 | |||||
| 882 | |||||
| 883 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||
| 884 | array_float(PyArrayObject *v) | ||||
| 885 | { | ||||
| 886 | return array_scalar_forward(v, &PyNumber_Float, " in ndarray.__float__"); | ||||
| 887 | } | ||||
| 888 | |||||
| 889 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyObject * | ||||
| 890 | array_int(PyArrayObject *v) | ||||
| 891 | { | ||||
| 892 | return array_scalar_forward(v, &PyNumber_Long, " in ndarray.__int__"); | ||||
| 893 | } | ||||
| 894 | |||||
| 895 | static PyObject * | ||||
| 896 | array_index(PyArrayObject *v) | ||||
| 897 | { | ||||
| 898 | if (!PyArray_ISINTEGER(v)(((PyArray_TYPE(v)) >= NPY_BYTE) && ((PyArray_TYPE (v)) <= NPY_ULONGLONG)) || PyArray_NDIM(v) != 0) { | ||||
| 899 | PyErr_SetString(PyExc_TypeError, | ||||
| 900 | "only integer scalar arrays can be converted to a scalar index"); | ||||
| 901 | return NULL((void*)0); | ||||
| 902 | } | ||||
| 903 | return PyArray_GETITEM(v, PyArray_DATA(v)); | ||||
| 904 | } | ||||
| 905 | |||||
| 906 | |||||
| 907 | NPY_NO_EXPORT__attribute__((visibility("hidden"))) PyNumberMethods array_as_number = { | ||||
| 908 | .nb_add = array_add, | ||||
| 909 | .nb_subtract = array_subtract, | ||||
| 910 | .nb_multiply = array_multiply, | ||||
| 911 | .nb_remainder = array_remainder, | ||||
| 912 | .nb_divmod = array_divmod, | ||||
| 913 | .nb_power = (ternaryfunc)array_power, | ||||
| 914 | .nb_negative = (unaryfunc)array_negative, | ||||
| 915 | .nb_positive = (unaryfunc)array_positive, | ||||
| 916 | .nb_absolute = (unaryfunc)array_absolute, | ||||
| 917 | .nb_bool = (inquiry)_array_nonzero, | ||||
| 918 | .nb_invert = (unaryfunc)array_invert, | ||||
| 919 | .nb_lshift = array_left_shift, | ||||
| 920 | .nb_rshift = array_right_shift, | ||||
| 921 | .nb_and = array_bitwise_and, | ||||
| 922 | .nb_xor = array_bitwise_xor, | ||||
| 923 | .nb_or = array_bitwise_or, | ||||
| 924 | |||||
| 925 | .nb_int = (unaryfunc)array_int, | ||||
| 926 | .nb_float = (unaryfunc)array_float, | ||||
| 927 | .nb_index = (unaryfunc)array_index, | ||||
| 928 | |||||
| 929 | .nb_inplace_add = (binaryfunc)array_inplace_add, | ||||
| 930 | .nb_inplace_subtract = (binaryfunc)array_inplace_subtract, | ||||
| 931 | .nb_inplace_multiply = (binaryfunc)array_inplace_multiply, | ||||
| 932 | .nb_inplace_remainder = (binaryfunc)array_inplace_remainder, | ||||
| 933 | .nb_inplace_power = (ternaryfunc)array_inplace_power, | ||||
| 934 | .nb_inplace_lshift = (binaryfunc)array_inplace_left_shift, | ||||
| 935 | .nb_inplace_rshift = (binaryfunc)array_inplace_right_shift, | ||||
| 936 | .nb_inplace_and = (binaryfunc)array_inplace_bitwise_and, | ||||
| 937 | .nb_inplace_xor = (binaryfunc)array_inplace_bitwise_xor, | ||||
| 938 | .nb_inplace_or = (binaryfunc)array_inplace_bitwise_or, | ||||
| 939 | |||||
| 940 | .nb_floor_divide = array_floor_divide, | ||||
| 941 | .nb_true_divide = array_true_divide, | ||||
| 942 | .nb_inplace_floor_divide = (binaryfunc)array_inplace_floor_divide, | ||||
| 943 | .nb_inplace_true_divide = (binaryfunc)array_inplace_true_divide, | ||||
| 944 | |||||
| 945 | .nb_matrix_multiply = array_matrix_multiply, | ||||
| 946 | .nb_inplace_matrix_multiply = (binaryfunc)array_inplace_matrix_multiply, | ||||
| 947 | }; |
| 1 | #ifndef PyNumber_Index |
| 2 | struct _object; |
| 3 | typedef struct _object PyObject; |
| 4 | PyObject* clang_analyzer_PyObject_New_Reference(); |
| 5 | PyObject* PyNumber_Index(PyObject *o) { |
| 6 | return clang_analyzer_PyObject_New_Reference(); |
| 7 | } |
| 8 | #else |
| 9 | #warning "API PyNumber_Index is defined as a macro." |
| 10 | #endif |