css_decoding/
css_decoding.rs1use 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}