do_memory_core/pattern/
heuristic.rs1use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use uuid::Uuid;
6
7use crate::types::Evidence;
8
9#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
11pub struct Heuristic {
12 pub heuristic_id: Uuid,
14 pub condition: String,
16 pub action: String,
18 pub confidence: f32,
20 pub evidence: Evidence,
22 pub created_at: DateTime<Utc>,
24 pub updated_at: DateTime<Utc>,
26}
27
28impl Heuristic {
29 #[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 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 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}