use crate::error::NumRs2Error;
use std::fmt;
pub type WaveletResult<T> = Result<T, WaveletError>;
#[derive(Debug, Clone)]
pub enum WaveletError {
InvalidWavelet(String),
InvalidLength(String),
InvalidLevel(String),
InvalidScale(String),
FilterMismatch(String),
InsufficientData(String),
ComputationError(String),
NumRs2Error(String),
}
impl fmt::Display for WaveletError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
WaveletError::InvalidWavelet(msg) => write!(f, "Invalid wavelet: {}", msg),
WaveletError::InvalidLength(msg) => write!(f, "Invalid length: {}", msg),
WaveletError::InvalidLevel(msg) => write!(f, "Invalid level: {}", msg),
WaveletError::InvalidScale(msg) => write!(f, "Invalid scale: {}", msg),
WaveletError::FilterMismatch(msg) => write!(f, "Filter mismatch: {}", msg),
WaveletError::InsufficientData(msg) => write!(f, "Insufficient data: {}", msg),
WaveletError::ComputationError(msg) => write!(f, "Computation error: {}", msg),
WaveletError::NumRs2Error(msg) => write!(f, "NumRs2 error: {}", msg),
}
}
}
impl std::error::Error for WaveletError {}
impl From<NumRs2Error> for WaveletError {
fn from(err: NumRs2Error) -> Self {
WaveletError::NumRs2Error(err.to_string())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ExtensionMode {
Periodic,
Symmetric,
ZeroPad,
Smooth,
}
impl ExtensionMode {
pub fn description(&self) -> &str {
match self {
ExtensionMode::Periodic => "Periodic wrap-around extension",
ExtensionMode::Symmetric => "Symmetric mirror extension",
ExtensionMode::ZeroPad => "Zero-padding extension",
ExtensionMode::Smooth => "Smooth edge replication extension",
}
}
}
pub mod cwt;
pub mod dwt;
pub mod families;
pub mod mra;
pub mod packets;
pub use cwt::{cwt, CWTResult, ContinuousWavelet};
pub use dwt::{dwt_1d, idwt_1d, idwt_1d_mode, wavedec, waverec, waverec_mode};
pub use families::{Wavelet, WaveletType};
pub use mra::{denoise_signal, MultiresolutionAnalysis, ThresholdType};
pub use packets::{packet_decompose, BestBasisCriterion, WaveletPacket};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_extension_mode_description() {
assert!(!ExtensionMode::Periodic.description().is_empty());
assert!(!ExtensionMode::Symmetric.description().is_empty());
assert!(!ExtensionMode::ZeroPad.description().is_empty());
assert!(!ExtensionMode::Smooth.description().is_empty());
}
#[test]
fn test_wavelet_error_display() {
let err = WaveletError::InvalidWavelet("test".to_string());
assert!(err.to_string().contains("Invalid wavelet"));
let err = WaveletError::InvalidLength("test".to_string());
assert!(err.to_string().contains("Invalid length"));
}
#[test]
fn test_wavelet_error_from_numrs2() {
let numrs2_err = NumRs2Error::ShapeMismatch {
expected: vec![2, 2],
actual: vec![3, 3],
};
let wavelet_err: WaveletError = numrs2_err.into();
assert!(matches!(wavelet_err, WaveletError::NumRs2Error(_)));
}
}