use chrono::{Datelike, Timelike};
use crate::windows::memory::MemoryStatus;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryPattern {
pub load: f32,
pub consumption_rate: f32,
pub available_ratio: f32,
pub page_file_ratio: f32,
pub process_count: u32,
pub hour: u8,
pub day_of_week: u8,
pub time_since_last_opt: f32,
}
impl MemoryPattern {
pub fn from_status(status: &MemoryStatus) -> Self {
let now = chrono::Local::now();
Self {
load: status.memory_load_percent as f32 / 100.0,
consumption_rate: 0.0, available_ratio: (status.available_physical_mb / status.total_physical_mb) as f32,
page_file_ratio: 1.0 - (status.available_page_file_mb / status.total_page_file_mb) as f32,
process_count: 0, hour: now.hour() as u8,
day_of_week: now.weekday().num_days_from_monday() as u8,
time_since_last_opt: 0.0,
}
}
pub fn to_vector(&self) -> Vec<f32> {
vec![
self.load,
self.consumption_rate,
self.available_ratio,
self.page_file_ratio,
self.process_count as f32 / 1000.0, self.hour as f32 / 24.0,
self.day_of_week as f32 / 7.0,
self.time_since_last_opt / 3600.0, ]
}
pub const DIM: usize = 8;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LabeledPattern {
pub pattern: MemoryPattern,
pub optimized: bool,
pub aggressive: bool,
pub freed_mb: f32,
pub success: bool,
}