1use ndarray::Array2;
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct QuantumTimeSeriesConfig {
10 pub num_qubits: usize,
12
13 pub model_type: TimeSeriesModel,
15
16 pub window_size: usize,
18
19 pub forecast_horizon: usize,
21
22 pub feature_config: FeatureEngineeringConfig,
24
25 pub quantum_enhancement: QuantumEnhancementLevel,
27
28 pub seasonality_config: SeasonalityConfig,
30
31 pub ensemble_config: Option<EnsembleConfig>,
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize)]
37pub enum TimeSeriesModel {
38 QuantumARIMA {
40 p: usize, d: usize, q: usize, seasonal: Option<(usize, usize, usize, usize)>, },
45
46 QuantumLSTM {
48 hidden_size: usize,
49 num_layers: usize,
50 dropout: f64,
51 },
52
53 QuantumTransformerTS {
55 model_dim: usize,
56 num_heads: usize,
57 num_layers: usize,
58 },
59
60 QuantumStateSpace {
62 state_dim: usize,
63 emission_dim: usize,
64 transition_type: TransitionType,
65 },
66
67 QuantumProphet {
69 growth_type: GrowthType,
70 changepoint_prior_scale: f64,
71 seasonality_prior_scale: f64,
72 },
73
74 QuantumNeuralProphet {
76 hidden_layers: Vec<usize>,
77 ar_order: usize,
78 ma_order: usize,
79 },
80
81 QuantumTFT {
83 state_size: usize,
84 attention_heads: usize,
85 num_layers: usize,
86 },
87}
88
89#[derive(Debug, Clone, Serialize, Deserialize)]
91pub struct FeatureEngineeringConfig {
92 pub quantum_fourier_features: bool,
94
95 pub lag_features: Vec<usize>,
97
98 pub rolling_windows: Vec<usize>,
100
101 pub wavelet_decomposition: bool,
103
104 pub quantum_features: bool,
106
107 pub interaction_features: bool,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
113pub struct SeasonalityConfig {
114 pub daily: Option<usize>,
116
117 pub weekly: Option<usize>,
119
120 pub monthly: Option<usize>,
122
123 pub yearly: Option<usize>,
125
126 pub custom_periods: Vec<usize>,
128
129 pub quantum_decomposition: bool,
131}
132
133#[derive(Debug, Clone, Serialize, Deserialize)]
135pub enum QuantumEnhancementLevel {
136 Low,
138
139 Medium,
141
142 High,
144
145 Custom {
147 quantum_layers: Vec<usize>,
148 entanglement_strength: f64,
149 measurement_strategy: MeasurementStrategy,
150 },
151}
152
153#[derive(Debug, Clone, Serialize, Deserialize)]
155pub enum MeasurementStrategy {
156 Computational,
158
159 Hadamard,
161
162 Custom(Array2<f64>),
164
165 Adaptive,
167}
168
169#[derive(Debug, Clone, Serialize, Deserialize)]
171pub enum TransitionType {
172 Linear,
174
175 NonlinearQuantum,
177
178 Recurrent,
180
181 Attention,
183}
184
185#[derive(Debug, Clone, Serialize, Deserialize)]
187pub enum GrowthType {
188 Linear,
190
191 Logistic(f64),
193
194 Flat,
196
197 QuantumSuperposition,
199}
200
201#[derive(Debug, Clone, Serialize, Deserialize)]
203pub struct EnsembleConfig {
204 pub method: EnsembleMethod,
206
207 pub num_models: usize,
209
210 pub diversity_strategy: DiversityStrategy,
212
213 pub quantum_voting: bool,
215}
216
217#[derive(Debug, Clone, Serialize, Deserialize)]
219pub enum EnsembleMethod {
220 Average,
222
223 Weighted(Vec<f64>),
225
226 QuantumSuperposition,
228
229 Stacking,
231
232 BayesianAverage,
234}
235
236#[derive(Debug, Clone, Serialize, Deserialize)]
238pub enum DiversityStrategy {
239 RandomInit,
241
242 Bootstrap,
244
245 FeatureBagging,
247
248 QuantumDiversity,
250}
251
252#[derive(Debug, Clone, Serialize, Deserialize)]
254pub enum WaveletType {
255 Haar,
256 Daubechies(usize),
257 Morlet,
258 Mexican,
259 Quantum,
260}
261
262#[derive(Debug, Clone, Serialize, Deserialize)]
264pub enum AnomalyType {
265 Point,
267
268 Contextual,
270
271 Collective,
273
274 QuantumUncertainty,
276
277 Changepoint,
279}
280
281impl 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 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 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, forecast_horizon: sampling_rate * 10, feature_config: FeatureEngineeringConfig::iot(),
332 quantum_enhancement: QuantumEnhancementLevel::High,
333 seasonality_config: SeasonalityConfig::hourly(),
334 ensemble_config: None,
335 }
336 }
337
338 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, forecast_horizon: 30, 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 pub fn financial() -> Self {
373 Self {
374 quantum_fourier_features: true,
375 lag_features: vec![1, 5, 10, 20, 60], rolling_windows: vec![5, 10, 20, 60], wavelet_decomposition: true,
378 quantum_features: true,
379 interaction_features: true,
380 }
381 }
382
383 pub fn iot() -> Self {
385 Self {
386 quantum_fourier_features: true,
387 lag_features: vec![1, 6, 12, 24], rolling_windows: vec![6, 12, 24, 48],
389 wavelet_decomposition: true,
390 quantum_features: true,
391 interaction_features: false,
392 }
393 }
394
395 pub fn retail() -> Self {
397 Self {
398 quantum_fourier_features: false,
399 lag_features: vec![1, 7, 14, 28, 365], 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 pub fn financial() -> Self {
424 Self {
425 daily: Some(1),
426 weekly: Some(5), monthly: Some(21), yearly: Some(252), custom_periods: vec![63], quantum_decomposition: true,
431 }
432 }
433
434 pub fn hourly() -> Self {
436 Self {
437 daily: Some(24),
438 weekly: Some(168), monthly: None,
440 yearly: None,
441 custom_periods: Vec::new(),
442 quantum_decomposition: true,
443 }
444 }
445
446 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], quantum_decomposition: true,
455 }
456 }
457
458 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 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}