quantrs2_ml/time_series/
config.rs

1//! Configuration structures for quantum time series forecasting
2
3use ndarray::Array2;
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7/// Quantum time series forecasting configuration
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct QuantumTimeSeriesConfig {
10    /// Number of qubits for quantum processing
11    pub num_qubits: usize,
12
13    /// Forecasting model type
14    pub model_type: TimeSeriesModel,
15
16    /// Input window size
17    pub window_size: usize,
18
19    /// Forecast horizon
20    pub forecast_horizon: usize,
21
22    /// Feature engineering configuration
23    pub feature_config: FeatureEngineeringConfig,
24
25    /// Quantum enhancement level
26    pub quantum_enhancement: QuantumEnhancementLevel,
27
28    /// Seasonality configuration
29    pub seasonality_config: SeasonalityConfig,
30
31    /// Ensemble configuration
32    pub ensemble_config: Option<EnsembleConfig>,
33}
34
35/// Time series forecasting models
36#[derive(Debug, Clone, Serialize, Deserialize)]
37pub enum TimeSeriesModel {
38    /// Quantum ARIMA model
39    QuantumARIMA {
40        p: usize,                                       // autoregressive order
41        d: usize,                                       // differencing order
42        q: usize,                                       // moving average order
43        seasonal: Option<(usize, usize, usize, usize)>, // (P, D, Q, period)
44    },
45
46    /// Quantum LSTM for time series
47    QuantumLSTM {
48        hidden_size: usize,
49        num_layers: usize,
50        dropout: f64,
51    },
52
53    /// Quantum Transformer for time series
54    QuantumTransformerTS {
55        model_dim: usize,
56        num_heads: usize,
57        num_layers: usize,
58    },
59
60    /// Quantum State Space Model
61    QuantumStateSpace {
62        state_dim: usize,
63        emission_dim: usize,
64        transition_type: TransitionType,
65    },
66
67    /// Quantum Prophet (inspired by Facebook Prophet)
68    QuantumProphet {
69        growth_type: GrowthType,
70        changepoint_prior_scale: f64,
71        seasonality_prior_scale: f64,
72    },
73
74    /// Quantum Neural Prophet
75    QuantumNeuralProphet {
76        hidden_layers: Vec<usize>,
77        ar_order: usize,
78        ma_order: usize,
79    },
80
81    /// Quantum Temporal Fusion Transformer
82    QuantumTFT {
83        state_size: usize,
84        attention_heads: usize,
85        num_layers: usize,
86    },
87}
88
89/// Feature engineering configuration
90#[derive(Debug, Clone, Serialize, Deserialize)]
91pub struct FeatureEngineeringConfig {
92    /// Use quantum Fourier features
93    pub quantum_fourier_features: bool,
94
95    /// Lag features
96    pub lag_features: Vec<usize>,
97
98    /// Rolling statistics window sizes
99    pub rolling_windows: Vec<usize>,
100
101    /// Wavelet decomposition
102    pub wavelet_decomposition: bool,
103
104    /// Quantum feature extraction
105    pub quantum_features: bool,
106
107    /// Interaction features
108    pub interaction_features: bool,
109}
110
111/// Seasonality configuration
112#[derive(Debug, Clone, Serialize, Deserialize)]
113pub struct SeasonalityConfig {
114    /// Daily seasonality
115    pub daily: Option<usize>,
116
117    /// Weekly seasonality
118    pub weekly: Option<usize>,
119
120    /// Monthly seasonality
121    pub monthly: Option<usize>,
122
123    /// Yearly seasonality
124    pub yearly: Option<usize>,
125
126    /// Custom seasonality periods
127    pub custom_periods: Vec<usize>,
128
129    /// Quantum seasonal decomposition
130    pub quantum_decomposition: bool,
131}
132
133/// Quantum enhancement levels
134#[derive(Debug, Clone, Serialize, Deserialize)]
135pub enum QuantumEnhancementLevel {
136    /// Minimal quantum processing
137    Low,
138
139    /// Balanced quantum-classical
140    Medium,
141
142    /// Maximum quantum advantage
143    High,
144
145    /// Custom quantum configuration
146    Custom {
147        quantum_layers: Vec<usize>,
148        entanglement_strength: f64,
149        measurement_strategy: MeasurementStrategy,
150    },
151}
152
153/// Measurement strategies
154#[derive(Debug, Clone, Serialize, Deserialize)]
155pub enum MeasurementStrategy {
156    /// Standard computational basis
157    Computational,
158
159    /// Hadamard basis
160    Hadamard,
161
162    /// Custom basis rotation
163    Custom(Array2<f64>),
164
165    /// Adaptive measurement
166    Adaptive,
167}
168
169/// State transition types
170#[derive(Debug, Clone, Serialize, Deserialize)]
171pub enum TransitionType {
172    /// Linear transition
173    Linear,
174
175    /// Nonlinear quantum transition
176    NonlinearQuantum,
177
178    /// Recurrent transition
179    Recurrent,
180
181    /// Attention-based transition
182    Attention,
183}
184
185/// Growth types for trend modeling
186#[derive(Debug, Clone, Serialize, Deserialize)]
187pub enum GrowthType {
188    /// Linear growth
189    Linear,
190
191    /// Logistic growth with capacity
192    Logistic(f64),
193
194    /// Flat (no growth)
195    Flat,
196
197    /// Quantum superposition of growth modes
198    QuantumSuperposition,
199}
200
201/// Ensemble configuration
202#[derive(Debug, Clone, Serialize, Deserialize)]
203pub struct EnsembleConfig {
204    /// Ensemble method
205    pub method: EnsembleMethod,
206
207    /// Number of models in ensemble
208    pub num_models: usize,
209
210    /// Model diversity strategy
211    pub diversity_strategy: DiversityStrategy,
212
213    /// Quantum voting mechanism
214    pub quantum_voting: bool,
215}
216
217/// Ensemble methods
218#[derive(Debug, Clone, Serialize, Deserialize)]
219pub enum EnsembleMethod {
220    /// Simple averaging
221    Average,
222
223    /// Weighted average
224    Weighted(Vec<f64>),
225
226    /// Quantum superposition ensemble
227    QuantumSuperposition,
228
229    /// Stacking with meta-learner
230    Stacking,
231
232    /// Bayesian model averaging
233    BayesianAverage,
234}
235
236/// Diversity strategies for ensemble
237#[derive(Debug, Clone, Serialize, Deserialize)]
238pub enum DiversityStrategy {
239    /// Random initialization
240    RandomInit,
241
242    /// Bootstrap sampling
243    Bootstrap,
244
245    /// Feature bagging
246    FeatureBagging,
247
248    /// Quantum diversity
249    QuantumDiversity,
250}
251
252/// Wavelet types
253#[derive(Debug, Clone, Serialize, Deserialize)]
254pub enum WaveletType {
255    Haar,
256    Daubechies(usize),
257    Morlet,
258    Mexican,
259    Quantum,
260}
261
262/// Anomaly types
263#[derive(Debug, Clone, Serialize, Deserialize)]
264pub enum AnomalyType {
265    /// Point anomaly
266    Point,
267
268    /// Contextual anomaly
269    Contextual,
270
271    /// Collective anomaly
272    Collective,
273
274    /// Quantum uncertainty anomaly
275    QuantumUncertainty,
276
277    /// Changepoint
278    Changepoint,
279}
280
281// Configuration implementations
282impl Default for QuantumTimeSeriesConfig {
283    fn default() -> Self {
284        Self {
285            num_qubits: 10,
286            model_type: TimeSeriesModel::QuantumLSTM {
287                hidden_size: 64,
288                num_layers: 2,
289                dropout: 0.1,
290            },
291            window_size: 30,
292            forecast_horizon: 7,
293            feature_config: FeatureEngineeringConfig::default(),
294            quantum_enhancement: QuantumEnhancementLevel::Medium,
295            seasonality_config: SeasonalityConfig::default(),
296            ensemble_config: None,
297        }
298    }
299}
300
301impl QuantumTimeSeriesConfig {
302    /// Configuration for financial time series
303    pub fn financial(forecast_horizon: usize) -> Self {
304        Self {
305            num_qubits: 12,
306            model_type: TimeSeriesModel::QuantumTFT {
307                state_size: 128,
308                attention_heads: 8,
309                num_layers: 4,
310            },
311            window_size: 60,
312            forecast_horizon,
313            feature_config: FeatureEngineeringConfig::financial(),
314            quantum_enhancement: QuantumEnhancementLevel::High,
315            seasonality_config: SeasonalityConfig::financial(),
316            ensemble_config: Some(EnsembleConfig::default()),
317        }
318    }
319
320    /// Configuration for IoT/sensor data
321    pub fn iot_sensor(sampling_rate: usize) -> Self {
322        Self {
323            num_qubits: 14,
324            model_type: TimeSeriesModel::QuantumStateSpace {
325                state_dim: 32,
326                emission_dim: 16,
327                transition_type: TransitionType::NonlinearQuantum,
328            },
329            window_size: sampling_rate * 60,      // 1 hour window
330            forecast_horizon: sampling_rate * 10, // 10 minute forecast
331            feature_config: FeatureEngineeringConfig::iot(),
332            quantum_enhancement: QuantumEnhancementLevel::High,
333            seasonality_config: SeasonalityConfig::hourly(),
334            ensemble_config: None,
335        }
336    }
337
338    /// Configuration for demand forecasting
339    pub fn demand_forecasting() -> Self {
340        Self {
341            num_qubits: 12,
342            model_type: TimeSeriesModel::QuantumProphet {
343                growth_type: GrowthType::Linear,
344                changepoint_prior_scale: 0.05,
345                seasonality_prior_scale: 10.0,
346            },
347            window_size: 365,     // 1 year of daily data
348            forecast_horizon: 30, // 1 month forecast
349            feature_config: FeatureEngineeringConfig::retail(),
350            quantum_enhancement: QuantumEnhancementLevel::Medium,
351            seasonality_config: SeasonalityConfig::retail(),
352            ensemble_config: Some(EnsembleConfig::stacking()),
353        }
354    }
355}
356
357impl Default for FeatureEngineeringConfig {
358    fn default() -> Self {
359        Self {
360            quantum_fourier_features: true,
361            lag_features: vec![1, 7, 14, 30],
362            rolling_windows: vec![7, 14, 30],
363            wavelet_decomposition: false,
364            quantum_features: true,
365            interaction_features: false,
366        }
367    }
368}
369
370impl FeatureEngineeringConfig {
371    /// Financial data configuration
372    pub fn financial() -> Self {
373        Self {
374            quantum_fourier_features: true,
375            lag_features: vec![1, 5, 10, 20, 60], // Various trading periods
376            rolling_windows: vec![5, 10, 20, 60], // Moving averages
377            wavelet_decomposition: true,
378            quantum_features: true,
379            interaction_features: true,
380        }
381    }
382
383    /// IoT sensor configuration
384    pub fn iot() -> Self {
385        Self {
386            quantum_fourier_features: true,
387            lag_features: vec![1, 6, 12, 24], // Hourly patterns
388            rolling_windows: vec![6, 12, 24, 48],
389            wavelet_decomposition: true,
390            quantum_features: true,
391            interaction_features: false,
392        }
393    }
394
395    /// Retail/demand configuration
396    pub fn retail() -> Self {
397        Self {
398            quantum_fourier_features: false,
399            lag_features: vec![1, 7, 14, 28, 365], // Daily, weekly, monthly, yearly
400            rolling_windows: vec![7, 14, 28],
401            wavelet_decomposition: false,
402            quantum_features: true,
403            interaction_features: true,
404        }
405    }
406}
407
408impl Default for SeasonalityConfig {
409    fn default() -> Self {
410        Self {
411            daily: None,
412            weekly: Some(7),
413            monthly: None,
414            yearly: None,
415            custom_periods: Vec::new(),
416            quantum_decomposition: true,
417        }
418    }
419}
420
421impl SeasonalityConfig {
422    /// Financial seasonality
423    pub fn financial() -> Self {
424        Self {
425            daily: Some(1),
426            weekly: Some(5),          // Trading days
427            monthly: Some(21),        // Trading month
428            yearly: Some(252),        // Trading year
429            custom_periods: vec![63], // Quarterly
430            quantum_decomposition: true,
431        }
432    }
433
434    /// Hourly seasonality for IoT
435    pub fn hourly() -> Self {
436        Self {
437            daily: Some(24),
438            weekly: Some(168), // 24 * 7
439            monthly: None,
440            yearly: None,
441            custom_periods: Vec::new(),
442            quantum_decomposition: true,
443        }
444    }
445
446    /// Retail seasonality
447    pub fn retail() -> Self {
448        Self {
449            daily: None,
450            weekly: Some(7),
451            monthly: Some(30),
452            yearly: Some(365),
453            custom_periods: vec![90, 180], // Quarterly, semi-annual
454            quantum_decomposition: true,
455        }
456    }
457
458    /// Check if any seasonality is configured
459    pub fn has_seasonality(&self) -> bool {
460        self.daily.is_some()
461            || self.weekly.is_some()
462            || self.monthly.is_some()
463            || self.yearly.is_some()
464            || !self.custom_periods.is_empty()
465    }
466}
467
468impl Default for EnsembleConfig {
469    fn default() -> Self {
470        Self {
471            method: EnsembleMethod::Average,
472            num_models: 3,
473            diversity_strategy: DiversityStrategy::RandomInit,
474            quantum_voting: true,
475        }
476    }
477}
478
479impl EnsembleConfig {
480    /// Stacking ensemble
481    pub fn stacking() -> Self {
482        Self {
483            method: EnsembleMethod::Stacking,
484            num_models: 5,
485            diversity_strategy: DiversityStrategy::FeatureBagging,
486            quantum_voting: true,
487        }
488    }
489}