use crate::error::{DsfbError, Result};
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct EngineConfig {
pub drift_window: usize,
pub dsa_window: usize,
pub persistence_threshold: usize,
pub consistency_gate: f64,
pub corroboration_count: usize,
pub hysteresis_confirm: usize,
pub boundary_fraction: f64,
pub episode_correlation_window: u64,
pub episode_precision_window: u64,
pub min_healthy_windows: usize,
pub slew_delta: f64,
}
pub const PAPER_LOCK_CONFIG: EngineConfig = EngineConfig {
drift_window: 5,
dsa_window: 10,
persistence_threshold: 4,
consistency_gate: 2.0,
corroboration_count: 1,
hysteresis_confirm: 2,
boundary_fraction: 0.5,
episode_correlation_window: 5,
episode_precision_window: 5,
min_healthy_windows: 100,
slew_delta: 0.1,
};
impl EngineConfig {
pub fn validate(&self) -> Result<()> {
if self.drift_window == 0 {
return Err(DsfbError::InvalidConfig("drift_window must be > 0"));
}
if self.dsa_window == 0 {
return Err(DsfbError::InvalidConfig("dsa_window must be > 0"));
}
if self.persistence_threshold == 0 {
return Err(DsfbError::InvalidConfig("persistence_threshold must be > 0"));
}
if self.consistency_gate <= 0.0 {
return Err(DsfbError::InvalidConfig("consistency_gate must be > 0"));
}
if self.corroboration_count == 0 {
return Err(DsfbError::InvalidConfig("corroboration_count must be > 0"));
}
if self.hysteresis_confirm == 0 {
return Err(DsfbError::InvalidConfig("hysteresis_confirm must be > 0"));
}
if self.boundary_fraction <= 0.0 || self.boundary_fraction >= 1.0 {
return Err(DsfbError::InvalidConfig("boundary_fraction must be in (0, 1)"));
}
Ok(())
}
}
impl Default for EngineConfig {
fn default() -> Self {
PAPER_LOCK_CONFIG
}
}