believer 0.2.1

A toolbox to simulate error correcting code performance.
Documentation
use super::random_checks::Generator as RandomCheckGenerator;
use super::CodeGenerator;
use crate::ParityCheckMatrix;
use rand::Rng;

pub struct RegularLDPCCodeGenerator {
    bit_degree: usize,
    check_degree: usize,
    scale: usize,
    minimal_girth: usize,
}

impl CodeGenerator for RegularLDPCCodeGenerator {
    fn generate_with_rng<R: Rng>(&self, rng: &mut R) -> ParityCheckMatrix {
        let mut check_generator = RandomCheckGenerator::with_n_bits(self.n_bits())
            .with_random_number_generator(rng);
        check_generator
            .set_maximal_bit_degree(self.bit_degree)
            .set_minimal_girth(self.minimal_girth);
        let mut checks = Vec::with_capacity(self.n_checks());
        for _ in 0..self.n_checks() {
            let check = check_generator
                .set_target_check_degree(self.check_degree)
                .get_random_check();
            if let Some(check) = check { checks.push(check) }
        }
        ParityCheckMatrix::with_n_bits(self.n_bits()).with_checks(checks)
    }
}

impl RegularLDPCCodeGenerator {
    pub fn n_bits(&self) -> usize {
        (self.scale * self.check_degree) as usize
    }

    pub fn n_checks(&self) -> usize {
        (self.scale * self.bit_degree) as usize
    }

    pub fn new(bit_degree: usize, check_degree: usize, scale: usize, minimal_girth: usize) -> Self {
        Self {
            bit_degree,
            check_degree,
            scale,
            minimal_girth,
        }
    }
}