use scirs2_core::ndarray::Array2;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuantumTimeSeriesConfig {
pub num_qubits: usize,
pub model_type: TimeSeriesModel,
pub window_size: usize,
pub forecast_horizon: usize,
pub feature_config: FeatureEngineeringConfig,
pub quantum_enhancement: QuantumEnhancementLevel,
pub seasonality_config: SeasonalityConfig,
pub ensemble_config: Option<EnsembleConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TimeSeriesModel {
QuantumARIMA {
p: usize, d: usize, q: usize, seasonal: Option<(usize, usize, usize, usize)>, },
QuantumLSTM {
hidden_size: usize,
num_layers: usize,
dropout: f64,
},
QuantumTransformerTS {
model_dim: usize,
num_heads: usize,
num_layers: usize,
},
QuantumStateSpace {
state_dim: usize,
emission_dim: usize,
transition_type: TransitionType,
},
QuantumProphet {
growth_type: GrowthType,
changepoint_prior_scale: f64,
seasonality_prior_scale: f64,
},
QuantumNeuralProphet {
hidden_layers: Vec<usize>,
ar_order: usize,
ma_order: usize,
},
QuantumTFT {
state_size: usize,
attention_heads: usize,
num_layers: usize,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FeatureEngineeringConfig {
pub quantum_fourier_features: bool,
pub lag_features: Vec<usize>,
pub rolling_windows: Vec<usize>,
pub wavelet_decomposition: bool,
pub quantum_features: bool,
pub interaction_features: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SeasonalityConfig {
pub daily: Option<usize>,
pub weekly: Option<usize>,
pub monthly: Option<usize>,
pub yearly: Option<usize>,
pub custom_periods: Vec<usize>,
pub quantum_decomposition: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum QuantumEnhancementLevel {
Low,
Medium,
High,
Custom {
quantum_layers: Vec<usize>,
entanglement_strength: f64,
measurement_strategy: MeasurementStrategy,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MeasurementStrategy {
Computational,
Hadamard,
Custom(Array2<f64>),
Adaptive,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TransitionType {
Linear,
NonlinearQuantum,
Recurrent,
Attention,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum GrowthType {
Linear,
Logistic(f64),
Flat,
QuantumSuperposition,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EnsembleConfig {
pub method: EnsembleMethod,
pub num_models: usize,
pub diversity_strategy: DiversityStrategy,
pub quantum_voting: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum EnsembleMethod {
Average,
Weighted(Vec<f64>),
QuantumSuperposition,
Stacking,
BayesianAverage,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DiversityStrategy {
RandomInit,
Bootstrap,
FeatureBagging,
QuantumDiversity,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum WaveletType {
Haar,
Daubechies(usize),
Morlet,
Mexican,
Quantum,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AnomalyType {
Point,
Contextual,
Collective,
QuantumUncertainty,
Changepoint,
}
impl Default for QuantumTimeSeriesConfig {
fn default() -> Self {
Self {
num_qubits: 10,
model_type: TimeSeriesModel::QuantumLSTM {
hidden_size: 64,
num_layers: 2,
dropout: 0.1,
},
window_size: 30,
forecast_horizon: 7,
feature_config: FeatureEngineeringConfig::default(),
quantum_enhancement: QuantumEnhancementLevel::Medium,
seasonality_config: SeasonalityConfig::default(),
ensemble_config: None,
}
}
}
impl QuantumTimeSeriesConfig {
pub fn financial(forecast_horizon: usize) -> Self {
Self {
num_qubits: 12,
model_type: TimeSeriesModel::QuantumTFT {
state_size: 128,
attention_heads: 8,
num_layers: 4,
},
window_size: 60,
forecast_horizon,
feature_config: FeatureEngineeringConfig::financial(),
quantum_enhancement: QuantumEnhancementLevel::High,
seasonality_config: SeasonalityConfig::financial(),
ensemble_config: Some(EnsembleConfig::default()),
}
}
pub fn iot_sensor(sampling_rate: usize) -> Self {
Self {
num_qubits: 14,
model_type: TimeSeriesModel::QuantumStateSpace {
state_dim: 32,
emission_dim: 16,
transition_type: TransitionType::NonlinearQuantum,
},
window_size: sampling_rate * 60, forecast_horizon: sampling_rate * 10, feature_config: FeatureEngineeringConfig::iot(),
quantum_enhancement: QuantumEnhancementLevel::High,
seasonality_config: SeasonalityConfig::hourly(),
ensemble_config: None,
}
}
pub fn demand_forecasting() -> Self {
Self {
num_qubits: 12,
model_type: TimeSeriesModel::QuantumProphet {
growth_type: GrowthType::Linear,
changepoint_prior_scale: 0.05,
seasonality_prior_scale: 10.0,
},
window_size: 365, forecast_horizon: 30, feature_config: FeatureEngineeringConfig::retail(),
quantum_enhancement: QuantumEnhancementLevel::Medium,
seasonality_config: SeasonalityConfig::retail(),
ensemble_config: Some(EnsembleConfig::stacking()),
}
}
}
impl Default for FeatureEngineeringConfig {
fn default() -> Self {
Self {
quantum_fourier_features: true,
lag_features: vec![1, 7, 14, 30],
rolling_windows: vec![7, 14, 30],
wavelet_decomposition: false,
quantum_features: true,
interaction_features: false,
}
}
}
impl FeatureEngineeringConfig {
pub fn financial() -> Self {
Self {
quantum_fourier_features: true,
lag_features: vec![1, 5, 10, 20, 60], rolling_windows: vec![5, 10, 20, 60], wavelet_decomposition: true,
quantum_features: true,
interaction_features: true,
}
}
pub fn iot() -> Self {
Self {
quantum_fourier_features: true,
lag_features: vec![1, 6, 12, 24], rolling_windows: vec![6, 12, 24, 48],
wavelet_decomposition: true,
quantum_features: true,
interaction_features: false,
}
}
pub fn retail() -> Self {
Self {
quantum_fourier_features: false,
lag_features: vec![1, 7, 14, 28, 365], rolling_windows: vec![7, 14, 28],
wavelet_decomposition: false,
quantum_features: true,
interaction_features: true,
}
}
}
impl Default for SeasonalityConfig {
fn default() -> Self {
Self {
daily: None,
weekly: Some(7),
monthly: None,
yearly: None,
custom_periods: Vec::new(),
quantum_decomposition: true,
}
}
}
impl SeasonalityConfig {
pub fn financial() -> Self {
Self {
daily: Some(1),
weekly: Some(5), monthly: Some(21), yearly: Some(252), custom_periods: vec![63], quantum_decomposition: true,
}
}
pub fn hourly() -> Self {
Self {
daily: Some(24),
weekly: Some(168), monthly: None,
yearly: None,
custom_periods: Vec::new(),
quantum_decomposition: true,
}
}
pub fn retail() -> Self {
Self {
daily: None,
weekly: Some(7),
monthly: Some(30),
yearly: Some(365),
custom_periods: vec![90, 180], quantum_decomposition: true,
}
}
pub fn has_seasonality(&self) -> bool {
self.daily.is_some()
|| self.weekly.is_some()
|| self.monthly.is_some()
|| self.yearly.is_some()
|| !self.custom_periods.is_empty()
}
}
impl Default for EnsembleConfig {
fn default() -> Self {
Self {
method: EnsembleMethod::Average,
num_models: 3,
diversity_strategy: DiversityStrategy::RandomInit,
quantum_voting: true,
}
}
}
impl EnsembleConfig {
pub fn stacking() -> Self {
Self {
method: EnsembleMethod::Stacking,
num_models: 5,
diversity_strategy: DiversityStrategy::FeatureBagging,
quantum_voting: true,
}
}
}