pub mod ev_augmentation;
pub mod ev_filtering;
pub mod ev_formats;
pub mod tracing_config;
pub mod python {
use pyo3::prelude::*;
use pyo3::types::PyAny;
pub fn extract_lazy_frame(py_obj: &Bound<'_, PyAny>) -> PyResult<polars::prelude::LazyFrame> {
use polars::prelude::IntoLazy;
use pyo3_polars::PyDataFrame;
if let Ok(pydf) = py_obj.extract::<PyDataFrame>() {
return Ok(pydf.0.lazy());
}
if let Ok(lazy_method) = py_obj.getattr("lazy") {
if let Ok(lazy_result) = lazy_method.call0() {
if let Ok(pydf) = lazy_result.extract::<PyDataFrame>() {
return Ok(pydf.0.lazy());
}
}
}
Err(pyo3::exceptions::PyTypeError::new_err(
"Expected a Polars DataFrame - ensure you're using pl.DataFrame(...)",
))
}
pub fn lazy_frame_to_python(
lf: polars::prelude::LazyFrame,
py: Python<'_>,
) -> PyResult<PyObject> {
use pyo3::IntoPyObject;
use pyo3_polars::PyDataFrame;
let df = lf.collect().map_err(|e| {
pyo3::exceptions::PyRuntimeError::new_err(format!("Failed to collect LazyFrame: {}", e))
})?;
let py_dataframe = PyDataFrame(df);
Ok(py_dataframe.into_pyobject(py)?.into())
}
}
use pyo3::prelude::*;
use pyo3::wrap_pyfunction;
#[pymodule]
fn evlib(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_function(wrap_pyfunction!(version, m)?)?;
m.add_function(wrap_pyfunction!(ev_formats::python::load_events_py, m)?)?;
m.add_function(wrap_pyfunction!(ev_formats::python::detect_format_py, m)?)?;
m.add_function(wrap_pyfunction!(
ev_formats::python::load_events_to_pyarrow,
m
)?)?;
#[cfg(unix)]
m.add_function(wrap_pyfunction!(
ev_formats::python::save_events_to_hdf5_py,
m
)?)?;
let core_submodule = PyModule::new(m.py(), "core")?;
core_submodule.add_function(wrap_pyfunction!(
ev_formats::python::events_to_block_py,
&core_submodule
)?)?;
core_submodule.add_function(wrap_pyfunction!(
ev_formats::python::merge_events_py,
&core_submodule
)?)?;
core_submodule.add_function(wrap_pyfunction!(
ev_formats::python::add_random_events_py,
&core_submodule
)?)?;
core_submodule.add_function(wrap_pyfunction!(
ev_formats::python::remove_events_py,
&core_submodule
)?)?;
m.add_submodule(&core_submodule)?;
let formats_submodule = PyModule::new(m.py(), "formats")?;
formats_submodule.add_function(wrap_pyfunction!(
ev_formats::python::load_events_py,
&formats_submodule
)?)?;
#[cfg(unix)]
formats_submodule.add_function(wrap_pyfunction!(
ev_formats::python::save_events_to_hdf5_py,
&formats_submodule
)?)?;
formats_submodule.add_function(wrap_pyfunction!(
ev_formats::python::save_events_to_text_py,
&formats_submodule
)?)?;
formats_submodule.add_function(wrap_pyfunction!(
ev_formats::python::detect_format_py,
&formats_submodule
)?)?;
formats_submodule.add_function(wrap_pyfunction!(
ev_formats::python::get_format_description_py,
&formats_submodule
)?)?;
formats_submodule.add_function(wrap_pyfunction!(
ev_formats::python::test_prophesee_ecf_decode_py,
&formats_submodule
)?)?;
formats_submodule.add_function(wrap_pyfunction!(
ev_formats::python::load_events_to_pyarrow,
&formats_submodule
)?)?;
formats_submodule.add_function(wrap_pyfunction!(
ev_formats::python::pyarrow_to_events_py,
&formats_submodule
)?)?;
m.add_submodule(&formats_submodule)?;
let tracing_submodule = PyModule::new(m.py(), "tracing_config")?;
tracing_submodule.add_function(wrap_pyfunction!(
tracing_config::python::init_py,
&tracing_submodule
)?)?;
tracing_submodule.add_function(wrap_pyfunction!(
tracing_config::python::init_debug_py,
&tracing_submodule
)?)?;
tracing_submodule.add_function(wrap_pyfunction!(
tracing_config::python::init_with_filter_py,
&tracing_submodule
)?)?;
tracing_submodule.add_function(wrap_pyfunction!(
tracing_config::python::init_production_py,
&tracing_submodule
)?)?;
tracing_submodule.add_function(wrap_pyfunction!(
tracing_config::python::init_development_py,
&tracing_submodule
)?)?;
m.add_submodule(&tracing_submodule)?;
let filtering_submodule = PyModule::new(m.py(), "filtering")?;
ev_filtering::python::register_filtering_functions(&filtering_submodule)?;
m.add_submodule(&filtering_submodule)?;
ev_filtering::python::register_filtering_functions(m)?;
let augmentation_submodule = PyModule::new(m.py(), "ev_augmentation")?;
ev_augmentation::python::register_augmentation_functions(&augmentation_submodule)?;
m.add_submodule(&augmentation_submodule)?;
m.add("__version__", env!("CARGO_PKG_VERSION"))?;
Ok(())
}
#[pyfunction]
fn version() -> PyResult<String> {
Ok(env!("CARGO_PKG_VERSION").to_string())
}