use crate::DeviceResult;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::time::Duration;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PhotonicSystem {
ContinuousVariable,
GateBased,
MeasurementBased,
Hybrid,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhotonicConfig {
pub system: SystemConfig,
pub hardware: HardwareConfig,
pub measurement: MeasurementConfig,
pub error_correction: ErrorCorrectionConfig,
pub optimization: OptimizationConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SystemConfig {
pub system_type: PhotonicSystem,
pub mode_count: usize,
pub cutoff_dimension: usize,
pub max_photon_number: usize,
pub squeezing_range: (f64, f64),
pub displacement_range: (f64, f64),
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HardwareConfig {
pub laser: LaserConfig,
pub detector: DetectorConfig,
pub beam_splitter: BeamSplitterConfig,
pub phase_shifter: PhaseShifterConfig,
pub squeezer: SqueezerConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LaserConfig {
pub wavelength: f64,
pub power: f64,
pub linewidth: f64,
pub coherence_time: f64,
pub intensity_noise: f64,
pub phase_noise: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DetectorConfig {
pub efficiency: f64,
pub dark_count_rate: f64,
pub dead_time: f64,
pub timing_jitter: f64,
pub number_resolution: bool,
pub quantum_efficiency: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BeamSplitterConfig {
pub transmission: f64,
pub reflection: f64,
pub loss: f64,
pub phase_shift: f64,
pub bandwidth: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PhaseShifterConfig {
pub max_phase_shift: f64,
pub phase_resolution: f64,
pub response_time: f64,
pub drift_rate: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SqueezerConfig {
pub max_squeezing: f64,
pub bandwidth: f64,
pub anti_squeezing_penalty: f64,
pub pump_power: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct MeasurementConfig {
pub homodyne: HomodyneConfig,
pub heterodyne: HeterodyneConfig,
pub photon_counting: PhotonCountingConfig,
pub tomography: TomographyConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HomodyneConfig {
pub lo_power: f64,
pub efficiency: f64,
pub electronic_noise: f64,
pub shot_noise_clearance: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HeterodyneConfig {
pub lo_power: f64,
pub intermediate_frequency: f64,
pub efficiency: f64,
pub phase_resolution: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PhotonCountingConfig {
pub max_count_rate: f64,
pub detection_window: f64,
pub coincidence_window: f64,
pub background_rate: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TomographyConfig {
pub measurement_settings: usize,
pub shots_per_setting: usize,
pub reconstruction_method: TomographyMethod,
pub regularization: f64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum TomographyMethod {
MaximumLikelihood,
LinearInversion,
Bayesian,
CompressedSensing,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorCorrectionConfig {
pub enabled: bool,
pub scheme: ErrorCorrectionScheme,
pub loss_tolerance: f64,
pub phase_error_tolerance: f64,
pub syndrome_rounds: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ErrorCorrectionScheme {
None,
GKP,
Cat,
Binomial,
FourComponentCat,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OptimizationConfig {
pub gate_optimization: bool,
pub measurement_optimization: bool,
pub loss_compensation: bool,
pub algorithm: OptimizationAlgorithm,
pub max_iterations: usize,
pub tolerance: f64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum OptimizationAlgorithm {
GradientDescent,
SimulatedAnnealing,
Genetic,
ParticleSwarm,
Bayesian,
}
impl Default for SystemConfig {
fn default() -> Self {
Self {
system_type: PhotonicSystem::ContinuousVariable,
mode_count: 8,
cutoff_dimension: 10,
max_photon_number: 50,
squeezing_range: (-2.0, 2.0),
displacement_range: (-5.0, 5.0),
}
}
}
impl Default for LaserConfig {
fn default() -> Self {
Self {
wavelength: 1550.0,
power: 10.0,
linewidth: 100.0,
coherence_time: 10.0,
intensity_noise: -140.0,
phase_noise: 1e-6,
}
}
}
impl Default for DetectorConfig {
fn default() -> Self {
Self {
efficiency: 0.9,
dark_count_rate: 100.0,
dead_time: 50.0,
timing_jitter: 100.0,
number_resolution: true,
quantum_efficiency: 0.85,
}
}
}
impl Default for BeamSplitterConfig {
fn default() -> Self {
Self {
transmission: 0.5,
reflection: 0.5,
loss: 0.01,
phase_shift: 0.0,
bandwidth: 1e12,
}
}
}
impl Default for PhaseShifterConfig {
fn default() -> Self {
Self {
max_phase_shift: 2.0 * std::f64::consts::PI,
phase_resolution: 0.01,
response_time: 1.0,
drift_rate: 1e-6,
}
}
}
impl Default for SqueezerConfig {
fn default() -> Self {
Self {
max_squeezing: 10.0,
bandwidth: 1e9,
anti_squeezing_penalty: 3.0,
pump_power: 100.0,
}
}
}
impl Default for HomodyneConfig {
fn default() -> Self {
Self {
lo_power: 1.0,
efficiency: 0.9,
electronic_noise: 1e-8,
shot_noise_clearance: 10.0,
}
}
}
impl Default for HeterodyneConfig {
fn default() -> Self {
Self {
lo_power: 1.0,
intermediate_frequency: 1e6,
efficiency: 0.85,
phase_resolution: 0.01,
}
}
}
impl Default for PhotonCountingConfig {
fn default() -> Self {
Self {
max_count_rate: 1e6,
detection_window: 10.0,
coincidence_window: 1.0,
background_rate: 100.0,
}
}
}
impl Default for TomographyConfig {
fn default() -> Self {
Self {
measurement_settings: 16,
shots_per_setting: 10000,
reconstruction_method: TomographyMethod::MaximumLikelihood,
regularization: 1e-6,
}
}
}
impl Default for ErrorCorrectionConfig {
fn default() -> Self {
Self {
enabled: false,
scheme: ErrorCorrectionScheme::None,
loss_tolerance: 0.1,
phase_error_tolerance: 0.05,
syndrome_rounds: 3,
}
}
}
impl Default for OptimizationConfig {
fn default() -> Self {
Self {
gate_optimization: true,
measurement_optimization: true,
loss_compensation: true,
algorithm: OptimizationAlgorithm::GradientDescent,
max_iterations: 1000,
tolerance: 1e-6,
}
}
}
pub struct PhotonicConfigBuilder {
config: PhotonicConfig,
}
impl PhotonicConfigBuilder {
pub fn new() -> Self {
Self {
config: PhotonicConfig::default(),
}
}
#[must_use]
pub const fn system_type(mut self, system_type: PhotonicSystem) -> Self {
self.config.system.system_type = system_type;
self
}
#[must_use]
pub const fn mode_count(mut self, count: usize) -> Self {
self.config.system.mode_count = count;
self
}
#[must_use]
pub const fn cutoff_dimension(mut self, cutoff: usize) -> Self {
self.config.system.cutoff_dimension = cutoff;
self
}
#[must_use]
pub const fn laser_wavelength(mut self, wavelength: f64) -> Self {
self.config.hardware.laser.wavelength = wavelength;
self
}
#[must_use]
pub const fn detection_efficiency(mut self, efficiency: f64) -> Self {
self.config.hardware.detector.efficiency = efficiency;
self
}
#[must_use]
pub const fn enable_error_correction(mut self, enabled: bool) -> Self {
self.config.error_correction.enabled = enabled;
self
}
#[must_use]
pub const fn error_correction_scheme(mut self, scheme: ErrorCorrectionScheme) -> Self {
self.config.error_correction.scheme = scheme;
self
}
#[must_use]
pub const fn optimization_algorithm(mut self, algorithm: OptimizationAlgorithm) -> Self {
self.config.optimization.algorithm = algorithm;
self
}
pub fn build(self) -> DeviceResult<PhotonicConfig> {
self.validate()?;
Ok(self.config)
}
fn validate(&self) -> DeviceResult<()> {
if self.config.system.mode_count == 0 {
return Err(crate::DeviceError::InvalidInput(
"Mode count must be greater than 0".to_string(),
));
}
if self.config.system.cutoff_dimension == 0 {
return Err(crate::DeviceError::InvalidInput(
"Cutoff dimension must be greater than 0".to_string(),
));
}
if self.config.hardware.laser.wavelength <= 0.0 {
return Err(crate::DeviceError::InvalidInput(
"Laser wavelength must be positive".to_string(),
));
}
if self.config.hardware.detector.efficiency < 0.0
|| self.config.hardware.detector.efficiency > 1.0
{
return Err(crate::DeviceError::InvalidInput(
"Detection efficiency must be between 0 and 1".to_string(),
));
}
Ok(())
}
}
impl Default for PhotonicConfigBuilder {
fn default() -> Self {
Self::new()
}
}
pub struct PhotonicConfigurations;
impl PhotonicConfigurations {
pub fn cv_config() -> PhotonicConfig {
PhotonicConfigBuilder::new()
.system_type(PhotonicSystem::ContinuousVariable)
.mode_count(8)
.cutoff_dimension(20)
.laser_wavelength(1550.0)
.detection_efficiency(0.9)
.build()
.expect("CV config uses valid parameters")
}
pub fn gate_based_config() -> PhotonicConfig {
PhotonicConfigBuilder::new()
.system_type(PhotonicSystem::GateBased)
.mode_count(16)
.cutoff_dimension(5)
.laser_wavelength(780.0)
.detection_efficiency(0.95)
.enable_error_correction(true)
.error_correction_scheme(ErrorCorrectionScheme::GKP)
.build()
.expect("Gate-based config uses valid parameters")
}
pub fn mbqc_config() -> PhotonicConfig {
PhotonicConfigBuilder::new()
.system_type(PhotonicSystem::MeasurementBased)
.mode_count(32)
.cutoff_dimension(3)
.laser_wavelength(532.0)
.detection_efficiency(0.85)
.optimization_algorithm(OptimizationAlgorithm::Bayesian)
.build()
.expect("MBQC config uses valid parameters")
}
pub fn hybrid_config() -> PhotonicConfig {
PhotonicConfigBuilder::new()
.system_type(PhotonicSystem::Hybrid)
.mode_count(24)
.cutoff_dimension(15)
.laser_wavelength(1064.0)
.detection_efficiency(0.92)
.enable_error_correction(true)
.error_correction_scheme(ErrorCorrectionScheme::Cat)
.build()
.expect("Hybrid config uses valid parameters")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_config_builder() {
let config = PhotonicConfigBuilder::new()
.mode_count(10)
.cutoff_dimension(15)
.laser_wavelength(1550.0)
.build();
assert!(config.is_ok());
let config = config.expect("Config should be valid");
assert_eq!(config.system.mode_count, 10);
assert_eq!(config.system.cutoff_dimension, 15);
assert_eq!(config.hardware.laser.wavelength, 1550.0);
}
#[test]
fn test_predefined_configs() {
let cv = PhotonicConfigurations::cv_config();
assert_eq!(cv.system.system_type, PhotonicSystem::ContinuousVariable);
let gate_based = PhotonicConfigurations::gate_based_config();
assert_eq!(gate_based.system.system_type, PhotonicSystem::GateBased);
assert!(gate_based.error_correction.enabled);
let mbqc = PhotonicConfigurations::mbqc_config();
assert_eq!(mbqc.system.system_type, PhotonicSystem::MeasurementBased);
let hybrid = PhotonicConfigurations::hybrid_config();
assert_eq!(hybrid.system.system_type, PhotonicSystem::Hybrid);
}
#[test]
fn test_invalid_config() {
let config = PhotonicConfigBuilder::new().mode_count(0).build();
assert!(config.is_err());
}
}