use scirs2_core::ndarray::{Array1, Array2, Array3, Array4};
use scirs2_core::Complex64;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::f64::consts::PI;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QMLConfig {
pub num_qubits: usize,
pub architecture_type: QMLArchitectureType,
pub layer_configs: Vec<QMLLayerConfig>,
pub training_config: QMLTrainingConfig,
pub hardware_optimization: HardwareOptimizationConfig,
pub classical_preprocessing: ClassicalPreprocessingConfig,
pub hybrid_training: HybridTrainingConfig,
pub quantum_advantage_analysis: bool,
pub noise_aware_training: NoiseAwareTrainingConfig,
pub performance_optimization: PerformanceOptimizationConfig,
}
impl Default for QMLConfig {
fn default() -> Self {
Self {
num_qubits: 8,
architecture_type: QMLArchitectureType::VariationalQuantumCircuit,
layer_configs: vec![
QMLLayerConfig {
layer_type: QMLLayerType::ParameterizedQuantumCircuit,
num_parameters: 16,
ansatz_type: AnsatzType::Hardware,
entanglement_pattern: EntanglementPattern::Linear,
rotation_gates: vec![RotationGate::RY, RotationGate::RZ],
depth: 4,
enable_gradient_computation: true,
},
],
training_config: QMLTrainingConfig::default(),
hardware_optimization: HardwareOptimizationConfig::default(),
classical_preprocessing: ClassicalPreprocessingConfig::default(),
hybrid_training: HybridTrainingConfig::default(),
quantum_advantage_analysis: true,
noise_aware_training: NoiseAwareTrainingConfig::default(),
performance_optimization: PerformanceOptimizationConfig::default(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum QMLArchitectureType {
VariationalQuantumCircuit,
QuantumConvolutionalNN,
QuantumRecurrentNN,
QuantumGraphNN,
QuantumAttentionNetwork,
QuantumTransformer,
HybridClassicalQuantum,
QuantumBoltzmannMachine,
QuantumGAN,
QuantumAutoencoder,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QMLLayerConfig {
pub layer_type: QMLLayerType,
pub num_parameters: usize,
pub ansatz_type: AnsatzType,
pub entanglement_pattern: EntanglementPattern,
pub rotation_gates: Vec<RotationGate>,
pub depth: usize,
pub enable_gradient_computation: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum QMLLayerType {
ParameterizedQuantumCircuit,
QuantumConvolutional,
QuantumPooling,
QuantumDense,
QuantumLSTM,
QuantumGRU,
QuantumAttention,
QuantumDropout,
QuantumBatchNorm,
DataReUpload,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AnsatzType {
Hardware,
ProblemSpecific,
AllToAll,
Layered,
Alternating,
BrickWall,
Tree,
Custom,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum EntanglementPattern {
Linear,
Circular,
AllToAll,
Star,
Grid,
Random,
Block,
Custom,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum RotationGate {
RX,
RY,
RZ,
U3,
Phase,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QMLTrainingConfig {
pub algorithm: QMLTrainingAlgorithm,
pub learning_rate: f64,
pub epochs: usize,
pub batch_size: usize,
pub gradient_method: GradientMethod,
pub optimizer: OptimizerType,
pub regularization: RegularizationConfig,
pub early_stopping: EarlyStoppingConfig,
pub lr_schedule: LearningRateSchedule,
}
impl Default for QMLTrainingConfig {
fn default() -> Self {
Self {
algorithm: QMLTrainingAlgorithm::ParameterShift,
learning_rate: 0.01,
epochs: 100,
batch_size: 32,
gradient_method: GradientMethod::ParameterShift,
optimizer: OptimizerType::Adam,
regularization: RegularizationConfig::default(),
early_stopping: EarlyStoppingConfig::default(),
lr_schedule: LearningRateSchedule::Constant,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum QMLTrainingAlgorithm {
ParameterShift,
FiniteDifference,
QuantumNaturalGradient,
SPSA,
QAOA,
VQE,
Rotosolve,
HybridTraining,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum GradientMethod {
ParameterShift,
FiniteDifference,
Adjoint,
Backpropagation,
QuantumFisherInformation,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum OptimizerType {
SGD,
Adam,
AdaGrad,
RMSprop,
Momentum,
LBFGS,
QuantumNaturalGradient,
SPSA,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegularizationConfig {
pub l1_strength: f64,
pub l2_strength: f64,
pub dropout_prob: f64,
pub parameter_bounds: Option<(f64, f64)>,
pub enable_clipping: bool,
pub gradient_clip_threshold: f64,
}
impl Default for RegularizationConfig {
fn default() -> Self {
Self {
l1_strength: 0.0,
l2_strength: 0.001,
dropout_prob: 0.1,
parameter_bounds: Some((-PI, PI)),
enable_clipping: true,
gradient_clip_threshold: 1.0,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EarlyStoppingConfig {
pub enabled: bool,
pub patience: usize,
pub min_delta: f64,
pub monitor_metric: String,
pub mode_max: bool,
}
impl Default for EarlyStoppingConfig {
fn default() -> Self {
Self {
enabled: true,
patience: 10,
min_delta: 1e-6,
monitor_metric: "val_loss".to_string(),
mode_max: false,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum LearningRateSchedule {
Constant,
ExponentialDecay,
StepDecay,
CosineAnnealing,
WarmRestart,
ReduceOnPlateau,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HardwareOptimizationConfig {
pub target_hardware: QuantumHardwareTarget,
pub minimize_gate_count: bool,
pub minimize_depth: bool,
pub noise_aware: bool,
pub connectivity_constraints: ConnectivityConstraints,
pub gate_fidelities: HashMap<String, f64>,
pub enable_parallelization: bool,
pub optimization_level: HardwareOptimizationLevel,
}
impl Default for HardwareOptimizationConfig {
fn default() -> Self {
let mut gate_fidelities = HashMap::new();
gate_fidelities.insert("single_qubit".to_string(), 0.999);
gate_fidelities.insert("two_qubit".to_string(), 0.99);
Self {
target_hardware: QuantumHardwareTarget::Simulator,
minimize_gate_count: true,
minimize_depth: true,
noise_aware: false,
connectivity_constraints: ConnectivityConstraints::AllToAll,
gate_fidelities,
enable_parallelization: true,
optimization_level: HardwareOptimizationLevel::Medium,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum QuantumHardwareTarget {
Simulator,
IBM,
Google,
IonQ,
Rigetti,
Quantinuum,
Xanadu,
Custom,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ConnectivityConstraints {
AllToAll,
Linear,
Grid(usize, usize), Custom(Vec<(usize, usize)>), HeavyHex,
Square,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum HardwareOptimizationLevel {
Basic,
Medium,
Aggressive,
Maximum,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ClassicalPreprocessingConfig {
pub feature_scaling: bool,
pub encoding_method: DataEncodingMethod,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum DataEncodingMethod {
Amplitude,
Angle,
Basis,
}
impl Default for DataEncodingMethod {
fn default() -> Self {
Self::Amplitude
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HybridTrainingConfig {
pub enabled: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct NoiseAwareTrainingConfig {
pub enabled: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PerformanceOptimizationConfig {
pub enable_caching: bool,
pub memory_optimization: bool,
}