quantrs2_circuit/scirs2_pulse_control_enhanced/
pulses.rs

1//! Pulse library and shape definitions
2
3use scirs2_core::Complex64;
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7/// Pulse library with predefined shapes
8#[derive(Debug, Clone, Serialize, Deserialize, Default)]
9pub struct PulseLibrary {
10    pub gaussian: GaussianPulse,
11    pub drag: DRAGPulse,
12    pub cosine: CosinePulse,
13    pub erf: ErfPulse,
14    pub sech: SechPulse,
15    pub custom_shapes: HashMap<String, CustomPulseShape>,
16}
17
18/// Gaussian pulse parameters
19#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct GaussianPulse {
21    pub sigma: f64,
22    pub truncation: f64,
23}
24
25impl Default for GaussianPulse {
26    fn default() -> Self {
27        Self {
28            sigma: 10e-9,
29            truncation: 4.0,
30        }
31    }
32}
33
34/// DRAG pulse parameters
35#[derive(Debug, Clone, Serialize, Deserialize)]
36pub struct DRAGPulse {
37    pub gaussian_params: GaussianPulse,
38    pub beta: f64,
39    pub anharmonicity: f64,
40}
41
42impl Default for DRAGPulse {
43    fn default() -> Self {
44        Self {
45            gaussian_params: GaussianPulse::default(),
46            beta: 0.1,
47            anharmonicity: -300e6,
48        }
49    }
50}
51
52/// Cosine pulse parameters
53#[derive(Debug, Clone, Serialize, Deserialize)]
54pub struct CosinePulse {
55    pub rise_time_fraction: f64,
56}
57
58impl Default for CosinePulse {
59    fn default() -> Self {
60        Self {
61            rise_time_fraction: 0.1,
62        }
63    }
64}
65
66/// Error function pulse parameters
67#[derive(Debug, Clone, Serialize, Deserialize)]
68pub struct ErfPulse {
69    pub rise_time: f64,
70    pub fall_time: f64,
71}
72
73impl Default for ErfPulse {
74    fn default() -> Self {
75        Self {
76            rise_time: 2e-9,
77            fall_time: 2e-9,
78        }
79    }
80}
81
82/// Hyperbolic secant pulse parameters
83#[derive(Debug, Clone, Serialize, Deserialize)]
84pub struct SechPulse {
85    pub bandwidth: f64,
86    pub truncation: f64,
87}
88
89impl Default for SechPulse {
90    fn default() -> Self {
91        Self {
92            bandwidth: 100e6,
93            truncation: 4.0,
94        }
95    }
96}
97
98/// Custom pulse shape
99#[derive(Debug, Clone, Serialize, Deserialize)]
100pub struct CustomPulseShape {
101    pub name: String,
102    pub samples: Vec<Complex64>,
103    pub parametric_form: Option<String>,
104}