Skip to content

Commit e8127ea

Browse files
committed
0.1.0 RC 1
1 parent 3f99165 commit e8127ea

File tree

1 file changed

+108
-108
lines changed

1 file changed

+108
-108
lines changed

src/lib.rs

Lines changed: 108 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,14 @@ use wide::*;
77
// use std::simd::Simd;
88
// use std::simd::cmp::SimdPartialEq;
99

10-
use numpy::ndarray::{Array2, ArrayView2};
11-
use numpy::IntoPyArray;
10+
use numpy::ndarray::Array2;
1211
use numpy::PyArray1;
1312
use numpy::PyArrayMethods;
13+
use numpy::PyReadonlyArray2;
1414
use numpy::PyUntypedArrayMethods;
15-
use numpy::ToPyArray;
16-
use numpy::{PyArray2, PyReadonlyArray2};
1715

18-
use rayon::prelude::*;
19-
use rayon::ThreadPoolBuilder;
16+
// use rayon::prelude::*;
17+
// use rayon::ThreadPoolBuilder;
2018
use std::sync::Arc;
2119

2220
#[pyfunction]
@@ -425,7 +423,7 @@ pub fn prepare_array_for_axis<'py>(
425423
if is_c && axis == 1 {
426424
if let Ok(slice) = array.as_slice() {
427425
return Ok(PreparedBool2D {
428-
data: unsafe { std::mem::transmute(slice) }, // &[bool] → &[u8]
426+
data: unsafe { std::mem::transmute::<&[bool], &[u8]>(slice) }, // &[bool] → &[u8]
429427
nrows,
430428
ncols,
431429
_keepalive: None,
@@ -438,7 +436,7 @@ pub fn prepare_array_for_axis<'py>(
438436
let transposed = array_view.reversed_axes();
439437
if let Some(slice) = transposed.as_standard_layout().as_slice_memory_order() {
440438
return Ok(PreparedBool2D {
441-
data: unsafe { std::mem::transmute(slice) },
439+
data: unsafe { std::mem::transmute::<&[bool], &[u8]>(slice) },
442440
nrows,
443441
ncols,
444442
_keepalive: None,
@@ -458,7 +456,7 @@ pub fn prepare_array_for_axis<'py>(
458456
.expect("newly allocated Array2 must be contiguous");
459457

460458
Ok(PreparedBool2D {
461-
data: unsafe { std::mem::transmute(slice) },
459+
data: unsafe { std::mem::transmute::<&[bool], &[u8]>(slice) },
462460
nrows,
463461
ncols,
464462
_keepalive: Some(Arc::new(array_owned)),
@@ -491,6 +489,7 @@ pub fn first_true_2d<'py>(
491489
let mut i;
492490

493491
if forward {
492+
#[allow(clippy::needless_range_loop)]
494493
for row in 0..rows {
495494
let ptr = unsafe { base_ptr.add(row * row_len) };
496495
i = 0;
@@ -514,6 +513,7 @@ pub fn first_true_2d<'py>(
514513
}
515514
} else {
516515
// Backward search
516+
#[allow(clippy::needless_range_loop)]
517517
for row in 0..rows {
518518
let ptr = unsafe { base_ptr.add(row * row_len) };
519519

@@ -553,111 +553,111 @@ pub fn first_true_2d<'py>(
553553
Ok(pyarray)
554554
}
555555

556-
#[pyfunction]
557-
#[pyo3(signature = (array, *, forward=true, axis))]
558-
pub fn first_true_2d_b<'py>(
559-
py: Python<'py>,
560-
array: PyReadonlyArray2<'py, bool>,
561-
forward: bool,
562-
axis: isize,
563-
) -> PyResult<Bound<'py, PyArray1<isize>>> {
564-
let prepared = prepare_array_for_axis(array, axis)?;
565-
let data = prepared.data;
566-
let rows = prepared.nrows;
567-
let row_len = prepared.ncols;
568-
569-
let mut result = vec![-1isize; rows];
570-
571-
// Dynamically select thread count
572-
let max_threads = if rows < 100 {
573-
1
574-
} else if rows < 1000 {
575-
1
576-
} else if rows < 10000 {
577-
1
578-
} else {
579-
16
580-
};
556+
// #[pyfunction]
557+
// #[pyo3(signature = (array, *, forward=true, axis))]
558+
// pub fn first_true_2d_b<'py>(
559+
// py: Python<'py>,
560+
// array: PyReadonlyArray2<'py, bool>,
561+
// forward: bool,
562+
// axis: isize,
563+
// ) -> PyResult<Bound<'py, PyArray1<isize>>> {
564+
// let prepared = prepare_array_for_axis(array, axis)?;
565+
// let data = prepared.data;
566+
// let rows = prepared.nrows;
567+
// let row_len = prepared.ncols;
568+
569+
// let mut result = vec![-1isize; rows];
570+
571+
// // Dynamically select thread count
572+
// let max_threads = if rows < 100 {
573+
// 1
574+
// } else if rows < 1000 {
575+
// 1
576+
// } else if rows < 10000 {
577+
// 1
578+
// } else {
579+
// 16
580+
// };
581581

582-
py.allow_threads(|| {
583-
let base_ptr = data.as_ptr() as usize;
584-
const LANES: usize = 32;
585-
let ones = u8x32::splat(1);
582+
// py.allow_threads(|| {
583+
// let base_ptr = data.as_ptr() as usize;
584+
// const LANES: usize = 32;
585+
// let ones = u8x32::splat(1);
586586

587-
let process_row = |row: usize| -> isize {
588-
let ptr = (base_ptr + row * row_len) as *const u8;
589-
let mut found = -1isize;
587+
// let process_row = |row: usize| -> isize {
588+
// let ptr = (base_ptr + row * row_len) as *const u8;
589+
// let mut found = -1isize;
590590

591-
unsafe {
592-
if forward {
593-
let mut i = 0;
594-
while i + LANES <= row_len {
595-
let chunk = &*(ptr.add(i) as *const [u8; LANES]);
596-
let vec = u8x32::from(*chunk);
597-
if vec.cmp_eq(ones).any() {
598-
break;
599-
}
600-
i += LANES;
601-
}
602-
while i < row_len {
603-
if *ptr.add(i) != 0 {
604-
found = i as isize;
605-
break;
606-
}
607-
i += 1;
608-
}
609-
} else {
610-
let mut i = row_len;
611-
while i >= LANES {
612-
i -= LANES;
613-
let chunk = &*(ptr.add(i) as *const [u8; LANES]);
614-
let vec = u8x32::from(*chunk);
615-
if vec.cmp_eq(ones).any() {
616-
for j in (i..i + LANES).rev() {
617-
if *ptr.add(j) != 0 {
618-
found = j as isize;
619-
break;
620-
}
621-
}
622-
break;
623-
}
624-
}
625-
if i > 0 && i < LANES {
626-
for j in (0..i).rev() {
627-
if *ptr.add(j) != 0 {
628-
found = j as isize;
629-
break;
630-
}
631-
}
632-
}
633-
}
634-
}
591+
// unsafe {
592+
// if forward {
593+
// let mut i = 0;
594+
// while i + LANES <= row_len {
595+
// let chunk = &*(ptr.add(i) as *const [u8; LANES]);
596+
// let vec = u8x32::from(*chunk);
597+
// if vec.cmp_eq(ones).any() {
598+
// break;
599+
// }
600+
// i += LANES;
601+
// }
602+
// while i < row_len {
603+
// if *ptr.add(i) != 0 {
604+
// found = i as isize;
605+
// break;
606+
// }
607+
// i += 1;
608+
// }
609+
// } else {
610+
// let mut i = row_len;
611+
// while i >= LANES {
612+
// i -= LANES;
613+
// let chunk = &*(ptr.add(i) as *const [u8; LANES]);
614+
// let vec = u8x32::from(*chunk);
615+
// if vec.cmp_eq(ones).any() {
616+
// for j in (i..i + LANES).rev() {
617+
// if *ptr.add(j) != 0 {
618+
// found = j as isize;
619+
// break;
620+
// }
621+
// }
622+
// break;
623+
// }
624+
// }
625+
// if i > 0 && i < LANES {
626+
// for j in (0..i).rev() {
627+
// if *ptr.add(j) != 0 {
628+
// found = j as isize;
629+
// break;
630+
// }
631+
// }
632+
// }
633+
// }
634+
// }
635635

636-
found
637-
};
636+
// found
637+
// };
638638

639-
if max_threads == 1 {
640-
// Single-threaded path
641-
for row in 0..rows {
642-
result[row] = process_row(row);
643-
}
644-
} else {
645-
// Multi-threaded path with Rayon
646-
let pool = rayon::ThreadPoolBuilder::new()
647-
.num_threads(max_threads)
648-
.build()
649-
.unwrap();
650-
651-
pool.install(|| {
652-
result.par_iter_mut().enumerate().for_each(|(row, out)| {
653-
*out = process_row(row);
654-
});
655-
});
656-
}
657-
});
639+
// if max_threads == 1 {
640+
// // Single-threaded path
641+
// for row in 0..rows {
642+
// result[row] = process_row(row);
643+
// }
644+
// } else {
645+
// // Multi-threaded path with Rayon
646+
// let pool = rayon::ThreadPoolBuilder::new()
647+
// .num_threads(max_threads)
648+
// .build()
649+
// .unwrap();
650+
651+
// pool.install(|| {
652+
// result.par_iter_mut().enumerate().for_each(|(row, out)| {
653+
// *out = process_row(row);
654+
// });
655+
// });
656+
// }
657+
// });
658658

659-
Ok(PyArray1::from_vec(py, result))
660-
}
659+
// Ok(PyArray1::from_vec(py, result))
660+
// }
661661

662662
//------------------------------------------------------------------------------
663663

0 commit comments

Comments
 (0)