use super::pulses::PulseLibrary;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EnhancedPulseConfig {
pub base_config: PulseControlConfig,
pub enable_ml_optimization: bool,
pub enable_realtime_calibration: bool,
pub enable_advanced_synthesis: bool,
pub enable_error_mitigation: bool,
pub enable_adaptive_control: bool,
pub enable_visual_output: bool,
pub optimization_objectives: Vec<PulseOptimizationObjective>,
pub performance_constraints: PulseConstraints,
pub signal_processing: SignalProcessingConfig,
pub export_formats: Vec<PulseExportFormat>,
}
impl Default for EnhancedPulseConfig {
fn default() -> Self {
Self {
base_config: PulseControlConfig::default(),
enable_ml_optimization: true,
enable_realtime_calibration: true,
enable_advanced_synthesis: true,
enable_error_mitigation: true,
enable_adaptive_control: true,
enable_visual_output: true,
optimization_objectives: vec![
PulseOptimizationObjective::MinimizeInfidelity,
PulseOptimizationObjective::MinimizeDuration,
PulseOptimizationObjective::MinimizePower,
],
performance_constraints: PulseConstraints::default(),
signal_processing: SignalProcessingConfig::default(),
export_formats: vec![
PulseExportFormat::OpenPulse,
PulseExportFormat::Qiskit,
PulseExportFormat::Custom,
],
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PulseControlConfig {
pub sample_rate: f64,
pub max_amplitude: f64,
pub min_duration: f64,
pub max_duration: f64,
pub hardware_constraints: HardwareConstraints,
pub pulse_library: PulseLibrary,
}
impl Default for PulseControlConfig {
fn default() -> Self {
Self {
sample_rate: 1e9,
max_amplitude: 1.0,
min_duration: 1e-9,
max_duration: 1e-6,
hardware_constraints: HardwareConstraints::default(),
pulse_library: PulseLibrary::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HardwareConstraints {
pub awg_specs: AWGSpecifications,
pub iq_mixer_specs: IQMixerSpecifications,
pub bandwidth: f64,
pub rise_time: f64,
pub phase_noise: PhaseNoiseSpec,
pub amplitude_noise: AmplitudeNoiseSpec,
}
impl Default for HardwareConstraints {
fn default() -> Self {
Self {
awg_specs: AWGSpecifications::default(),
iq_mixer_specs: IQMixerSpecifications::default(),
bandwidth: 500e6,
rise_time: 2e-9,
phase_noise: PhaseNoiseSpec::default(),
amplitude_noise: AmplitudeNoiseSpec::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AWGSpecifications {
pub resolution_bits: u8,
pub max_sample_rate: f64,
pub memory_depth: usize,
pub channels: usize,
pub voltage_range: (f64, f64),
}
impl Default for AWGSpecifications {
fn default() -> Self {
Self {
resolution_bits: 16,
max_sample_rate: 2.5e9,
memory_depth: 16_000_000,
channels: 4,
voltage_range: (-1.0, 1.0),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IQMixerSpecifications {
pub lo_frequency_range: (f64, f64),
pub if_bandwidth: f64,
pub isolation: f64,
pub conversion_loss: f64,
}
impl Default for IQMixerSpecifications {
fn default() -> Self {
Self {
lo_frequency_range: (1e9, 20e9),
if_bandwidth: 1e9,
isolation: 40.0,
conversion_loss: 6.0,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PhaseNoiseSpec {
pub offset_frequencies: Vec<f64>,
pub noise_levels: Vec<f64>,
}
impl Default for PhaseNoiseSpec {
fn default() -> Self {
Self {
offset_frequencies: vec![10.0, 100.0, 1e3, 10e3, 100e3, 1e6],
noise_levels: vec![-80.0, -100.0, -110.0, -120.0, -130.0, -140.0],
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AmplitudeNoiseSpec {
pub rms_noise: f64,
pub peak_to_peak_noise: f64,
pub spectral_density: f64,
}
impl Default for AmplitudeNoiseSpec {
fn default() -> Self {
Self {
rms_noise: 1e-6,
peak_to_peak_noise: 6e-6,
spectral_density: 1e-9,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PulseOptimizationObjective {
MinimizeInfidelity,
MinimizeDuration,
MinimizePower,
MinimizeLeakage,
MaximizeRobustness,
MinimizeCrosstalk,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PulseConstraints {
pub max_amplitude: Option<f64>,
pub max_slew_rate: Option<f64>,
pub max_frequency: Option<f64>,
pub min_fidelity: Option<f64>,
pub max_leakage: Option<f64>,
}
impl Default for PulseConstraints {
fn default() -> Self {
Self {
max_amplitude: Some(1.0),
max_slew_rate: Some(1e12),
max_frequency: Some(500e6),
min_fidelity: Some(0.999),
max_leakage: Some(0.001),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SignalProcessingConfig {
pub filter_type: FilterType,
pub windowing: WindowType,
pub oversampling_factor: usize,
pub enable_predistortion: bool,
pub enable_feedback: bool,
}
impl Default for SignalProcessingConfig {
fn default() -> Self {
Self {
filter_type: FilterType::Butterworth(4),
windowing: WindowType::Hamming,
oversampling_factor: 4,
enable_predistortion: true,
enable_feedback: true,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum FilterType {
Butterworth(usize),
Chebyshev(usize),
Bessel(usize),
FIR(usize),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum WindowType {
Rectangular,
Hamming,
Hanning,
Blackman,
Kaiser(u32),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PulseExportFormat {
OpenPulse,
Qiskit,
Custom,
}