1
+ use numpy:: PyReadonlyArray1 ;
1
2
use pyo3:: prelude:: * ;
2
3
use wide:: * ;
3
- use numpy:: { PyReadonlyArray1 } ;
4
4
5
5
#[ pyfunction]
6
6
fn first_true_1d_a ( array : PyReadonlyArray1 < bool > ) -> isize {
7
7
match array. as_slice ( ) {
8
- Ok ( slice) => slice. iter ( ) . position ( |& v| v) . map ( |i| i as isize ) . unwrap_or ( -1 ) ,
8
+ Ok ( slice) => slice
9
+ . iter ( )
10
+ . position ( |& v| v)
11
+ . map ( |i| i as isize )
12
+ . unwrap_or ( -1 ) ,
9
13
Err ( _) => -1 , // Should not happen for 1D arrays, but fallback to -1
10
14
}
11
15
}
@@ -43,29 +47,51 @@ fn first_true_1d_c(array: PyReadonlyArray1<bool>) -> isize {
43
47
44
48
// Process 8 elements at a time
45
49
while i + 8 <= len {
46
- if slice[ i] { return i as isize ; }
47
- if slice[ i+1 ] { return ( i+1 ) as isize ; }
48
- if slice[ i+2 ] { return ( i+2 ) as isize ; }
49
- if slice[ i+3 ] { return ( i+3 ) as isize ; }
50
- if slice[ i+4 ] { return ( i+4 ) as isize ; }
51
- if slice[ i+5 ] { return ( i+5 ) as isize ; }
52
- if slice[ i+6 ] { return ( i+6 ) as isize ; }
53
- if slice[ i+7 ] { return ( i+7 ) as isize ; }
50
+ if slice[ i] {
51
+ return i as isize ;
52
+ }
53
+ if slice[ i + 1 ] {
54
+ return ( i + 1 ) as isize ;
55
+ }
56
+ if slice[ i + 2 ] {
57
+ return ( i + 2 ) as isize ;
58
+ }
59
+ if slice[ i + 3 ] {
60
+ return ( i + 3 ) as isize ;
61
+ }
62
+ if slice[ i + 4 ] {
63
+ return ( i + 4 ) as isize ;
64
+ }
65
+ if slice[ i + 5 ] {
66
+ return ( i + 5 ) as isize ;
67
+ }
68
+ if slice[ i + 6 ] {
69
+ return ( i + 6 ) as isize ;
70
+ }
71
+ if slice[ i + 7 ] {
72
+ return ( i + 7 ) as isize ;
73
+ }
54
74
i += 8 ;
55
75
}
56
76
57
77
// Handle remainder
58
78
while i < len {
59
- if slice[ i] { return i as isize ; }
79
+ if slice[ i] {
80
+ return i as isize ;
81
+ }
60
82
i += 1 ;
61
83
}
62
84
-1
63
85
} else {
64
- array. as_array ( ) . iter ( ) . position ( |& v| v) . map ( |i| i as isize ) . unwrap_or ( -1 )
86
+ array
87
+ . as_array ( )
88
+ . iter ( )
89
+ . position ( |& v| v)
90
+ . map ( |i| i as isize )
91
+ . unwrap_or ( -1 )
65
92
}
66
93
}
67
94
68
-
69
95
#[ pyfunction]
70
96
fn first_true_1d_d ( array : PyReadonlyArray1 < bool > ) -> isize {
71
97
if let Ok ( slice) = array. as_slice ( ) {
@@ -75,30 +101,52 @@ fn first_true_1d_d(array: PyReadonlyArray1<bool>) -> isize {
75
101
unsafe {
76
102
// Process 8 elements at a time
77
103
while i + 8 <= len {
78
- if * slice. get_unchecked ( i) { return i as isize ; }
79
- if * slice. get_unchecked ( i+1 ) { return ( i+1 ) as isize ; }
80
- if * slice. get_unchecked ( i+2 ) { return ( i+2 ) as isize ; }
81
- if * slice. get_unchecked ( i+3 ) { return ( i+3 ) as isize ; }
82
- if * slice. get_unchecked ( i+4 ) { return ( i+4 ) as isize ; }
83
- if * slice. get_unchecked ( i+5 ) { return ( i+5 ) as isize ; }
84
- if * slice. get_unchecked ( i+6 ) { return ( i+6 ) as isize ; }
85
- if * slice. get_unchecked ( i+7 ) { return ( i+7 ) as isize ; }
104
+ if * slice. get_unchecked ( i) {
105
+ return i as isize ;
106
+ }
107
+ if * slice. get_unchecked ( i + 1 ) {
108
+ return ( i + 1 ) as isize ;
109
+ }
110
+ if * slice. get_unchecked ( i + 2 ) {
111
+ return ( i + 2 ) as isize ;
112
+ }
113
+ if * slice. get_unchecked ( i + 3 ) {
114
+ return ( i + 3 ) as isize ;
115
+ }
116
+ if * slice. get_unchecked ( i + 4 ) {
117
+ return ( i + 4 ) as isize ;
118
+ }
119
+ if * slice. get_unchecked ( i + 5 ) {
120
+ return ( i + 5 ) as isize ;
121
+ }
122
+ if * slice. get_unchecked ( i + 6 ) {
123
+ return ( i + 6 ) as isize ;
124
+ }
125
+ if * slice. get_unchecked ( i + 7 ) {
126
+ return ( i + 7 ) as isize ;
127
+ }
86
128
i += 8 ;
87
129
}
88
130
89
131
// Handle remainder
90
132
while i < len {
91
- if * slice. get_unchecked ( i) { return i as isize ; }
133
+ if * slice. get_unchecked ( i) {
134
+ return i as isize ;
135
+ }
92
136
i += 1 ;
93
137
}
94
138
}
95
139
-1
96
140
} else {
97
- array. as_array ( ) . iter ( ) . position ( |& v| v) . map ( |i| i as isize ) . unwrap_or ( -1 )
141
+ array
142
+ . as_array ( )
143
+ . iter ( )
144
+ . position ( |& v| v)
145
+ . map ( |i| i as isize )
146
+ . unwrap_or ( -1 )
98
147
}
99
148
}
100
149
101
-
102
150
#[ pyfunction]
103
151
fn first_true_1d_e ( array : PyReadonlyArray1 < bool > ) -> isize {
104
152
if let Ok ( slice) = array. as_slice ( ) {
@@ -132,11 +180,15 @@ fn first_true_1d_e(array: PyReadonlyArray1<bool>) -> isize {
132
180
}
133
181
-1
134
182
} else {
135
- array. as_array ( ) . iter ( ) . position ( |& v| v) . map ( |i| i as isize ) . unwrap_or ( -1 )
183
+ array
184
+ . as_array ( )
185
+ . iter ( )
186
+ . position ( |& v| v)
187
+ . map ( |i| i as isize )
188
+ . unwrap_or ( -1 )
136
189
}
137
190
}
138
191
139
-
140
192
#[ pyfunction]
141
193
fn first_true_1d_f ( py : Python , array : PyReadonlyArray1 < bool > ) -> isize {
142
194
if let Ok ( slice) = array. as_slice ( ) {
@@ -174,12 +226,15 @@ fn first_true_1d_f(py: Python, array: PyReadonlyArray1<bool>) -> isize {
174
226
} else {
175
227
let array_view = array. as_array ( ) ;
176
228
py. allow_threads ( || {
177
- array_view. iter ( ) . position ( |& v| v) . map ( |i| i as isize ) . unwrap_or ( -1 )
229
+ array_view
230
+ . iter ( )
231
+ . position ( |& v| v)
232
+ . map ( |i| i as isize )
233
+ . unwrap_or ( -1 )
178
234
} )
179
235
}
180
236
}
181
237
182
-
183
238
#[ pyfunction]
184
239
#[ pyo3( signature = ( array, forward=true ) ) ]
185
240
fn first_true_1d ( py : Python , array : PyReadonlyArray1 < bool > , forward : bool ) -> isize {
@@ -222,9 +277,9 @@ fn first_true_1d(py: Python, array: PyReadonlyArray1<bool>, forward: bool) -> is
222
277
let equal_one = chunk. cmp_eq ( ones) ;
223
278
if equal_one. any ( ) {
224
279
// Found a true in this chunk, search backwards within it
225
- for j in ( 0 .. 32 ) . rev ( ) {
226
- if i + j < len && * ptr. add ( i + j) != 0 {
227
- return ( i + j ) as isize ;
280
+ for j in ( i..i + 32 ) . rev ( ) {
281
+ if * ptr. add ( j) != 0 {
282
+ return j as isize ;
228
283
}
229
284
}
230
285
}
@@ -245,15 +300,22 @@ fn first_true_1d(py: Python, array: PyReadonlyArray1<bool>, forward: bool) -> is
245
300
let array_view = array. as_array ( ) ;
246
301
py. allow_threads ( || {
247
302
if forward {
248
- array_view. iter ( ) . position ( |& v| v) . map ( |i| i as isize ) . unwrap_or ( -1 )
303
+ array_view
304
+ . iter ( )
305
+ . position ( |& v| v)
306
+ . map ( |i| i as isize )
307
+ . unwrap_or ( -1 )
249
308
} else {
250
- array_view. iter ( ) . rposition ( |& v| v) . map ( |i| i as isize ) . unwrap_or ( -1 )
309
+ array_view
310
+ . iter ( )
311
+ . rposition ( |& v| v)
312
+ . map ( |i| i as isize )
313
+ . unwrap_or ( -1 )
251
314
}
252
315
} )
253
316
}
254
317
}
255
318
256
-
257
319
#[ pymodule]
258
320
fn arrayredox ( m : & Bound < ' _ , PyModule > ) -> PyResult < ( ) > {
259
321
m. add_function ( wrap_pyfunction ! ( first_true_1d_a, m) ?) ?;
0 commit comments