#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub mod adwin;
pub mod ddm;
pub mod pht;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum DriftSignal {
Stable,
Warning,
Drift,
}
impl core::fmt::Display for DriftSignal {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Self::Stable => write!(f, "Stable"),
Self::Warning => write!(f, "Warning"),
Self::Drift => write!(f, "Drift"),
}
}
}
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub enum DriftDetectorState {
PageHinkley {
running_mean: f64,
sum_up: f64,
min_sum_up: f64,
sum_down: f64,
min_sum_down: f64,
count: u64,
},
Adwin {
rows: alloc::vec::Vec<alloc::vec::Vec<AdwinBucketState>>,
total: f64,
variance: f64,
count: u64,
width: u64,
},
Ddm {
mean: f64,
m2: f64,
count: u64,
min_p_plus_s: f64,
min_s: f64,
},
}
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct AdwinBucketState {
pub total: f64,
pub variance: f64,
pub count: u64,
}
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub trait DriftDetector: Send + Sync + 'static {
fn update(&mut self, value: f64) -> DriftSignal;
fn reset(&mut self);
fn clone_fresh(&self) -> alloc::boxed::Box<dyn DriftDetector>;
fn clone_boxed(&self) -> alloc::boxed::Box<dyn DriftDetector>;
fn estimated_mean(&self) -> f64;
fn serialize_state(&self) -> Option<DriftDetectorState> {
None
}
fn restore_state(&mut self, _state: &DriftDetectorState) -> bool {
false
}
}