use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct StreamingConfig {
pub buffer_config: BufferConfig,
pub drift_config: DriftConfig,
pub performance_config: PerformanceConfig,
pub resource_config: ResourceConfig,
pub meta_learning_config: MetaLearningConfig,
pub anomaly_config: AnomalyConfig,
pub learning_rate_config: LearningRateConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BufferConfig {
pub initial_size: usize,
pub max_size: usize,
pub min_size: usize,
pub size_strategy: BufferSizeStrategy,
pub quality_threshold: f64,
pub enable_adaptive_sizing: bool,
pub processing_timeout: Duration,
pub memory_limit_mb: usize,
}
impl Default for BufferConfig {
fn default() -> Self {
Self {
initial_size: 1000,
max_size: 10000,
min_size: 100,
size_strategy: BufferSizeStrategy::Adaptive,
quality_threshold: 0.8,
enable_adaptive_sizing: true,
processing_timeout: Duration::from_secs(30),
memory_limit_mb: 512,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum BufferSizeStrategy {
Fixed,
Linear { growth_rate: f64 },
Exponential { base: f64 },
Adaptive,
ResourceBased,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DriftConfig {
pub enable_detection: bool,
pub detection_method: DriftDetectionMethod,
pub sensitivity: f64,
pub min_samples: usize,
pub warning_threshold: f64,
pub drift_threshold: f64,
pub window_size: usize,
pub enable_false_positive_tracking: bool,
pub significance_level: f64,
pub adaptation_speed: f64,
}
impl Default for DriftConfig {
fn default() -> Self {
Self {
enable_detection: true,
detection_method: DriftDetectionMethod::Statistical(StatisticalMethod::ADWIN),
sensitivity: 0.05,
min_samples: 30,
warning_threshold: 0.8,
drift_threshold: 1.2,
window_size: 1000,
enable_false_positive_tracking: true,
significance_level: 0.05,
adaptation_speed: 0.1,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DriftDetectionMethod {
Statistical(StatisticalMethod),
Distribution(DistributionMethod),
ModelBased(ModelType),
Ensemble {
methods: Vec<DriftDetectionMethod>,
voting_strategy: VotingStrategy,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, Hash, Eq, PartialEq)]
pub enum StatisticalMethod {
ADWIN,
DDM,
EDDM,
PageHinkley,
CUSUM,
KolmogorovSmirnov,
MannWhitneyU,
}
#[derive(Debug, Clone, Serialize, Deserialize, Hash, Eq, PartialEq)]
pub enum DistributionMethod {
KLDivergence,
JSDivergence,
HellingerDistance,
WassersteinDistance,
EarthMoverDistance,
}
#[derive(Debug, Clone, Serialize, Deserialize, Hash, Eq, PartialEq)]
pub enum ModelType {
Linear,
NeuralNetwork,
DecisionTree,
Ensemble,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum VotingStrategy {
Majority,
Weighted { weights: Vec<f64> },
Unanimous,
Threshold { min_votes: usize },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PerformanceConfig {
pub enable_tracking: bool,
pub metrics: Vec<PerformanceMetricType>,
pub history_size: usize,
pub evaluation_frequency: usize,
pub enable_trend_analysis: bool,
pub trend_window_size: usize,
pub enable_prediction: bool,
pub prediction_horizon: usize,
pub baseline_update_frequency: usize,
}
impl Default for PerformanceConfig {
fn default() -> Self {
Self {
enable_tracking: true,
metrics: vec![
PerformanceMetricType::Loss,
PerformanceMetricType::Accuracy,
PerformanceMetricType::Convergence,
PerformanceMetricType::ResourceUsage,
],
history_size: 1000,
evaluation_frequency: 10,
enable_trend_analysis: true,
trend_window_size: 100,
enable_prediction: true,
prediction_horizon: 10,
baseline_update_frequency: 100,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum PerformanceMetricType {
Loss,
Accuracy,
Convergence,
ResourceUsage,
GradientNorm,
ParameterUpdates,
LearningRateEffectiveness,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceConfig {
pub max_memory_mb: usize,
pub max_cpu_percent: f64,
pub allocation_strategy: ResourceAllocationStrategy,
pub enable_dynamic_allocation: bool,
pub monitoring_frequency: Duration,
pub budget_constraints: ResourceBudgetConstraints,
pub enable_resource_prediction: bool,
pub cleanup_threshold: f64,
}
impl Default for ResourceConfig {
fn default() -> Self {
Self {
max_memory_mb: 2048,
max_cpu_percent: 80.0,
allocation_strategy: ResourceAllocationStrategy::Adaptive,
enable_dynamic_allocation: true,
monitoring_frequency: Duration::from_secs(10),
budget_constraints: ResourceBudgetConstraints::default(),
enable_resource_prediction: true,
cleanup_threshold: 0.9,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ResourceAllocationStrategy {
Static,
Dynamic,
Adaptive,
Proportional,
PriorityBased,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceBudgetConstraints {
pub memory_budget_mb: usize,
pub cpu_budget_percent: f64,
pub time_budget: Duration,
pub strict_enforcement: bool,
pub violation_penalty: f64,
}
impl Default for ResourceBudgetConstraints {
fn default() -> Self {
Self {
memory_budget_mb: 1024,
cpu_budget_percent: 60.0,
time_budget: Duration::from_secs(60),
strict_enforcement: false,
violation_penalty: 0.1,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetaLearningConfig {
pub enable_meta_learning: bool,
pub algorithm: MetaAlgorithm,
pub experience_buffer_size: usize,
pub update_frequency: usize,
pub meta_learning_rate: f64,
pub exploration_rate: f64,
pub model_complexity: MetaModelComplexity,
pub enable_transfer_learning: bool,
pub replay_config: ExperienceReplayConfig,
}
impl Default for MetaLearningConfig {
fn default() -> Self {
Self {
enable_meta_learning: true,
algorithm: MetaAlgorithm::ModelAgnosticMetaLearning,
experience_buffer_size: 10000,
update_frequency: 100,
meta_learning_rate: 0.001,
exploration_rate: 0.1,
model_complexity: MetaModelComplexity::Medium,
enable_transfer_learning: true,
replay_config: ExperienceReplayConfig::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MetaAlgorithm {
ModelAgnosticMetaLearning,
LearningToLearn,
MetaSGD,
Reptile,
OnlineMetaLearning,
ContinualMetaLearning,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MetaModelComplexity {
Low,
Medium,
High,
Adaptive,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExperienceReplayConfig {
pub enable_prioritized_replay: bool,
pub priority_method: PriorityMethod,
pub batch_size: usize,
pub replay_frequency: usize,
pub importance_sampling: bool,
}
impl Default for ExperienceReplayConfig {
fn default() -> Self {
Self {
enable_prioritized_replay: true,
priority_method: PriorityMethod::TDError,
batch_size: 32,
replay_frequency: 10,
importance_sampling: true,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum PriorityMethod {
TDError,
Surprise,
GradientMagnitude,
LossImprovement,
Random,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AnomalyConfig {
pub enable_detection: bool,
pub detection_method: AnomalyDetectionMethod,
pub threshold: f64,
pub window_size: usize,
pub enable_adaptive_threshold: bool,
pub false_positive_rate: f64,
pub contamination_rate: f64,
pub response_strategy: AnomalyResponseStrategy,
}
impl Default for AnomalyConfig {
fn default() -> Self {
Self {
enable_detection: true,
detection_method: AnomalyDetectionMethod::StatisticalOutlier,
threshold: 2.0,
window_size: 100,
enable_adaptive_threshold: true,
false_positive_rate: 0.05,
contamination_rate: 0.1,
response_strategy: AnomalyResponseStrategy::Adaptive,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AnomalyDetectionMethod {
StatisticalOutlier,
IsolationForest,
OneClassSVM,
LocalOutlierFactor,
Autoencoder,
Ensemble,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AnomalyResponseStrategy {
Ignore,
Filter,
Adaptive,
Reset,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LearningRateConfig {
pub initial_rate: f64,
pub min_rate: f64,
pub max_rate: f64,
pub adaptation_strategy: LearningRateAdaptationStrategy,
pub adaptation_frequency: usize,
pub performance_sensitivity: f64,
pub enable_cyclical_rates: bool,
pub cycle_config: CyclicalRateConfig,
}
impl Default for LearningRateConfig {
fn default() -> Self {
Self {
initial_rate: 0.001,
min_rate: 1e-6,
max_rate: 0.1,
adaptation_strategy: LearningRateAdaptationStrategy::PerformanceBased,
adaptation_frequency: 10,
performance_sensitivity: 0.1,
enable_cyclical_rates: false,
cycle_config: CyclicalRateConfig::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum LearningRateAdaptationStrategy {
Fixed,
StepDecay { decay_rate: f64, decay_steps: usize },
ExponentialDecay { decay_rate: f64 },
PerformanceBased,
GradientBased,
Adaptive,
CosineAnnealing { t_max: usize },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CyclicalRateConfig {
pub base_rate: f64,
pub max_rate: f64,
pub cycle_length: usize,
pub cycle_mode: CycleMode,
pub scale_function: ScaleFunction,
}
impl Default for CyclicalRateConfig {
fn default() -> Self {
Self {
base_rate: 0.0001,
max_rate: 0.001,
cycle_length: 1000,
cycle_mode: CycleMode::Triangular,
scale_function: ScaleFunction::Linear,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CycleMode {
Triangular,
Triangular2,
ExponentialRange,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ScaleFunction {
Linear,
Exponential { factor: f64 },
Polynomial { power: f64 },
Custom(String),
}
impl StreamingConfig {
pub fn validate(&self) -> Result<(), String> {
if self.buffer_config.max_size < self.buffer_config.min_size {
return Err("Buffer max_size must be >= min_size".to_string());
}
if self.buffer_config.initial_size < self.buffer_config.min_size
|| self.buffer_config.initial_size > self.buffer_config.max_size
{
return Err("Buffer initial_size must be between min_size and max_size".to_string());
}
if self.drift_config.sensitivity <= 0.0 || self.drift_config.sensitivity > 1.0 {
return Err("Drift sensitivity must be in (0, 1]".to_string());
}
if self.drift_config.warning_threshold >= self.drift_config.drift_threshold {
return Err("Drift warning_threshold must be < drift_threshold".to_string());
}
if self.learning_rate_config.min_rate >= self.learning_rate_config.max_rate {
return Err("Learning rate min_rate must be < max_rate".to_string());
}
if self.learning_rate_config.initial_rate < self.learning_rate_config.min_rate
|| self.learning_rate_config.initial_rate > self.learning_rate_config.max_rate
{
return Err(
"Learning rate initial_rate must be between min_rate and max_rate".to_string(),
);
}
if self.resource_config.max_cpu_percent <= 0.0
|| self.resource_config.max_cpu_percent > 100.0
{
return Err("Resource max_cpu_percent must be in (0, 100]".to_string());
}
if self.meta_learning_config.meta_learning_rate <= 0.0 {
return Err("Meta-learning rate must be > 0".to_string());
}
if self.meta_learning_config.exploration_rate < 0.0
|| self.meta_learning_config.exploration_rate > 1.0
{
return Err("Meta-learning exploration_rate must be in [0, 1]".to_string());
}
Ok(())
}
pub fn low_latency() -> Self {
let mut config = Self::default();
config.buffer_config.initial_size = 100;
config.buffer_config.max_size = 1000;
config.buffer_config.processing_timeout = Duration::from_millis(100);
config.performance_config.evaluation_frequency = 5;
config.drift_config.min_samples = 10;
config.resource_config.monitoring_frequency = Duration::from_secs(1);
config
}
pub fn high_throughput() -> Self {
let mut config = Self::default();
config.buffer_config.initial_size = 5000;
config.buffer_config.max_size = 50000;
config.buffer_config.memory_limit_mb = 2048;
config.performance_config.evaluation_frequency = 100;
config.drift_config.window_size = 5000;
config.resource_config.max_memory_mb = 4096;
config
}
pub fn memory_efficient() -> Self {
let mut config = Self::default();
config.buffer_config.initial_size = 200;
config.buffer_config.max_size = 2000;
config.buffer_config.memory_limit_mb = 128;
config.performance_config.history_size = 100;
config.meta_learning_config.experience_buffer_size = 1000;
config.resource_config.max_memory_mb = 256;
config.drift_config.window_size = 500;
config
}
}