use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::types::Evidence;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Heuristic {
pub heuristic_id: Uuid,
pub condition: String,
pub action: String,
pub confidence: f32,
pub evidence: Evidence,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
impl Heuristic {
#[must_use]
pub fn new(condition: String, action: String, confidence: f32) -> Self {
let now = Utc::now();
Self {
heuristic_id: Uuid::new_v4(),
condition,
action,
confidence,
evidence: Evidence {
episode_ids: Vec::new(),
success_rate: 0.0,
sample_size: 0,
},
created_at: now,
updated_at: now,
}
}
pub fn update_evidence(&mut self, episode_id: Uuid, success: bool) {
self.evidence.episode_ids.push(episode_id);
self.evidence.sample_size += 1;
let successes = if success {
(self.evidence.success_rate * (self.evidence.sample_size - 1) as f32) + 1.0
} else {
self.evidence.success_rate * (self.evidence.sample_size - 1) as f32
};
self.evidence.success_rate = successes / self.evidence.sample_size as f32;
self.updated_at = Utc::now();
}
}