use std::path::PathBuf;
use serde::{Deserialize, Serialize};
use scirs2_stats::regression::RegressionResults;
use super::ml_predictor_features::NormalizationParams;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MLConfig {
pub model_type: MLModelType,
pub confidence_threshold: f64,
pub training_interval_hours: u64,
pub max_training_examples: usize,
pub min_examples_for_training: usize,
pub feature_normalization: bool,
pub auto_retraining: bool,
pub model_persistence_path: Option<PathBuf>,
}
impl Default for MLConfig {
fn default() -> Self {
Self {
model_type: MLModelType::Ridge,
confidence_threshold: 0.7,
training_interval_hours: 24,
max_training_examples: 10000,
min_examples_for_training: 100,
feature_normalization: true,
auto_retraining: true,
model_persistence_path: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MLModel {
pub(super) regression_results: Option<SerializableRegressionResults>,
pub(super) model_type: MLModelType,
pub(super) accuracy_metrics: AccuracyMetrics,
pub(super) normalization_params: Option<NormalizationParams>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SerializableRegressionResults {
pub coefficients: Vec<f64>,
pub r_squared: f64,
pub adj_r_squared: f64,
pub residual_std_error: f64,
pub std_errors: Vec<f64>,
}
impl From<&RegressionResults<f64>> for SerializableRegressionResults {
fn from(results: &RegressionResults<f64>) -> Self {
Self {
coefficients: results.coefficients.to_vec(),
r_squared: results.r_squared,
adj_r_squared: results.adj_r_squared,
residual_std_error: results.residual_std_error,
std_errors: results.std_errors.to_vec(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum MLModelType {
LinearRegression,
Ridge,
RandomForest,
NeuralNetwork,
GradientBoosting,
}
#[derive(Debug, Clone)]
pub struct MLPrediction {
pub predicted_cost: f64,
pub confidence: f64,
pub recommendation: OptimizationRecommendation,
pub feature_importance: Vec<(String, f64)>,
}
#[derive(Debug, Clone)]
pub enum OptimizationRecommendation {
UseIndex(String),
EnableParallelism(usize),
ApplyStreaming,
MaterializeSubquery,
ReorderJoins(Vec<usize>),
NoChange,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccuracyMetrics {
pub mean_absolute_error: f64,
pub root_mean_square_error: f64,
pub r_squared: f64,
pub confidence_interval: (f64, f64),
}