summaryrefslogtreecommitdiff
path: root/dev-python/numpy/files/numpy-2.3.1-fix-vector.patch
blob: 0748bc5a1417104514a4869fce12dfd53ec07b9b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
https://github.com/scikit-hep/vector/issues/616
https://github.com/numpy/numpy/issues/29388
https://github.com/numpy/numpy/pull/29392

From d8eeb76d457a03347387c57ae7b84530aa38578d Mon Sep 17 00:00:00 2001
From: Maanas Arora <maanasarora23@gmail.com>
Date: Wed, 16 Jul 2025 18:11:31 -0400
Subject: [PATCH 1/5] BUG: update fast_scalar_power to handle special-case
 squaring for any array type except object arrays

---
 numpy/_core/src/multiarray/number.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/numpy/_core/src/multiarray/number.c b/numpy/_core/src/multiarray/number.c
index b801d7e041e2..8ab1d0d4a784 100644
--- a/numpy/_core/src/multiarray/number.c
+++ b/numpy/_core/src/multiarray/number.c
@@ -363,7 +363,12 @@ fast_scalar_power(PyObject *o1, PyObject *o2, int inplace, PyObject **result)
     }
 
     PyArrayObject *a1 = (PyArrayObject *)o1;
-    if (!(PyArray_ISFLOAT(a1) || PyArray_ISCOMPLEX(a1))) {
+    if (PyArray_ISOBJECT(a1)) {
+        return 1;
+    }
+    if (!is_square && !PyArray_ISFLOAT(a1) && !PyArray_ISCOMPLEX(a1)) {
+        // we special-case squaring for any array type
+        // gh-29388
         return 1;
     }
 

From 097b04a300e9bd5f35230a6450dbf7d939426dd3 Mon Sep 17 00:00:00 2001
From: Maanas Arora <maanasarora23@gmail.com>
Date: Wed, 16 Jul 2025 18:19:04 -0400
Subject: [PATCH 2/5] BUG: fix missing declaration

---
 numpy/_core/src/multiarray/number.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/numpy/_core/src/multiarray/number.c b/numpy/_core/src/multiarray/number.c
index 8ab1d0d4a784..6b885ffa68e1 100644
--- a/numpy/_core/src/multiarray/number.c
+++ b/numpy/_core/src/multiarray/number.c
@@ -332,6 +332,8 @@ static int
 fast_scalar_power(PyObject *o1, PyObject *o2, int inplace, PyObject **result)
 {
     PyObject *fastop = NULL;
+    int is_square = 0;
+
     if (PyLong_CheckExact(o2)) {
         int overflow = 0;
         long exp = PyLong_AsLongAndOverflow(o2, &overflow);
@@ -344,6 +346,7 @@ fast_scalar_power(PyObject *o1, PyObject *o2, int inplace, PyObject **result)
         }
         else if (exp == 2) {
             fastop = n_ops.square;
+            is_square = 1;
         }
         else {
             return 1;

From 79a91a1bdaa50339ad513998c440b8949f15f56e Mon Sep 17 00:00:00 2001
From: Maanas Arora <maanasarora23@gmail.com>
Date: Wed, 16 Jul 2025 18:29:08 -0400
Subject: [PATCH 3/5] TST: add test to ensure `arr**2` calls square for
 structured dtypes

---
 numpy/_core/tests/test_multiarray.py | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/numpy/_core/tests/test_multiarray.py b/numpy/_core/tests/test_multiarray.py
index 04222025883e..364a9793a81f 100644
--- a/numpy/_core/tests/test_multiarray.py
+++ b/numpy/_core/tests/test_multiarray.py
@@ -4215,6 +4215,13 @@ def pow_for(exp, arr):
         assert_equal(obj_arr ** -1, pow_for(-1, obj_arr))
         assert_equal(obj_arr ** 2, pow_for(2, obj_arr))
 
+    def test_pow_calls_square_structured_dtype(self):
+        # gh-29388
+        dt = np.dtype([('a', 'i4'), ('b', 'i4')])
+        a = np.array([(1, 2), (3, 4)], dtype= dt)
+        with pytest.raises(TypeError, match="ufunc 'square' not supported"):
+            a ** 2
+
     def test_pos_array_ufunc_override(self):
         class A(np.ndarray):
             def __array_ufunc__(self, ufunc, method, *inputs, **kwargs):

From e014ffe34ee4573538691cd197273ff08f35d26b Mon Sep 17 00:00:00 2001
From: Maanas Arora <maanasarora23@gmail.com>
Date: Wed, 16 Jul 2025 18:32:48 -0400
Subject: [PATCH 4/5] STY: remove whitespace

---
 numpy/_core/tests/test_multiarray.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/numpy/_core/tests/test_multiarray.py b/numpy/_core/tests/test_multiarray.py
index 364a9793a81f..e7647d2e23fe 100644
--- a/numpy/_core/tests/test_multiarray.py
+++ b/numpy/_core/tests/test_multiarray.py
@@ -4218,7 +4218,7 @@ def pow_for(exp, arr):
     def test_pow_calls_square_structured_dtype(self):
         # gh-29388
         dt = np.dtype([('a', 'i4'), ('b', 'i4')])
-        a = np.array([(1, 2), (3, 4)], dtype= dt)
+        a = np.array([(1, 2), (3, 4)], dtype=dt)
         with pytest.raises(TypeError, match="ufunc 'square' not supported"):
             a ** 2
 

From ddaef11f219990372f1c10bca2d3d3f0bb57a2e9 Mon Sep 17 00:00:00 2001
From: Maanas Arora <maanasarora23@gmail.com>
Date: Thu, 17 Jul 2025 05:16:12 -0400
Subject: [PATCH 5/5] BUG: replace new variable `is_square` with direct op
 comparison in `fast_scalar_power` function

---
 numpy/_core/src/multiarray/number.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/numpy/_core/src/multiarray/number.c b/numpy/_core/src/multiarray/number.c
index 6b885ffa68e1..de4012641684 100644
--- a/numpy/_core/src/multiarray/number.c
+++ b/numpy/_core/src/multiarray/number.c
@@ -332,7 +332,6 @@ static int
 fast_scalar_power(PyObject *o1, PyObject *o2, int inplace, PyObject **result)
 {
     PyObject *fastop = NULL;
-    int is_square = 0;
 
     if (PyLong_CheckExact(o2)) {
         int overflow = 0;
@@ -346,7 +345,6 @@ fast_scalar_power(PyObject *o1, PyObject *o2, int inplace, PyObject **result)
         }
         else if (exp == 2) {
             fastop = n_ops.square;
-            is_square = 1;
         }
         else {
             return 1;
@@ -369,7 +367,7 @@ fast_scalar_power(PyObject *o1, PyObject *o2, int inplace, PyObject **result)
     if (PyArray_ISOBJECT(a1)) {
         return 1;
     }
-    if (!is_square && !PyArray_ISFLOAT(a1) && !PyArray_ISCOMPLEX(a1)) {
+    if (fastop != n_ops.square && !PyArray_ISFLOAT(a1) && !PyArray_ISCOMPLEX(a1)) {
         // we special-case squaring for any array type
         // gh-29388
         return 1;