Add ArrayMap class

Makes offset code easier to understand, and is more reusable as a
HashMap replacement
This commit is contained in:
Christopher Berner 2019-02-10 13:44:51 -08:00
parent e95315dc78
commit 1e8ac28bfe
5 changed files with 36 additions and 5 deletions

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_non_hdpc = None;
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 hdpc_rows[row] {
chosen_hdpc = Some(row);

@ -2,6 +2,7 @@ extern crate petgraph;
extern crate primal;
extern crate raptorq;
mod arraymap;
mod octets;
#[allow(dead_code)]
mod systematic_constants;

@ -1,6 +1,7 @@
extern crate petgraph;
extern crate primal;
mod arraymap;
mod systematic_constants;
mod rng;
mod octet;

@ -1,4 +1,5 @@
use std::ops::Mul;
use arraymap::ArrayMap;
use octet::Octet;
use octets::fused_addassign_mul_scalar;
use octets::add_assign;
@ -75,11 +76,11 @@ impl OctetMatrix {
// Helper method for decoder phase 1
// selects from [start_row, end_row) reading [start_col, end_col)
// 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)
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>) {
// 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>, ArrayMap<u32>, Option<u32>) {
let mut rows_with_two_ones = vec![];
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;
for row in start_row..end_row {
let mut non_zero = 0;
@ -93,7 +94,7 @@ impl OctetMatrix {
}
}
if non_zero > 0 {
non_zeros[row - start_row] = non_zero;
non_zeros.insert(row, non_zero);
if non_zero < r {
r = non_zero;
}