quantrs2_sim/adaptive_gate_fusion/
functions.rs1#[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}