use crate::DeviceResult;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::time::Duration;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct AdvancedNeutralAtomConfig {
pub hardware_settings: HardwareSettings,
pub optimization: OptimizationConfig,
pub error_correction: ErrorCorrectionConfig,
pub calibration: CalibrationConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HardwareSettings {
pub laser_control: LaserControlConfig,
pub trap_config: TrapConfig,
pub detection: DetectionConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LaserControlConfig {
pub trapping_wavelength: f64,
pub rydberg_wavelength: f64,
pub max_power: f64,
pub beam_waist: f64,
pub stability: LaserStabilityConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LaserStabilityConfig {
pub frequency_stability: f64,
pub power_stability: f64,
pub phase_stability: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TrapConfig {
pub trap_depth: f64,
pub trap_frequency: f64,
pub anharmonicity: f64,
pub loading_rate: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DetectionConfig {
pub efficiency: f64,
pub dark_count_rate: f64,
pub integration_time: f64,
pub background_subtraction: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OptimizationConfig {
pub gate_optimization: bool,
pub circuit_optimization: bool,
pub max_optimization_time: Duration,
pub optimization_target: OptimizationTarget,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum OptimizationTarget {
Speed,
Fidelity,
Balanced,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorCorrectionConfig {
pub enabled: bool,
pub scheme: ErrorCorrectionScheme,
pub syndrome_detection: SyndromeDetectionConfig,
pub recovery_protocol: RecoveryProtocolConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ErrorCorrectionScheme {
None,
Repetition,
Surface,
Color,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SyndromeDetectionConfig {
pub threshold: f64,
pub measurement_rounds: usize,
pub majority_voting: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RecoveryProtocolConfig {
pub max_attempts: usize,
pub timeout: Duration,
pub adaptive: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalibrationConfig {
pub auto_calibration: bool,
pub calibration_interval: Duration,
pub procedures: Vec<CalibrationProcedure>,
pub reference_measurements: HashMap<String, f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CalibrationProcedure {
LaserFrequency,
PowerCalibration,
TrapDepth,
GateFidelity,
DetectionEfficiency,
Custom(String),
}
impl Default for LaserControlConfig {
fn default() -> Self {
Self {
trapping_wavelength: 852.0,
rydberg_wavelength: 480.0,
max_power: 100.0,
beam_waist: 1.0,
stability: LaserStabilityConfig::default(),
}
}
}
impl Default for LaserStabilityConfig {
fn default() -> Self {
Self {
frequency_stability: 1000.0,
power_stability: 0.1,
phase_stability: 0.01,
}
}
}
impl Default for TrapConfig {
fn default() -> Self {
Self {
trap_depth: 1000.0,
trap_frequency: 100_000.0,
anharmonicity: 0.01,
loading_rate: 1000.0,
}
}
}
impl Default for DetectionConfig {
fn default() -> Self {
Self {
efficiency: 0.95,
dark_count_rate: 10.0,
integration_time: 100.0,
background_subtraction: true,
}
}
}
impl Default for OptimizationConfig {
fn default() -> Self {
Self {
gate_optimization: true,
circuit_optimization: true,
max_optimization_time: Duration::from_millis(1000),
optimization_target: OptimizationTarget::Balanced,
}
}
}
impl Default for ErrorCorrectionConfig {
fn default() -> Self {
Self {
enabled: false,
scheme: ErrorCorrectionScheme::None,
syndrome_detection: SyndromeDetectionConfig::default(),
recovery_protocol: RecoveryProtocolConfig::default(),
}
}
}
impl Default for SyndromeDetectionConfig {
fn default() -> Self {
Self {
threshold: 0.5,
measurement_rounds: 3,
majority_voting: true,
}
}
}
impl Default for RecoveryProtocolConfig {
fn default() -> Self {
Self {
max_attempts: 3,
timeout: Duration::from_millis(100),
adaptive: true,
}
}
}
impl Default for CalibrationConfig {
fn default() -> Self {
Self {
auto_calibration: true,
calibration_interval: Duration::from_secs(3600),
procedures: vec![
CalibrationProcedure::LaserFrequency,
CalibrationProcedure::PowerCalibration,
CalibrationProcedure::TrapDepth,
],
reference_measurements: HashMap::new(),
}
}
}
pub fn validate_advanced_config(config: &AdvancedNeutralAtomConfig) -> DeviceResult<()> {
if config.hardware_settings.laser_control.max_power <= 0.0 {
return Err(crate::DeviceError::InvalidInput(
"Maximum laser power must be positive".to_string(),
));
}
if config.hardware_settings.trap_config.trap_depth <= 0.0 {
return Err(crate::DeviceError::InvalidInput(
"Trap depth must be positive".to_string(),
));
}
let efficiency = config.hardware_settings.detection.efficiency;
if !(0.0..=1.0).contains(&efficiency) {
return Err(crate::DeviceError::InvalidInput(
"Detection efficiency must be between 0 and 1".to_string(),
));
}
Ok(())
}