quantrs2_core/error_correction/
ldpc.rs1use super::pauli::{Pauli, PauliString};
4use super::stabilizer::StabilizerCode;
5use crate::error::QuantRS2Result;
6
7#[derive(Debug, Clone)]
9pub struct QuantumLDPCCode {
10 pub n: usize,
12 pub k: usize,
14 pub max_weight: usize,
16 pub x_stabilizers: Vec<PauliString>,
18 pub z_stabilizers: Vec<PauliString>,
20}
21
22impl QuantumLDPCCode {
23 pub fn bicycle_code(a: usize, b: usize) -> Self {
25 let n = 2 * a * b;
26 let k = 2;
27 let max_weight = 6; let mut x_stabilizers = Vec::new();
30 let mut z_stabilizers = Vec::new();
31
32 for i in 0..a {
34 for j in 0..b {
35 let mut x_paulis = vec![Pauli::I; n];
37 let base_idx = i * b + j;
38
39 x_paulis[base_idx] = Pauli::X;
41 x_paulis[(base_idx + 1) % (a * b)] = Pauli::X;
42 x_paulis[(base_idx + b) % (a * b)] = Pauli::X;
43 x_paulis[a * b + base_idx] = Pauli::X;
44 x_paulis[a * b + (base_idx + 1) % (a * b)] = Pauli::X;
45 x_paulis[a * b + (base_idx + b) % (a * b)] = Pauli::X;
46
47 x_stabilizers.push(PauliString::new(x_paulis));
48
49 let mut z_paulis = vec![Pauli::I; n];
51 z_paulis[base_idx] = Pauli::Z;
52 z_paulis[(base_idx + a) % (a * b)] = Pauli::Z;
53 z_paulis[(base_idx + 1) % (a * b)] = Pauli::Z;
54 z_paulis[a * b + base_idx] = Pauli::Z;
55 z_paulis[a * b + (base_idx + a) % (a * b)] = Pauli::Z;
56 z_paulis[a * b + (base_idx + 1) % (a * b)] = Pauli::Z;
57
58 z_stabilizers.push(PauliString::new(z_paulis));
59 }
60 }
61
62 Self {
63 n,
64 k,
65 max_weight,
66 x_stabilizers,
67 z_stabilizers,
68 }
69 }
70
71 pub fn to_stabilizer_code(&self) -> QuantRS2Result<StabilizerCode> {
73 let mut stabilizers = self.x_stabilizers.clone();
74 stabilizers.extend(self.z_stabilizers.clone());
75
76 let logical_x = vec![
78 PauliString::new(vec![Pauli::X; self.n]),
79 PauliString::new(vec![Pauli::Y; self.n]),
80 ];
81 let logical_z = vec![
82 PauliString::new(vec![Pauli::Z; self.n]),
83 PauliString::new(vec![Pauli::Y; self.n]),
84 ];
85
86 StabilizerCode::new(
87 self.n,
88 self.k,
89 4, stabilizers,
91 logical_x,
92 logical_z,
93 )
94 }
95}