quantrs2_device/characterization/
functions.rs1use crate::{CircuitResult, DeviceResult};
6use quantrs2_circuit::prelude::*;
7use quantrs2_core::qubit::QubitId;
8
9use super::types::{DriftTracker, ProcessTomography, RandomizedBenchmarking, StateTomography};
10
11#[async_trait::async_trait]
13pub trait CharacterizationExecutor {
14 async fn execute_characterization_circuit<const N: usize>(
15 &self,
16 circuit: &Circuit<N>,
17 shots: usize,
18 ) -> DeviceResult<CircuitResult>;
19}
20#[cfg(test)]
21mod tests {
22 use super::*;
23 #[test]
24 fn test_process_tomography_circuits() {
25 let tomo = ProcessTomography::new(1);
26 let prep_circuits = tomo.preparation_circuits();
27 let meas_circuits = tomo.measurement_circuits();
28 assert_eq!(prep_circuits.len(), 4);
29 assert_eq!(meas_circuits.len(), 4);
30 }
31 #[test]
32 fn test_state_tomography_circuits() {
33 let tomo = StateTomography::new(2);
34 let circuits = tomo.measurement_circuits();
35 assert_eq!(circuits.len(), 9);
36 }
37 #[test]
38 #[ignore = "Skipping randomized benchmarking test"]
39 fn test_randomized_benchmarking() {
40 let rb = RandomizedBenchmarking::new(vec![QubitId::new(0)]);
41 let sequence = rb.generate_clifford_sequence(10);
42 assert!(!sequence.is_empty());
43 }
44 #[test]
45 fn test_drift_tracking() {
46 let mut tracker = DriftTracker::new(vec!["T1".to_string()]);
47 for i in 0..20 {
48 let value = 50.0 + (i as f64) * 0.1;
49 tracker.add_measurement("T1", i as f64, value);
50 }
51 let drift = tracker.detect_drift("T1", 5);
52 assert!(drift.is_some());
53 assert!(drift.expect("drift should be Some") > 0.0);
54 }
55}