use std::time::{Duration, SystemTime};
use crate::path::{manager::algo::exponential_decay, types::Score};
const EXPONENTIAL_DECAY_HALFLIFE: Duration = Duration::from_secs(90);
#[derive(Debug, Clone)]
pub struct ReliabilityScore {
score: f32,
last_updated: SystemTime,
}
impl ReliabilityScore {
pub fn score(&self, now: SystemTime) -> Score {
Score::new_clamped(exponential_decay(
self.score,
now.duration_since(self.last_updated)
.unwrap_or_else(|_| Duration::from_secs(0)),
EXPONENTIAL_DECAY_HALFLIFE,
))
}
pub fn new_with_time(now: SystemTime) -> Self {
ReliabilityScore {
score: 0.0,
last_updated: now,
}
}
pub fn update(&mut self, penalty: Score, now: SystemTime) {
let current_score = self.score(now); let new_score = current_score.value() + penalty.value();
self.score = new_score.clamp(-1000.0, 1000.0); self.last_updated = now;
}
}