use crate::core::patterns::MemoryPattern;
use crate::windows::memory::MemoryStatus;
pub struct AttentionScorer {
weights: Vec<f32>,
temporal_weights: [f32; 24],
}
impl AttentionScorer {
pub fn new() -> Self {
Self {
weights: vec![
0.3, 0.2, 0.15, 0.15, 0.1, 0.05, 0.05, ],
temporal_weights: Self::default_temporal_weights(),
}
}
fn default_temporal_weights() -> [f32; 24] {
let mut weights = [0.5f32; 24];
for hour in 9..18 {
weights[hour] = 0.8;
}
for hour in 0..6 {
weights[hour] = 0.3;
}
weights
}
pub fn score(&self, pattern: &MemoryPattern, status: &MemoryStatus) -> f32 {
let features = pattern.to_vector();
let base_score: f32 = features.iter()
.zip(self.weights.iter())
.map(|(f, w)| f * w)
.sum();
let hour = pattern.hour as usize;
let temporal = self.temporal_weights.get(hour).copied().unwrap_or(0.5);
let urgency = if status.is_critical() {
1.5 } else if status.is_high_pressure() {
1.2 } else {
1.0
};
(base_score * temporal * urgency).clamp(0.0, 1.0)
}
pub fn update_weights(&mut self, feedback: f32, pattern: &MemoryPattern) {
let features = pattern.to_vector();
let learning_rate = 0.01;
for (i, (w, f)) in self.weights.iter_mut().zip(features.iter()).enumerate() {
*w += learning_rate * feedback * f;
*w = w.clamp(0.0, 1.0);
}
}
}
impl Default for AttentionScorer {
fn default() -> Self {
Self::new()
}
}