Skip to main content

reducers/
lib.rs

1//! Rust-backed reductions for NumPy arrays (plain + NaN-aware).
2//!
3//! The kernel modules (`finite`, `parallel`, `reducers_1d`, `axis`) are pure
4//! Rust with no PyO3/NumPy dependency. The PyO3 extension (`reducers._core`) is
5//! compiled only with the `python` / `extension-module` feature.
6//!
7//! # Rust usage
8//!
9//! ```
10//! use reducers::{reducers_1d, ScanPolicy};
11//!
12//! let v = [1.0_f64, 2.0, f64::NAN, 4.0];
13//! // NaN-aware mean (np.nanmean parity: skip NaN, keep inf):
14//! assert_eq!(reducers_1d::mean(&v, ScanPolicy::SkipNan), 7.0 / 3.0);
15//! // Plain mean propagates NaN (np.mean):
16//! assert!(reducers_1d::mean(&v, ScanPolicy::AllValues).is_nan());
17//! // Finite-only (ignore inf too):
18//! let w = [1.0_f64, f64::INFINITY, 3.0];
19//! assert_eq!(reducers_1d::mean(&w, ScanPolicy::SkipNonFinite), 2.0);
20//! ```
21
22pub mod axis;
23pub mod finite;
24pub mod parallel;
25pub mod reducers_1d;
26
27pub use finite::{Float, ScanPolicy};
28
29#[cfg(feature = "python")]
30mod pyapi;
31
32#[cfg(feature = "extension-module")]
33#[pymodule]
34fn _core(m: &pyo3::Bound<'_, pyo3::types::PyModule>) -> pyo3::PyResult<()> {
35    pyapi::register(m)
36}
37
38#[cfg(feature = "extension-module")]
39use pyo3::pymodule;