use super::error::{AIOpsError, Result};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::RwLock;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ModelType {
AnomalyDetection,
TrendPrediction,
FailurePrediction,
PerformanceOptimization,
ResourceAllocation,
ArchitectureAdaptation,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelMetadata {
pub model_type: ModelType,
pub version: String,
pub accuracy: Option<f64>,
pub training_data_size: usize,
pub created_at: std::time::SystemTime,
pub updated_at: std::time::SystemTime,
}
#[derive(Debug, Clone)]
pub struct Model {
pub metadata: ModelMetadata,
pub data: Vec<u8>,
}
pub struct ModelManager {
models: Arc<RwLock<HashMap<String, Model>>>,
metadata: Arc<RwLock<HashMap<String, ModelMetadata>>>,
}
impl ModelManager {
pub fn new() -> Self {
Self {
models: Arc::new(RwLock::new(HashMap::new())),
metadata: Arc::new(RwLock::new(HashMap::new())),
}
}
pub async fn load_model(
&self,
model_id: &str,
model_type: ModelType,
model_data: Vec<u8>,
) -> Result<()> {
let now: _ = std::time::SystemTime::now();
let metadata: _ = ModelMetadata {
model_type,
version: "1.0.0".to_string(),
accuracy: None,
training_data_size: model_data.len(),
created_at: now,
updated_at: now,
};
let model: _ = Model {
metadata: metadata.clone(),
data: model_data,
};
let mut models = self.models.write().await;
let mut metadata_map = self.metadata.write().await;
models.insert(model_id.to_string(), model);
metadata_map.insert(model_id.to_string(), metadata);
Ok(())
}
pub async fn unload_model(&self, model_id: &str) -> Result<()> {
let mut models = self.models.write().await;
let mut metadata_map = self.metadata.write().await;
models.remove(model_id);
metadata_map.remove(model_id);
Ok(())
}
pub async fn get_metadata(&self, model_id: &str) -> Option<ModelMetadata> {
let metadata_map: _ = self.metadata.read().await;
metadata_map.get(model_id).cloned()
}
pub async fn list_models(&self) -> Vec<String> {
let models: _ = self.models.read().await;
models.keys().cloned().collect()
}
pub async fn model_exists(&self, model_id: &str) -> bool {
let models: _ = self.models.read().await;
models.contains_key(model_id)
}
pub async fn validate_model(&self, model_id: &str) -> Result<bool> {
let models: _ = self.models.read().await;
match models.get(model_id) {
Some(model) => {
Ok(!model.data.is_empty())
}
None => Err(AIOpsError::model(format!("Model {} not found", model_id))),
}
}
}
impl Default for ModelManager {
fn default() -> Self {
Self::new()
}
}