quantrs2_sim/circuit_interfaces/
functions.rs1use super::types::{
6 CircuitInterface, CircuitInterfaceConfig, CircuitInterfaceUtils, InterfaceCircuit,
7 InterfaceGate, InterfaceGateType,
8};
9
10#[cfg(test)]
11mod tests {
12 use super::*;
13 use approx::assert_abs_diff_eq;
14 #[test]
15 fn test_interface_gate_creation() {
16 let gate = InterfaceGate::new(InterfaceGateType::Hadamard, vec![0]);
17 assert_eq!(gate.qubits, vec![0]);
18 assert!(gate.is_unitary());
19 assert!(!gate.is_measurement());
20 }
21 #[test]
22 fn test_measurement_gate() {
23 let gate = InterfaceGate::measurement(0, 0);
24 assert!(gate.is_measurement());
25 assert!(!gate.is_unitary());
26 assert_eq!(gate.classical_targets, vec![0]);
27 }
28 #[test]
29 fn test_circuit_creation() {
30 let mut circuit = InterfaceCircuit::new(3, 3);
31 circuit.add_gate(InterfaceGate::new(InterfaceGateType::Hadamard, vec![0]));
32 circuit.add_gate(InterfaceGate::new(InterfaceGateType::CNOT, vec![0, 1]));
33 assert_eq!(circuit.gates.len(), 2);
34 assert_eq!(circuit.calculate_depth(), 2);
35 }
36 #[test]
37 fn test_circuit_optimization() {
38 let mut circuit = InterfaceCircuit::new(2, 0);
39 circuit.add_gate(InterfaceGate::new(InterfaceGateType::PauliX, vec![0]));
40 circuit.add_gate(InterfaceGate::new(InterfaceGateType::PauliX, vec![0]));
41 circuit.add_gate(InterfaceGate::new(InterfaceGateType::Identity, vec![1]));
42 let result = circuit.optimize();
43 assert_eq!(result.gates_eliminated, 3);
44 }
45 #[test]
46 fn test_gate_unitary_matrices() {
47 let hadamard = InterfaceGate::new(InterfaceGateType::Hadamard, vec![0]);
48 let matrix = hadamard
49 .unitary_matrix()
50 .expect("should get Hadamard matrix");
51 let inv_sqrt2 = 1.0 / (2.0_f64).sqrt();
52 assert_abs_diff_eq!(matrix[[0, 0]].re, inv_sqrt2, epsilon = 1e-10);
53 assert_abs_diff_eq!(matrix[[1, 1]].re, -inv_sqrt2, epsilon = 1e-10);
54 }
55 #[test]
56 fn test_rotation_gate_merging() {
57 let mut circuit = InterfaceCircuit::new(1, 0);
58 circuit.add_gate(InterfaceGate::new(InterfaceGateType::RX(0.5), vec![0]));
59 circuit.add_gate(InterfaceGate::new(InterfaceGateType::RX(0.3), vec![0]));
60 let _ = circuit.optimize();
61 assert_eq!(circuit.gates.len(), 1);
62 if let InterfaceGateType::RX(angle) = &circuit.gates[0].gate_type {
63 assert_abs_diff_eq!(*angle, 0.8, epsilon = 1e-10);
64 } else {
65 panic!("Expected merged RX gate");
66 }
67 }
68 #[test]
69 fn test_circuit_interface_creation() {
70 let config = CircuitInterfaceConfig::default();
71 let _interface =
72 CircuitInterface::new(config.clone()).expect("should create circuit interface");
73 assert!(config.auto_backend_selection);
74 assert!(config.enable_optimization);
75 assert_eq!(config.max_statevector_qubits, 25);
76 }
77 #[test]
78 fn test_test_circuit_creation() {
79 let ghz_circuit = CircuitInterfaceUtils::create_test_circuit("ghz", 3);
80 assert_eq!(ghz_circuit.num_qubits, 3);
81 assert_eq!(ghz_circuit.gates.len(), 3);
82 let qft_circuit = CircuitInterfaceUtils::create_test_circuit("qft", 3);
83 assert!(qft_circuit.gates.len() > 3);
84 }
85 #[test]
86 fn test_circuit_metadata() {
87 let circuit = CircuitInterfaceUtils::create_test_circuit("ghz", 4);
88 assert_eq!(circuit.metadata.depth, 4);
89 assert_eq!(circuit.metadata.two_qubit_gates, 3);
90 }
91 #[test]
92 fn test_clifford_detection() {
93 let mut circuit = InterfaceCircuit::new(2, 0);
94 circuit.add_gate(InterfaceGate::new(InterfaceGateType::Hadamard, vec![0]));
95 circuit.add_gate(InterfaceGate::new(InterfaceGateType::CNOT, vec![0, 1]));
96 circuit.add_gate(InterfaceGate::new(InterfaceGateType::S, vec![1]));
97 let config = CircuitInterfaceConfig::default();
98 let interface = CircuitInterface::new(config).expect("should create circuit interface");
99 assert!(interface.is_clifford_circuit(&circuit));
100 circuit.add_gate(InterfaceGate::new(InterfaceGateType::T, vec![0]));
101 assert!(!interface.is_clifford_circuit(&circuit));
102 }
103}