use super::field::Field;
#[derive(Debug, Clone)]
pub struct RLNCPacket<F: Field> {
pub coding_vector: Vec<F>,
pub data: Vec<F>,
}
impl<F: Field> RLNCPacket<F> {
pub fn degree(&self) -> usize {
self.coding_vector.iter().filter(|&c| !c.is_zero_vartime()).count()
}
pub fn leading_coefficient(&self) -> Option<usize> {
self.coding_vector.iter().position(|c| !c.is_zero_vartime())
}
pub fn normalize(&mut self) {
if let Some(col) = self.leading_coefficient() {
let inv = self.coding_vector[col].invert().unwrap();
for i in 0..self.coding_vector.len() {
self.coding_vector[i] = self.coding_vector[i] * inv;
}
for i in 0..self.data.len() {
self.data[i] = self.data[i] * inv;
}
}
}
pub fn subtract_row(&mut self, src: &Self, factor: F) {
for i in 0..self.coding_vector.len() {
self.coding_vector[i] -= factor * src.coding_vector[i];
}
for i in 0..self.data.len() {
self.data[i] -= factor * src.data[i];
}
}
}