use fountain_engine::types::CodeParams;
#[derive(Clone, Debug)]
pub enum ParamsConfig {
LT,
LDPCLT,
LDPCLTPreInactive,
HDPC,
ByName(String),
}
impl ParamsConfig {
pub fn generate(&self, k: usize) -> CodeParams {
match self {
ParamsConfig::LT => LTParams.generate(k),
ParamsConfig::LDPCLT => LDPCLTParams.generate(k),
ParamsConfig::LDPCLTPreInactive => LDPCLTParamsPreInactive.generate(k),
ParamsConfig::HDPC => HDPCParams.generate(k),
ParamsConfig::ByName(name) => create_params_by_name(name, k),
}
}
}
pub fn create_params_by_name(name: &str, k: usize) -> CodeParams {
match name.to_uppercase().as_str() {
"LT" => LTParams.generate(k),
"LDPC_LT" => LDPCLTParams.generate(k),
"LDPC_LT_PRE_INACTIVE" => LDPCLTParamsPreInactive.generate(k),
"HDPC" => HDPCParams.generate(k),
_ => panic!("Unknown parameter generator: {}", name),
}
}
pub trait ParamsGenerator {
fn generate(&self, k: usize) -> CodeParams;
fn name(&self) -> &str;
}
pub struct LTParams;
impl ParamsGenerator for LTParams {
fn generate(&self, k: usize) -> CodeParams {
CodeParams::new(k, k, 0, 0)
}
fn name(&self) -> &str {
"LT"
}
}
pub struct LDPCLTParams;
impl LDPCLTParams {
fn ldpc_num(k: usize) -> usize {
match k {
4..=10 => 1,
11..=20 => 2,
21..=30 => 3,
31..=50 => 5,
51..=70 => 7,
71..=110 => 11,
111..=130 => 13,
131..=170 => 17,
_ => (0.1 * k as f64).floor() as usize,
}
}
}
impl ParamsGenerator for LDPCLTParams {
fn generate(&self, k: usize) -> CodeParams {
CodeParams::new(k, k, Self::ldpc_num(k), 0)
}
fn name(&self) -> &str {
"LDPC_LT"
}
}
pub struct LDPCLTParamsPreInactive;
impl LDPCLTParamsPreInactive {
fn inactive_num(k: usize) -> usize {
match k {
0..=3 => 1,
4..=7 => 1,
8..=15 => 2,
16..=31 => 4,
32..=63 => 5,
64..=127 => 6,
_ => (k as f64).sqrt() as usize,
}
}
fn ldpc_num(k: usize) -> usize {
match k {
4..=20 => 2,
21..=30 => 3,
31..=50 => 5,
51..=70 => 7,
71..=110 => 11,
111..=130 => 13,
131..=170 => 17,
_ => (0.1 * k as f64).floor() as usize,
}
}
}
impl ParamsGenerator for LDPCLTParamsPreInactive {
fn generate(&self, k: usize) -> CodeParams {
CodeParams::new(k, k - Self::inactive_num(k), Self::ldpc_num(k), 0)
}
fn name(&self) -> &str {
"LDPC_LT_PRE_INACTIVE"
}
}
pub struct HDPCParams;
impl HDPCParams {
fn inactive_num(k: usize) -> usize {
match k {
0..=3 => 1,
4..=7 => 1,
8..=15 => 2,
16..=31 => 4,
32..=63 => 5,
64..=127 => 6,
_ => (k as f64).sqrt() as usize,
}
}
fn ldpc_num(k: usize) -> usize {
match k {
4..=10 => 1,
11..=20 => 2,
21..=30 => 3,
31..=50 => 5,
51..=70 => 7,
71..=110 => 11,
111..=130 => 13,
131..=170 => 17,
_ => (0.1 * k as f64).floor() as usize,
}
}
fn hdpc_num(k: usize) -> usize {
match k {
1..=20 => 2,
21..=30 => 4,
31..=50 => 6,
51..=70 => 8,
_ => 10,
}
}
}
impl ParamsGenerator for HDPCParams {
fn generate(&self, k: usize) -> CodeParams {
CodeParams::new(
k,
k - Self::inactive_num(k),
Self::ldpc_num(k),
Self::hdpc_num(k),
)
}
fn name(&self) -> &str {
"HDPC"
}
}