Skip to main content

quantrs2_sim/circuit_interfaces/
functions.rs

1//! Auto-generated module
2//!
3//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
4
5use 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}