Skip to main content

do_memory_core/pattern/
heuristic.rs

1//! Heuristic rules learned from patterns
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use uuid::Uuid;
6
7use crate::types::Evidence;
8
9/// Heuristic rule learned from patterns
10#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
11pub struct Heuristic {
12    /// Unique heuristic ID
13    pub heuristic_id: Uuid,
14    /// Condition to check (as natural language or code)
15    pub condition: String,
16    /// Recommended action
17    pub action: String,
18    /// Confidence level (0.0 to 1.0)
19    pub confidence: f32,
20    /// Evidence supporting this heuristic
21    pub evidence: Evidence,
22    /// When created
23    pub created_at: DateTime<Utc>,
24    /// Last updated
25    pub updated_at: DateTime<Utc>,
26}
27
28impl Heuristic {
29    /// Create a new heuristic
30    #[must_use]
31    pub fn new(condition: String, action: String, confidence: f32) -> Self {
32        let now = Utc::now();
33        Self {
34            heuristic_id: Uuid::new_v4(),
35            condition,
36            action,
37            confidence,
38            evidence: Evidence {
39                episode_ids: Vec::new(),
40                success_rate: 0.0,
41                sample_size: 0,
42            },
43            created_at: now,
44            updated_at: now,
45        }
46    }
47
48    /// Update the heuristic with new evidence
49    pub fn update_evidence(&mut self, episode_id: Uuid, success: bool) {
50        self.evidence.episode_ids.push(episode_id);
51        self.evidence.sample_size += 1;
52
53        // Recalculate success rate
54        let successes = if success {
55            (self.evidence.success_rate * (self.evidence.sample_size - 1) as f32) + 1.0
56        } else {
57            self.evidence.success_rate * (self.evidence.sample_size - 1) as f32
58        };
59
60        self.evidence.success_rate = successes / self.evidence.sample_size as f32;
61        self.updated_at = Utc::now();
62    }
63}