1use serde::{Deserialize, Serialize};
9use std::time::Duration;
10
11#[derive(Debug, Clone, Serialize, Deserialize, Default)]
13pub struct StreamingConfig {
14 pub buffer_config: BufferConfig,
16 pub drift_config: DriftConfig,
18 pub performance_config: PerformanceConfig,
20 pub resource_config: ResourceConfig,
22 pub meta_learning_config: MetaLearningConfig,
24 pub anomaly_config: AnomalyConfig,
26 pub learning_rate_config: LearningRateConfig,
28}
29
30#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct BufferConfig {
33 pub initial_size: usize,
35 pub max_size: usize,
37 pub min_size: usize,
39 pub size_strategy: BufferSizeStrategy,
41 pub quality_threshold: f64,
43 pub enable_adaptive_sizing: bool,
45 pub processing_timeout: Duration,
47 pub memory_limit_mb: usize,
49}
50
51impl Default for BufferConfig {
52 fn default() -> Self {
53 Self {
54 initial_size: 1000,
55 max_size: 10000,
56 min_size: 100,
57 size_strategy: BufferSizeStrategy::Adaptive,
58 quality_threshold: 0.8,
59 enable_adaptive_sizing: true,
60 processing_timeout: Duration::from_secs(30),
61 memory_limit_mb: 512,
62 }
63 }
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
68pub enum BufferSizeStrategy {
69 Fixed,
71 Linear { growth_rate: f64 },
73 Exponential { base: f64 },
75 Adaptive,
77 ResourceBased,
79}
80
81#[derive(Debug, Clone, Serialize, Deserialize)]
83pub struct DriftConfig {
84 pub enable_detection: bool,
86 pub detection_method: DriftDetectionMethod,
88 pub sensitivity: f64,
90 pub min_samples: usize,
92 pub warning_threshold: f64,
94 pub drift_threshold: f64,
96 pub window_size: usize,
98 pub enable_false_positive_tracking: bool,
100 pub significance_level: f64,
102 pub adaptation_speed: f64,
104}
105
106impl Default for DriftConfig {
107 fn default() -> Self {
108 Self {
109 enable_detection: true,
110 detection_method: DriftDetectionMethod::Statistical(StatisticalMethod::ADWIN),
111 sensitivity: 0.05,
112 min_samples: 30,
113 warning_threshold: 0.8,
114 drift_threshold: 1.2,
115 window_size: 1000,
116 enable_false_positive_tracking: true,
117 significance_level: 0.05,
118 adaptation_speed: 0.1,
119 }
120 }
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize)]
125pub enum DriftDetectionMethod {
126 Statistical(StatisticalMethod),
128 Distribution(DistributionMethod),
130 ModelBased(ModelType),
132 Ensemble {
134 methods: Vec<DriftDetectionMethod>,
135 voting_strategy: VotingStrategy,
136 },
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize, Hash, Eq, PartialEq)]
141pub enum StatisticalMethod {
142 ADWIN,
144 DDM,
146 EDDM,
148 PageHinkley,
150 CUSUM,
152 KolmogorovSmirnov,
154 MannWhitneyU,
156}
157
158#[derive(Debug, Clone, Serialize, Deserialize, Hash, Eq, PartialEq)]
160pub enum DistributionMethod {
161 KLDivergence,
163 JSDivergence,
165 HellingerDistance,
167 WassersteinDistance,
169 EarthMoverDistance,
171}
172
173#[derive(Debug, Clone, Serialize, Deserialize, Hash, Eq, PartialEq)]
175pub enum ModelType {
176 Linear,
178 NeuralNetwork,
180 DecisionTree,
182 Ensemble,
184}
185
186#[derive(Debug, Clone, Serialize, Deserialize)]
188pub enum VotingStrategy {
189 Majority,
191 Weighted { weights: Vec<f64> },
193 Unanimous,
195 Threshold { min_votes: usize },
197}
198
199#[derive(Debug, Clone, Serialize, Deserialize)]
201pub struct PerformanceConfig {
202 pub enable_tracking: bool,
204 pub metrics: Vec<PerformanceMetricType>,
206 pub history_size: usize,
208 pub evaluation_frequency: usize,
210 pub enable_trend_analysis: bool,
212 pub trend_window_size: usize,
214 pub enable_prediction: bool,
216 pub prediction_horizon: usize,
218 pub baseline_update_frequency: usize,
220}
221
222impl Default for PerformanceConfig {
223 fn default() -> Self {
224 Self {
225 enable_tracking: true,
226 metrics: vec![
227 PerformanceMetricType::Loss,
228 PerformanceMetricType::Accuracy,
229 PerformanceMetricType::Convergence,
230 PerformanceMetricType::ResourceUsage,
231 ],
232 history_size: 1000,
233 evaluation_frequency: 10,
234 enable_trend_analysis: true,
235 trend_window_size: 100,
236 enable_prediction: true,
237 prediction_horizon: 10,
238 baseline_update_frequency: 100,
239 }
240 }
241}
242
243#[derive(Debug, Clone, Serialize, Deserialize)]
245pub enum PerformanceMetricType {
246 Loss,
248 Accuracy,
250 Convergence,
252 ResourceUsage,
254 GradientNorm,
256 ParameterUpdates,
258 LearningRateEffectiveness,
260 Custom(String),
262}
263
264#[derive(Debug, Clone, Serialize, Deserialize)]
266pub struct ResourceConfig {
267 pub max_memory_mb: usize,
269 pub max_cpu_percent: f64,
271 pub allocation_strategy: ResourceAllocationStrategy,
273 pub enable_dynamic_allocation: bool,
275 pub monitoring_frequency: Duration,
277 pub budget_constraints: ResourceBudgetConstraints,
279 pub enable_resource_prediction: bool,
281 pub cleanup_threshold: f64,
283}
284
285impl Default for ResourceConfig {
286 fn default() -> Self {
287 Self {
288 max_memory_mb: 2048,
289 max_cpu_percent: 80.0,
290 allocation_strategy: ResourceAllocationStrategy::Adaptive,
291 enable_dynamic_allocation: true,
292 monitoring_frequency: Duration::from_secs(10),
293 budget_constraints: ResourceBudgetConstraints::default(),
294 enable_resource_prediction: true,
295 cleanup_threshold: 0.9,
296 }
297 }
298}
299
300#[derive(Debug, Clone, Serialize, Deserialize)]
302pub enum ResourceAllocationStrategy {
303 Static,
305 Dynamic,
307 Adaptive,
309 Proportional,
311 PriorityBased,
313}
314
315#[derive(Debug, Clone, Serialize, Deserialize)]
317pub struct ResourceBudgetConstraints {
318 pub memory_budget_mb: usize,
320 pub cpu_budget_percent: f64,
322 pub time_budget: Duration,
324 pub strict_enforcement: bool,
326 pub violation_penalty: f64,
328}
329
330impl Default for ResourceBudgetConstraints {
331 fn default() -> Self {
332 Self {
333 memory_budget_mb: 1024,
334 cpu_budget_percent: 60.0,
335 time_budget: Duration::from_secs(60),
336 strict_enforcement: false,
337 violation_penalty: 0.1,
338 }
339 }
340}
341
342#[derive(Debug, Clone, Serialize, Deserialize)]
344pub struct MetaLearningConfig {
345 pub enable_meta_learning: bool,
347 pub algorithm: MetaAlgorithm,
349 pub experience_buffer_size: usize,
351 pub update_frequency: usize,
353 pub meta_learning_rate: f64,
355 pub exploration_rate: f64,
357 pub model_complexity: MetaModelComplexity,
359 pub enable_transfer_learning: bool,
361 pub replay_config: ExperienceReplayConfig,
363}
364
365impl Default for MetaLearningConfig {
366 fn default() -> Self {
367 Self {
368 enable_meta_learning: true,
369 algorithm: MetaAlgorithm::ModelAgnosticMetaLearning,
370 experience_buffer_size: 10000,
371 update_frequency: 100,
372 meta_learning_rate: 0.001,
373 exploration_rate: 0.1,
374 model_complexity: MetaModelComplexity::Medium,
375 enable_transfer_learning: true,
376 replay_config: ExperienceReplayConfig::default(),
377 }
378 }
379}
380
381#[derive(Debug, Clone, Serialize, Deserialize)]
383pub enum MetaAlgorithm {
384 ModelAgnosticMetaLearning,
386 LearningToLearn,
388 MetaSGD,
390 Reptile,
392 OnlineMetaLearning,
394 ContinualMetaLearning,
396}
397
398#[derive(Debug, Clone, Serialize, Deserialize)]
400pub enum MetaModelComplexity {
401 Low,
403 Medium,
405 High,
407 Adaptive,
409}
410
411#[derive(Debug, Clone, Serialize, Deserialize)]
413pub struct ExperienceReplayConfig {
414 pub enable_prioritized_replay: bool,
416 pub priority_method: PriorityMethod,
418 pub batch_size: usize,
420 pub replay_frequency: usize,
422 pub importance_sampling: bool,
424}
425
426impl Default for ExperienceReplayConfig {
427 fn default() -> Self {
428 Self {
429 enable_prioritized_replay: true,
430 priority_method: PriorityMethod::TDError,
431 batch_size: 32,
432 replay_frequency: 10,
433 importance_sampling: true,
434 }
435 }
436}
437
438#[derive(Debug, Clone, Serialize, Deserialize)]
440pub enum PriorityMethod {
441 TDError,
443 Surprise,
445 GradientMagnitude,
447 LossImprovement,
449 Random,
451}
452
453#[derive(Debug, Clone, Serialize, Deserialize)]
455pub struct AnomalyConfig {
456 pub enable_detection: bool,
458 pub detection_method: AnomalyDetectionMethod,
460 pub threshold: f64,
462 pub window_size: usize,
464 pub enable_adaptive_threshold: bool,
466 pub false_positive_rate: f64,
468 pub contamination_rate: f64,
470 pub response_strategy: AnomalyResponseStrategy,
472}
473
474impl Default for AnomalyConfig {
475 fn default() -> Self {
476 Self {
477 enable_detection: true,
478 detection_method: AnomalyDetectionMethod::StatisticalOutlier,
479 threshold: 2.0,
480 window_size: 100,
481 enable_adaptive_threshold: true,
482 false_positive_rate: 0.05,
483 contamination_rate: 0.1,
484 response_strategy: AnomalyResponseStrategy::Adaptive,
485 }
486 }
487}
488
489#[derive(Debug, Clone, Serialize, Deserialize)]
491pub enum AnomalyDetectionMethod {
492 StatisticalOutlier,
494 IsolationForest,
496 OneClassSVM,
498 LocalOutlierFactor,
500 Autoencoder,
502 Ensemble,
504}
505
506#[derive(Debug, Clone, Serialize, Deserialize)]
508pub enum AnomalyResponseStrategy {
509 Ignore,
511 Filter,
513 Adaptive,
515 Reset,
517 Custom(String),
519}
520
521#[derive(Debug, Clone, Serialize, Deserialize)]
523pub struct LearningRateConfig {
524 pub initial_rate: f64,
526 pub min_rate: f64,
528 pub max_rate: f64,
530 pub adaptation_strategy: LearningRateAdaptationStrategy,
532 pub adaptation_frequency: usize,
534 pub performance_sensitivity: f64,
536 pub enable_cyclical_rates: bool,
538 pub cycle_config: CyclicalRateConfig,
540}
541
542impl Default for LearningRateConfig {
543 fn default() -> Self {
544 Self {
545 initial_rate: 0.001,
546 min_rate: 1e-6,
547 max_rate: 0.1,
548 adaptation_strategy: LearningRateAdaptationStrategy::PerformanceBased,
549 adaptation_frequency: 10,
550 performance_sensitivity: 0.1,
551 enable_cyclical_rates: false,
552 cycle_config: CyclicalRateConfig::default(),
553 }
554 }
555}
556
557#[derive(Debug, Clone, Serialize, Deserialize)]
559pub enum LearningRateAdaptationStrategy {
560 Fixed,
562 StepDecay { decay_rate: f64, decay_steps: usize },
564 ExponentialDecay { decay_rate: f64 },
566 PerformanceBased,
568 GradientBased,
570 Adaptive,
572 CosineAnnealing { t_max: usize },
574}
575
576#[derive(Debug, Clone, Serialize, Deserialize)]
578pub struct CyclicalRateConfig {
579 pub base_rate: f64,
581 pub max_rate: f64,
583 pub cycle_length: usize,
585 pub cycle_mode: CycleMode,
587 pub scale_function: ScaleFunction,
589}
590
591impl Default for CyclicalRateConfig {
592 fn default() -> Self {
593 Self {
594 base_rate: 0.0001,
595 max_rate: 0.001,
596 cycle_length: 1000,
597 cycle_mode: CycleMode::Triangular,
598 scale_function: ScaleFunction::Linear,
599 }
600 }
601}
602
603#[derive(Debug, Clone, Serialize, Deserialize)]
605pub enum CycleMode {
606 Triangular,
608 Triangular2,
610 ExponentialRange,
612 Custom(String),
614}
615
616#[derive(Debug, Clone, Serialize, Deserialize)]
618pub enum ScaleFunction {
619 Linear,
621 Exponential { factor: f64 },
623 Polynomial { power: f64 },
625 Custom(String),
627}
628
629impl StreamingConfig {
631 pub fn validate(&self) -> Result<(), String> {
633 if self.buffer_config.max_size < self.buffer_config.min_size {
635 return Err("Buffer max_size must be >= min_size".to_string());
636 }
637
638 if self.buffer_config.initial_size < self.buffer_config.min_size
639 || self.buffer_config.initial_size > self.buffer_config.max_size
640 {
641 return Err("Buffer initial_size must be between min_size and max_size".to_string());
642 }
643
644 if self.drift_config.sensitivity <= 0.0 || self.drift_config.sensitivity > 1.0 {
646 return Err("Drift sensitivity must be in (0, 1]".to_string());
647 }
648
649 if self.drift_config.warning_threshold >= self.drift_config.drift_threshold {
650 return Err("Drift warning_threshold must be < drift_threshold".to_string());
651 }
652
653 if self.learning_rate_config.min_rate >= self.learning_rate_config.max_rate {
655 return Err("Learning rate min_rate must be < max_rate".to_string());
656 }
657
658 if self.learning_rate_config.initial_rate < self.learning_rate_config.min_rate
659 || self.learning_rate_config.initial_rate > self.learning_rate_config.max_rate
660 {
661 return Err(
662 "Learning rate initial_rate must be between min_rate and max_rate".to_string(),
663 );
664 }
665
666 if self.resource_config.max_cpu_percent <= 0.0
668 || self.resource_config.max_cpu_percent > 100.0
669 {
670 return Err("Resource max_cpu_percent must be in (0, 100]".to_string());
671 }
672
673 if self.meta_learning_config.meta_learning_rate <= 0.0 {
675 return Err("Meta-learning rate must be > 0".to_string());
676 }
677
678 if self.meta_learning_config.exploration_rate < 0.0
679 || self.meta_learning_config.exploration_rate > 1.0
680 {
681 return Err("Meta-learning exploration_rate must be in [0, 1]".to_string());
682 }
683
684 Ok(())
685 }
686
687 pub fn low_latency() -> Self {
689 let mut config = Self::default();
690 config.buffer_config.initial_size = 100;
691 config.buffer_config.max_size = 1000;
692 config.buffer_config.processing_timeout = Duration::from_millis(100);
693 config.performance_config.evaluation_frequency = 5;
694 config.drift_config.min_samples = 10;
695 config.resource_config.monitoring_frequency = Duration::from_secs(1);
696 config
697 }
698
699 pub fn high_throughput() -> Self {
701 let mut config = Self::default();
702 config.buffer_config.initial_size = 5000;
703 config.buffer_config.max_size = 50000;
704 config.buffer_config.memory_limit_mb = 2048;
705 config.performance_config.evaluation_frequency = 100;
706 config.drift_config.window_size = 5000;
707 config.resource_config.max_memory_mb = 4096;
708 config
709 }
710
711 pub fn memory_efficient() -> Self {
713 let mut config = Self::default();
714 config.buffer_config.initial_size = 200;
715 config.buffer_config.max_size = 2000;
716 config.buffer_config.memory_limit_mb = 128;
717 config.performance_config.history_size = 100;
718 config.meta_learning_config.experience_buffer_size = 1000;
719 config.resource_config.max_memory_mb = 256;
720 config.drift_config.window_size = 500;
721 config
722 }
723}