mirror of
https://github.com/cberner/raptorq.git
synced 2024-06-30 18:51:43 +00:00
Add ArrayMap class
Makes offset code easier to understand, and is more reusable as a HashMap replacement
This commit is contained in:
parent
e95315dc78
commit
1e8ac28bfe
28
src/arraymap.rs
Normal file
28
src/arraymap.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
pub struct ArrayMap<T> {
|
||||||
|
offset: usize,
|
||||||
|
elements: Vec<Option<T>>
|
||||||
|
}
|
||||||
|
|
||||||
|
impl <T: std::clone::Clone> ArrayMap<T> {
|
||||||
|
pub fn new(start_key: usize, end_key: usize) -> ArrayMap<T> {
|
||||||
|
ArrayMap {
|
||||||
|
offset: start_key,
|
||||||
|
elements: vec![None; end_key - start_key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn with_default(start_key: usize, end_key: usize, default_value: T) -> ArrayMap<T> {
|
||||||
|
ArrayMap {
|
||||||
|
offset: start_key,
|
||||||
|
elements: vec![Some(default_value); end_key - start_key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn insert(&mut self, key: usize, value: T) {
|
||||||
|
self.elements[key - self.offset] = Some(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get(&self, key: usize) -> T {
|
||||||
|
self.elements[key - self.offset].clone().unwrap()
|
||||||
|
}
|
||||||
|
}
|
@ -251,7 +251,7 @@ impl IntermediateSymbolDecoder {
|
|||||||
let mut chosen_hdpc = None;
|
let mut chosen_hdpc = None;
|
||||||
let mut chosen_non_hdpc = None;
|
let mut chosen_non_hdpc = None;
|
||||||
for row in self.i..self.L {
|
for row in self.i..self.L {
|
||||||
let non_zero = non_zero_counts[row - self.i];
|
let non_zero = non_zero_counts.get(row);
|
||||||
if non_zero == r as u32 {
|
if non_zero == r as u32 {
|
||||||
if hdpc_rows[row] {
|
if hdpc_rows[row] {
|
||||||
chosen_hdpc = Some(row);
|
chosen_hdpc = Some(row);
|
||||||
|
@ -2,6 +2,7 @@ extern crate petgraph;
|
|||||||
extern crate primal;
|
extern crate primal;
|
||||||
extern crate raptorq;
|
extern crate raptorq;
|
||||||
|
|
||||||
|
mod arraymap;
|
||||||
mod octets;
|
mod octets;
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
mod systematic_constants;
|
mod systematic_constants;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
extern crate petgraph;
|
extern crate petgraph;
|
||||||
extern crate primal;
|
extern crate primal;
|
||||||
|
|
||||||
|
mod arraymap;
|
||||||
mod systematic_constants;
|
mod systematic_constants;
|
||||||
mod rng;
|
mod rng;
|
||||||
mod octet;
|
mod octet;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
use std::ops::Mul;
|
use std::ops::Mul;
|
||||||
|
use arraymap::ArrayMap;
|
||||||
use octet::Octet;
|
use octet::Octet;
|
||||||
use octets::fused_addassign_mul_scalar;
|
use octets::fused_addassign_mul_scalar;
|
||||||
use octets::add_assign;
|
use octets::add_assign;
|
||||||
@ -75,11 +76,11 @@ impl OctetMatrix {
|
|||||||
// Helper method for decoder phase 1
|
// Helper method for decoder phase 1
|
||||||
// selects from [start_row, end_row) reading [start_col, end_col)
|
// selects from [start_row, end_row) reading [start_col, end_col)
|
||||||
// Returns (rows with two 1s, a row with two values > 1,
|
// Returns (rows with two 1s, a row with two values > 1,
|
||||||
// mapping from row number (offset by start_row) to number of non-zero values, "r" minimum positive number of non-zero values a row has)
|
// mapping from row number to number of non-zero values, "r" minimum positive number of non-zero values a row has)
|
||||||
pub fn first_phase_selection(&self, start_row: usize, end_row: usize, start_col: usize, end_col: usize) -> (Vec<usize>, Option<usize>, Vec<u32>, Option<u32>) {
|
pub fn first_phase_selection(&self, start_row: usize, end_row: usize, start_col: usize, end_col: usize) -> (Vec<usize>, Option<usize>, ArrayMap<u32>, Option<u32>) {
|
||||||
let mut rows_with_two_ones = vec![];
|
let mut rows_with_two_ones = vec![];
|
||||||
let mut row_with_two_greater_than_one = None;
|
let mut row_with_two_greater_than_one = None;
|
||||||
let mut non_zeros = vec![0; end_row - start_row];
|
let mut non_zeros = ArrayMap::with_default(start_row, end_row, 0);
|
||||||
let mut r = std::u32::MAX;
|
let mut r = std::u32::MAX;
|
||||||
for row in start_row..end_row {
|
for row in start_row..end_row {
|
||||||
let mut non_zero = 0;
|
let mut non_zero = 0;
|
||||||
@ -93,7 +94,7 @@ impl OctetMatrix {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if non_zero > 0 {
|
if non_zero > 0 {
|
||||||
non_zeros[row - start_row] = non_zero;
|
non_zeros.insert(row, non_zero);
|
||||||
if non_zero < r {
|
if non_zero < r {
|
||||||
r = non_zero;
|
r = non_zero;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user