css_decoding/
css_decoding.rs

1use ldpc::codes::{CssCode, LinearCode};
2use ldpc::decoders::{BpDecoder, CssDecoder, SyndromeDecoder};
3use ldpc::noise::{DepolarizingNoise, Probability};
4use pauli::PauliOperator;
5use rand::thread_rng;
6
7fn main() {
8    let max_iterations = 100;
9    let probability = Probability::new(0.01);
10    let code = code();
11    let decoder = decoder(&code, probability, max_iterations);
12    let noise = DepolarizingNoise::with_probability(probability);
13    let mut failures = 0;
14    for _ in 0..1000 {
15        let error = code.random_error(&noise, &mut thread_rng());
16        let syndrome = code.syndrome_of(&error);
17        let correction: PauliOperator = decoder.correction_for(syndrome.as_view()).into();
18        if !code.has_stabilizer(&(&error * &correction)) {
19            failures += 1;
20        }
21    }
22    println!("{}", failures);
23}
24
25fn code() -> CssCode {
26    let code = LinearCode::random_regular_code()
27        .num_bits(20)
28        .num_checks(15)
29        .bit_degree(3)
30        .check_degree(4)
31        .sample_with(&mut thread_rng())
32        .unwrap();
33    CssCode::hypergraph_product(&code, &code)
34}
35
36fn decoder(
37    code: &CssCode,
38    probability: Probability,
39    max_iterations: usize,
40) -> CssDecoder<BpDecoder> {
41    CssDecoder {
42        x: BpDecoder::new(&code.stabilizers.x, probability, max_iterations),
43        z: BpDecoder::new(&code.stabilizers.z, probability, max_iterations),
44    }
45}