quantrs2_sim/topological_quantum_simulation/
functions.rs1use scirs2_core::ndarray::{Array1, Array2, Array3, Array4, Axis};
6use scirs2_core::Complex64;
7
8use super::topologicalquantumsimulator_type::TopologicalQuantumSimulator;
9use super::types::{
10 AnyonType, BraidingType, FibonacciAnyons, IsingAnyons, LatticeType, TopologicalConfig,
11 TopologicalUtils,
12};
13
14pub trait AnyonModelImplementation {
16 fn get_anyon_types(&self) -> Vec<AnyonType>;
18 fn fusion_coefficients(&self, a: &AnyonType, b: &AnyonType, c: &AnyonType) -> Complex64;
20 fn braiding_matrix(&self, a: &AnyonType, b: &AnyonType) -> Array2<Complex64>;
22 fn f_matrix(
24 &self,
25 a: &AnyonType,
26 b: &AnyonType,
27 c: &AnyonType,
28 d: &AnyonType,
29 ) -> Array2<Complex64>;
30 fn is_abelian(&self) -> bool;
32 fn name(&self) -> &str;
34}
35#[cfg(test)]
36#[allow(clippy::field_reassign_with_default)]
37mod tests {
38 use super::*;
39 use approx::assert_abs_diff_eq;
40 #[test]
41 fn test_topological_config_default() {
42 let config = TopologicalConfig::default();
43 assert_eq!(config.lattice_type, LatticeType::SquareLattice);
44 assert_eq!(config.dimensions, vec![8, 8]);
45 assert!(config.topological_protection);
46 }
47 #[test]
48 fn test_anyon_type_creation() {
49 let vacuum = AnyonType::vacuum();
50 assert_eq!(vacuum.label, "vacuum");
51 assert_eq!(vacuum.quantum_dimension, 1.0);
52 assert!(vacuum.is_abelian);
53 let sigma = AnyonType::sigma();
54 assert_eq!(sigma.label, "sigma");
55 assert_abs_diff_eq!(sigma.quantum_dimension, 2.0_f64.sqrt(), epsilon = 1e-10);
56 assert!(!sigma.is_abelian);
57 }
58 #[test]
59 fn test_topological_simulator_creation() {
60 let config = TopologicalConfig::default();
61 let simulator = TopologicalQuantumSimulator::new(config);
62 assert!(simulator.is_ok());
63 }
64 #[test]
65 fn test_square_lattice_creation() {
66 let dimensions = vec![3, 3];
67 let lattice = TopologicalQuantumSimulator::create_square_lattice(&dimensions)
68 .expect("failed to create square lattice");
69 assert_eq!(lattice.sites.len(), 9);
70 assert_eq!(lattice.coordination_number, 4);
71 assert!(!lattice.bonds.is_empty());
72 assert!(!lattice.plaquettes.is_empty());
73 }
74 #[test]
75 fn test_anyon_placement() {
76 let config = TopologicalConfig::default();
77 let mut simulator =
78 TopologicalQuantumSimulator::new(config).expect("failed to create simulator");
79 let vacuum = AnyonType::vacuum();
80 let anyon_id = simulator
81 .place_anyon(vacuum, vec![2, 3])
82 .expect("failed to place anyon");
83 assert_eq!(anyon_id, 0);
84 assert_eq!(simulator.state.anyon_config.anyons.len(), 1);
85 assert_eq!(simulator.state.anyon_config.anyons[0].0, vec![2, 3]);
86 }
87 #[test]
88 fn test_braiding_operation() {
89 let mut config = TopologicalConfig::default();
90 config.enable_braiding = true;
91 let mut simulator =
92 TopologicalQuantumSimulator::new(config).expect("failed to create simulator");
93 let sigma = AnyonType::sigma();
94 let anyon_a = simulator
95 .place_anyon(sigma.clone(), vec![1, 1])
96 .expect("failed to place anyon A");
97 let anyon_b = simulator
98 .place_anyon(sigma, vec![2, 2])
99 .expect("failed to place anyon B");
100 let braiding_phase = simulator.braid_anyons(anyon_a, anyon_b, BraidingType::Clockwise);
101 assert!(braiding_phase.is_ok());
102 assert_eq!(simulator.braiding_history.len(), 1);
103 assert_eq!(simulator.stats.braiding_operations, 1);
104 }
105 #[test]
106 fn test_anyon_fusion() {
107 let config = TopologicalConfig::default();
108 let mut simulator =
109 TopologicalQuantumSimulator::new(config).expect("failed to create simulator");
110 let sigma = AnyonType::sigma();
111 let anyon_a = simulator
112 .place_anyon(sigma.clone(), vec![1, 1])
113 .expect("failed to place anyon A");
114 let anyon_b = simulator
115 .place_anyon(sigma, vec![1, 2])
116 .expect("failed to place anyon B");
117 let fusion_outcomes = simulator.fuse_anyons(anyon_a, anyon_b);
118 assert!(fusion_outcomes.is_ok());
119 }
120 #[test]
121 fn test_fibonacci_anyons() {
122 let fibonacci_model = FibonacciAnyons::new();
123 let anyon_types = fibonacci_model.get_anyon_types();
124 assert_eq!(anyon_types.len(), 2);
125 assert!(!fibonacci_model.is_abelian());
126 assert_eq!(fibonacci_model.name(), "Fibonacci Anyons");
127 }
128 #[test]
129 fn test_ising_anyons() {
130 let ising_model = IsingAnyons::new();
131 let anyon_types = ising_model.get_anyon_types();
132 assert_eq!(anyon_types.len(), 3);
133 assert!(!ising_model.is_abelian());
134 assert_eq!(ising_model.name(), "Ising Anyons");
135 }
136 #[test]
137 fn test_surface_code_creation() {
138 let dimensions = vec![4, 4];
139 let surface_code = TopologicalQuantumSimulator::create_toric_surface_code(&dimensions)
140 .expect("failed to create surface code");
141 assert_eq!(surface_code.distance, 4);
142 assert!(!surface_code.data_qubits.is_empty());
143 assert!(!surface_code.x_stabilizers.is_empty());
144 assert!(!surface_code.z_stabilizers.is_empty());
145 }
146 #[test]
147 fn test_topological_invariants() {
148 let config = TopologicalConfig::default();
149 let mut simulator =
150 TopologicalQuantumSimulator::new(config).expect("failed to create simulator");
151 let invariants = simulator.calculate_topological_invariants();
152 assert!(invariants.is_ok());
153 let inv = invariants.expect("failed to calculate invariants");
154 assert!(inv.chern_number.abs() >= 0);
155 assert!(inv.hall_conductivity.is_finite());
156 }
157 #[test]
158 fn test_triangular_lattice() {
159 let dimensions = vec![3, 3];
160 let lattice = TopologicalQuantumSimulator::create_triangular_lattice(&dimensions)
161 .expect("failed to create triangular lattice");
162 assert_eq!(lattice.lattice_type, LatticeType::TriangularLattice);
163 assert_eq!(lattice.sites.len(), 9);
164 assert_eq!(lattice.coordination_number, 6);
165 }
166 #[test]
167 fn test_honeycomb_lattice() {
168 let dimensions = vec![2, 2];
169 let lattice = TopologicalQuantumSimulator::create_honeycomb_lattice(&dimensions)
170 .expect("failed to create honeycomb lattice");
171 assert_eq!(lattice.lattice_type, LatticeType::HoneycombLattice);
172 assert_eq!(lattice.coordination_number, 3);
173 assert!(!lattice.bonds.is_empty());
174 }
175 #[test]
176 fn test_error_detection_and_correction() {
177 let mut config = TopologicalConfig::default();
178 config.topological_protection = true;
179 let mut simulator =
180 TopologicalQuantumSimulator::new(config).expect("failed to create simulator");
181 let syndrome = simulator.detect_and_correct_errors();
182 assert!(syndrome.is_ok());
183 }
184 #[test]
185 fn test_predefined_configs() {
186 let configs = vec!["toric_code", "fibonacci_system", "majorana_system"];
187 for config_type in configs {
188 let config = TopologicalUtils::create_predefined_config(config_type, 4);
189 let simulator = TopologicalQuantumSimulator::new(config);
190 assert!(simulator.is_ok());
191 }
192 }
193}