use super::pauli::{Pauli, PauliString};
use super::stabilizer::StabilizerCode;
use crate::error::QuantRS2Result;
#[derive(Debug, Clone)]
pub struct QuantumLDPCCode {
pub n: usize,
pub k: usize,
pub max_weight: usize,
pub x_stabilizers: Vec<PauliString>,
pub z_stabilizers: Vec<PauliString>,
}
impl QuantumLDPCCode {
pub fn bicycle_code(a: usize, b: usize) -> Self {
let n = 2 * a * b;
let k = 2;
let max_weight = 6;
let mut x_stabilizers = Vec::new();
let mut z_stabilizers = Vec::new();
for i in 0..a {
for j in 0..b {
let mut x_paulis = vec![Pauli::I; n];
let base_idx = i * b + j;
x_paulis[base_idx] = Pauli::X;
x_paulis[(base_idx + 1) % (a * b)] = Pauli::X;
x_paulis[(base_idx + b) % (a * b)] = Pauli::X;
x_paulis[a * b + base_idx] = Pauli::X;
x_paulis[a * b + (base_idx + 1) % (a * b)] = Pauli::X;
x_paulis[a * b + (base_idx + b) % (a * b)] = Pauli::X;
x_stabilizers.push(PauliString::new(x_paulis));
let mut z_paulis = vec![Pauli::I; n];
z_paulis[base_idx] = Pauli::Z;
z_paulis[(base_idx + a) % (a * b)] = Pauli::Z;
z_paulis[(base_idx + 1) % (a * b)] = Pauli::Z;
z_paulis[a * b + base_idx] = Pauli::Z;
z_paulis[a * b + (base_idx + a) % (a * b)] = Pauli::Z;
z_paulis[a * b + (base_idx + 1) % (a * b)] = Pauli::Z;
z_stabilizers.push(PauliString::new(z_paulis));
}
}
Self {
n,
k,
max_weight,
x_stabilizers,
z_stabilizers,
}
}
pub fn to_stabilizer_code(&self) -> QuantRS2Result<StabilizerCode> {
let mut stabilizers = self.x_stabilizers.clone();
stabilizers.extend(self.z_stabilizers.clone());
let logical_x = vec![
PauliString::new(vec![Pauli::X; self.n]),
PauliString::new(vec![Pauli::Y; self.n]),
];
let logical_z = vec![
PauliString::new(vec![Pauli::Z; self.n]),
PauliString::new(vec![Pauli::Y; self.n]),
];
StabilizerCode::new(
self.n,
self.k,
4, stabilizers,
logical_x,
logical_z,
)
}
}