use alloc::format;
use crate::error::{RcfError, RcfResult};
pub const DEFAULT_MIN_TREES: usize = 16;
pub const DEFAULT_CONFIDENCE_THRESHOLD: f64 = 0.05;
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct EarlyTermConfig {
pub min_trees: usize,
pub confidence_threshold: f64,
}
impl Default for EarlyTermConfig {
fn default() -> Self {
Self {
min_trees: DEFAULT_MIN_TREES,
confidence_threshold: DEFAULT_CONFIDENCE_THRESHOLD,
}
}
}
impl EarlyTermConfig {
pub fn validate(&self) -> RcfResult<()> {
if self.min_trees == 0 {
return Err(RcfError::InvalidConfig(
"EarlyTermConfig::min_trees must be > 0".into(),
));
}
if !self.confidence_threshold.is_finite()
|| self.confidence_threshold <= 0.0
|| self.confidence_threshold > 1.0
{
return Err(RcfError::InvalidConfig(
format!(
"EarlyTermConfig::confidence_threshold must be in (0, 1], got {}",
self.confidence_threshold
)
.into(),
));
}
Ok(())
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct EarlyTermScore {
pub score: crate::domain::AnomalyScore,
pub trees_evaluated: usize,
pub trees_available: usize,
pub stderr: f64,
pub early_stopped: bool,
}