#![forbid(unsafe_code)]
use crate::dsfb::features::Channel;
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct TrustSummary {
pub channel: Channel,
pub weight: f64,
pub residual_ema: f64,
pub observations: u64,
}
impl TrustSummary {
pub fn trusted(&self, threshold: f64) -> bool {
self.weight >= threshold
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SearchBreadth {
Narrow,
Balanced,
Broad,
}
impl SearchBreadth {
pub const fn for_regime(regime: crate::dsfb::drift::Regime) -> SearchBreadth {
match regime {
crate::dsfb::drift::Regime::Stable => SearchBreadth::Narrow,
crate::dsfb::drift::Regime::Drift => SearchBreadth::Balanced,
crate::dsfb::drift::Regime::Slew => SearchBreadth::Broad,
crate::dsfb::drift::Regime::Unknown => SearchBreadth::Balanced,
}
}
pub const fn candidate_budget(self) -> usize {
match self {
SearchBreadth::Narrow => 4,
SearchBreadth::Balanced => 12,
SearchBreadth::Broad => 32,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn breadth_budget_ordering() {
assert!(
SearchBreadth::Broad.candidate_budget() > SearchBreadth::Balanced.candidate_budget()
);
assert!(
SearchBreadth::Balanced.candidate_budget() > SearchBreadth::Narrow.candidate_budget()
);
}
}