Skip to main content

quantrs2_sim/topological_quantum_simulation/
functions.rs

1//! Auto-generated module
2//!
3//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
4
5use 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
14/// Trait for anyon model implementations
15pub trait AnyonModelImplementation {
16    /// Get anyon types for this model
17    fn get_anyon_types(&self) -> Vec<AnyonType>;
18    /// Compute fusion coefficients
19    fn fusion_coefficients(&self, a: &AnyonType, b: &AnyonType, c: &AnyonType) -> Complex64;
20    /// Compute braiding matrix
21    fn braiding_matrix(&self, a: &AnyonType, b: &AnyonType) -> Array2<Complex64>;
22    /// Compute F-matrix
23    fn f_matrix(
24        &self,
25        a: &AnyonType,
26        b: &AnyonType,
27        c: &AnyonType,
28        d: &AnyonType,
29    ) -> Array2<Complex64>;
30    /// Check if model is Abelian
31    fn is_abelian(&self) -> bool;
32    /// Get model name
33    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}