Skip to main content

agentic_memory/engine/
decay.rs

1//! Confidence decay and access tracking.
2
3use crate::types::{CognitiveEvent, EventType};
4
5/// Calculate the decay score for a node.
6///
7/// Formula: base_importance * recency_factor * access_factor
8///
9/// - base_importance: 1.0 for FACT/DECISION/CORRECTION, 0.8 for INFERENCE/SKILL, 0.6 for EPISODE
10/// - recency_factor: exp(-lambda * days_since_last_access) where lambda = 0.01
11/// - access_factor: min(1.0, log2(access_count + 1) / 10.0)
12///
13/// The result is clamped to [0.0, 1.0].
14pub fn calculate_decay(event: &CognitiveEvent, current_time: u64) -> f32 {
15    let base_importance = match event.event_type {
16        EventType::Fact | EventType::Decision | EventType::Correction => 1.0f32,
17        EventType::Inference | EventType::Skill => 0.8,
18        EventType::Episode => 0.6,
19    };
20
21    // days since last access
22    let micros_per_day: f64 = 86_400_000_000.0;
23    let elapsed_micros = current_time.saturating_sub(event.last_accessed) as f64;
24    let days = elapsed_micros / micros_per_day;
25
26    let lambda = 0.01f64;
27    let recency_factor = (-lambda * days).exp() as f32;
28
29    let access_factor = ((event.access_count as f32 + 1.0).log2() / 10.0).min(1.0);
30
31    (base_importance * recency_factor * access_factor).clamp(0.0, 1.0)
32}