Skip to main content

quantrs2_sim/adaptive_gate_fusion/
functions.rs

1//! Auto-generated module
2//!
3//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
4
5#[cfg(feature = "advanced_math")]
6use quantrs2_circuit::prelude::*;
7
8use super::types::{
9    AdaptiveFusionConfig, AdaptiveGateFusion, FusedGateBlock, FusionStrategy, FusionUtils,
10    GateType, QuantumGate,
11};
12
13#[cfg(test)]
14mod tests {
15    use super::*;
16    use approx::assert_abs_diff_eq;
17    #[test]
18    fn test_quantum_gate_creation() {
19        let gate = QuantumGate::new(GateType::PauliX, vec![0], vec![]);
20        assert_eq!(gate.gate_type, GateType::PauliX);
21        assert_eq!(gate.qubits, vec![0]);
22        assert!(gate.cost > 0.0);
23    }
24    #[test]
25    fn test_gate_commutation() {
26        let gate1 = QuantumGate::new(GateType::PauliX, vec![0], vec![]);
27        let gate2 = QuantumGate::new(GateType::PauliY, vec![1], vec![]);
28        let gate3 = QuantumGate::new(GateType::PauliX, vec![0], vec![]);
29        assert!(gate1.commutes_with(&gate2));
30        assert!(gate1.commutes_with(&gate3));
31    }
32    #[test]
33    fn test_gate_fusion_compatibility() {
34        let gate1 = QuantumGate::new(GateType::RotationX, vec![0], vec![0.5]);
35        let gate2 = QuantumGate::new(GateType::RotationX, vec![0], vec![0.3]);
36        let gate3 = QuantumGate::new(GateType::RotationY, vec![1], vec![0.2]);
37        assert!(gate1.can_fuse_with(&gate2));
38        assert!(!gate1.can_fuse_with(&gate3));
39    }
40    #[test]
41    fn test_fused_gate_block() {
42        let gates = vec![
43            QuantumGate::new(GateType::RotationX, vec![0], vec![0.5]),
44            QuantumGate::new(GateType::RotationX, vec![0], vec![0.3]),
45        ];
46        let block =
47            FusedGateBlock::new(gates).expect("Fused gate block creation should succeed in test");
48        assert_eq!(block.qubits, vec![0]);
49        assert!(block.improvement_factor > 0.0);
50    }
51    #[test]
52    fn test_adaptive_fusion_config() {
53        let config = AdaptiveFusionConfig::default();
54        assert_eq!(config.strategy, FusionStrategy::Adaptive);
55        assert_eq!(config.max_fusion_size, 8);
56        assert!(config.enable_cross_qubit_fusion);
57    }
58    #[test]
59    fn test_circuit_analysis() {
60        let gates = FusionUtils::create_test_sequence("rotation_chain", 2);
61        let config = AdaptiveFusionConfig::default();
62        let mut fusion_engine =
63            AdaptiveGateFusion::new(config).expect("Fusion engine creation should succeed in test");
64        let analysis = fusion_engine
65            .analyze_circuit(&gates)
66            .expect("Circuit analysis should succeed in test");
67        assert_eq!(analysis.original_gate_count, gates.len());
68        assert!(!analysis.fusion_opportunities.is_empty());
69    }
70    #[test]
71    fn test_fusion_utils_test_sequences() {
72        let rotation_chain = FusionUtils::create_test_sequence("rotation_chain", 2);
73        assert_eq!(rotation_chain.len(), 6);
74        let cnot_ladder = FusionUtils::create_test_sequence("cnot_ladder", 3);
75        assert_eq!(cnot_ladder.len(), 2);
76        let mixed_gates = FusionUtils::create_test_sequence("mixed_gates", 2);
77        assert!(!mixed_gates.is_empty());
78    }
79    #[test]
80    fn test_fusion_potential_estimation() {
81        let gates = vec![
82            QuantumGate::new(GateType::RotationX, vec![0], vec![0.1]),
83            QuantumGate::new(GateType::RotationX, vec![0], vec![0.2]),
84            QuantumGate::new(GateType::RotationY, vec![1], vec![0.3]),
85        ];
86        let potential = FusionUtils::estimate_fusion_potential(&gates);
87        assert!(potential > 0.0);
88        assert!(potential <= 1.0);
89    }
90    #[test]
91    fn test_gate_matrix_generation() {
92        let pauli_x = QuantumGate::new(GateType::PauliX, vec![0], vec![]);
93        assert_eq!(pauli_x.matrix.shape(), &[2, 2]);
94        assert_abs_diff_eq!(pauli_x.matrix[[0, 1]].re, 1.0, epsilon = 1e-10);
95        assert_abs_diff_eq!(pauli_x.matrix[[1, 0]].re, 1.0, epsilon = 1e-10);
96    }
97    #[test]
98    fn test_circuit_depth_calculation() {
99        let gates = vec![
100            QuantumGate::new(GateType::Hadamard, vec![0], vec![]),
101            QuantumGate::new(GateType::CNOT, vec![0, 1], vec![]),
102            QuantumGate::new(GateType::RotationZ, vec![1], vec![0.5]),
103        ];
104        let config = AdaptiveFusionConfig::default();
105        let fusion_engine =
106            AdaptiveGateFusion::new(config).expect("Fusion engine creation should succeed in test");
107        let depth = fusion_engine.calculate_circuit_depth(&gates);
108        assert!(depth > 0);
109    }
110}