#![warn(clippy::perf, clippy::style, missing_docs)]
use bincode::ErrorKind;
#[cfg(feature = "python")]
use pyo3::PyErr;
use thiserror::Error;
pub mod amplitudes;
pub mod data;
pub mod resources;
pub mod utils;
pub mod traits {
pub use crate::amplitudes::Amplitude;
pub use crate::utils::variables::Variable;
pub use crate::utils::vectors::{FourMomentum, FourVector, ThreeMomentum, ThreeVector};
pub use crate::ReadWrite;
}
pub use crate::data::{open, BinnedDataset, Dataset, Event};
pub use crate::resources::{
Cache, ComplexMatrixID, ComplexScalarID, ComplexVectorID, MatrixID, ParameterID, Parameters,
Resources, ScalarID, VectorID,
};
pub use crate::utils::enums::{Channel, Frame, Sign};
pub use crate::utils::variables::{
Angles, CosTheta, Mandelstam, Mass, Phi, PolAngle, PolMagnitude, Polarization,
};
pub use amplitudes::{
constant, parameter, AmplitudeID, Evaluator, Expression, Manager, Model, ParameterLike,
};
pub use ganesh::{mcmc::Ensemble, Bound, Status};
pub use nalgebra::{DVector, Vector3, Vector4};
pub use num::Complex;
#[cfg(not(feature = "f32"))]
pub type Float = f64;
#[cfg(feature = "f32")]
pub type Float = f32;
#[cfg(not(feature = "f32"))]
pub const PI: Float = std::f64::consts::PI;
#[cfg(feature = "f32")]
pub const PI: Float = std::f32::consts::PI;
#[derive(Error, Debug)]
pub enum LadduError {
#[error("IO Error: {0}")]
IOError(#[from] std::io::Error),
#[error("Parquet Error: {0}")]
ParquetError(#[from] parquet::errors::ParquetError),
#[error("Arrow Error: {0}")]
ArrowError(#[from] arrow::error::ArrowError),
#[error("Failed to expand path: {0}")]
LookupError(#[from] shellexpand::LookupError<std::env::VarError>),
#[error("An amplitude by the name \"{name}\" is already registered by this manager!")]
RegistrationError {
name: String,
},
#[error("No registered amplitude with name \"{name}\"!")]
AmplitudeNotFoundError {
name: String,
},
#[error("Failed to parse string: \"{name}\" does not correspond to a valid \"{object}\"!")]
ParseError {
name: String,
object: String,
},
#[error("(De)Serialization error: {0}")]
SerdeError(#[from] Box<ErrorKind>),
#[error("Pickle conversion error: {0}")]
PickleError(#[from] serde_pickle::Error),
#[cfg(feature = "rayon")]
#[error("Error building thread pool: {0}")]
ThreadPoolError(#[from] rayon::ThreadPoolBuildError),
#[cfg(feature = "numpy")]
#[error("Numpy error: {0}")]
NumpyError(#[from] numpy::FromVecError),
#[error("{0}")]
Custom(String),
}
impl Clone for LadduError {
fn clone(&self) -> Self {
let err_string = self.to_string();
LadduError::Custom(err_string)
}
}
#[cfg(feature = "python")]
impl From<LadduError> for PyErr {
fn from(err: LadduError) -> Self {
use pyo3::exceptions::*;
let err_string = err.to_string();
match err {
LadduError::LookupError(_)
| LadduError::RegistrationError { .. }
| LadduError::AmplitudeNotFoundError { .. }
| LadduError::ParseError { .. } => PyValueError::new_err(err_string),
LadduError::ParquetError(_)
| LadduError::ArrowError(_)
| LadduError::IOError(_)
| LadduError::SerdeError(_)
| LadduError::PickleError(_) => PyIOError::new_err(err_string),
LadduError::Custom(_) => PyException::new_err(err_string),
#[cfg(feature = "rayon")]
LadduError::ThreadPoolError(_) => PyException::new_err(err_string),
#[cfg(feature = "numpy")]
LadduError::NumpyError(_) => PyException::new_err(err_string),
}
}
}
use serde::{de::DeserializeOwned, Serialize};
use std::{
fmt::Debug,
fs::File,
io::{BufReader, BufWriter},
path::Path,
};
pub trait ReadWrite: Serialize + DeserializeOwned {
fn create_null() -> Self;
fn save_as<T: AsRef<str>>(&self, file_path: T) -> Result<(), LadduError> {
let expanded_path = shellexpand::full(file_path.as_ref())?;
let file_path = Path::new(expanded_path.as_ref());
let file = File::create(file_path)?;
let mut writer = BufWriter::new(file);
serde_pickle::to_writer(&mut writer, self, Default::default())?;
Ok(())
}
fn load_from<T: AsRef<str>>(file_path: T) -> Result<Self, LadduError> {
let file_path = Path::new(&*shellexpand::full(file_path.as_ref())?).canonicalize()?;
let file = File::open(file_path)?;
let reader = BufReader::new(file);
serde_pickle::from_reader(reader, Default::default()).map_err(LadduError::from)
}
}
impl ReadWrite for Status {
fn create_null() -> Self {
Status::default()
}
}
impl ReadWrite for Ensemble {
fn create_null() -> Self {
Ensemble::new(Vec::default())
}
}
impl ReadWrite for Model {
fn create_null() -> Self {
Model {
manager: Manager::default(),
expression: Expression::default(),
}
}
}