use super::traits::DegreeSetGenerator;
use fountain_engine::CodeParams;
pub struct DeterministicDegreeSet {
params: CodeParams,
}
impl DeterministicDegreeSet {
pub fn new(params: &CodeParams) -> Self {
Self {
params: params.clone(),
}
}
}
impl DegreeSetGenerator for DeterministicDegreeSet {
fn degree_set(&mut self, coded_id: usize) -> (Vec<usize>, Vec<usize>) {
let active_indices = if coded_id < self.params.k {
vec![coded_id]
} else {
vec![coded_id % self.params.k]
};
(active_indices, vec![])
}
fn name(&self) -> &str {
"Deterministic"
}
}
pub struct FixedDegreeSet {
params: CodeParams,
degree: usize,
}
impl FixedDegreeSet {
pub fn new(params: &CodeParams, degree: usize) -> Self {
Self {
params: params.clone(),
degree,
}
}
}
impl DegreeSetGenerator for FixedDegreeSet {
fn degree_set(&mut self, coded_id: usize) -> (Vec<usize>, Vec<usize>) {
use rand::seq::SliceRandom;
use rand::{SeedableRng, rngs::StdRng};
let mut rng = StdRng::seed_from_u64(coded_id as u64);
let mut indices: Vec<usize> = (0..self.params.k).collect();
indices.shuffle(&mut rng);
indices.truncate(self.degree);
indices.sort();
(indices, vec![])
}
fn name(&self) -> &str {
"FixedDegree"
}
}
pub struct CustomTriangularDegreeSet {
params: CodeParams,
}
impl CustomTriangularDegreeSet {
pub fn new(params: &CodeParams) -> Self {
Self {
params: params.clone(),
}
}
}
impl DegreeSetGenerator for CustomTriangularDegreeSet {
fn degree_set(&mut self, coded_id: usize) -> (Vec<usize>, Vec<usize>) {
if coded_id == 0 {
return (vec![0], vec![]);
}
let degree = (coded_id % self.params.k).min(self.params.k - 1) + 1;
let mut indices = Vec::new();
for i in 0..degree {
indices.push(i);
}
(indices, vec![])
}
fn name(&self) -> &str {
"CustomTriangular"
}
}