diff --git a/src/arraymap.rs b/src/arraymap.rs new file mode 100644 index 0000000..514ce85 --- /dev/null +++ b/src/arraymap.rs @@ -0,0 +1,28 @@ +pub struct ArrayMap { + offset: usize, + elements: Vec> +} + +impl ArrayMap { + pub fn new(start_key: usize, end_key: usize) -> ArrayMap { + 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 { + 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() + } +} \ No newline at end of file diff --git a/src/base.rs b/src/base.rs index 578fd33..584729a 100644 --- a/src/base.rs +++ b/src/base.rs @@ -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); diff --git a/src/bin_matrix_sparsity.rs b/src/bin_matrix_sparsity.rs index 5eb7c37..4b6ea88 100644 --- a/src/bin_matrix_sparsity.rs +++ b/src/bin_matrix_sparsity.rs @@ -2,6 +2,7 @@ extern crate petgraph; extern crate primal; extern crate raptorq; +mod arraymap; mod octets; #[allow(dead_code)] mod systematic_constants; diff --git a/src/lib.rs b/src/lib.rs index 3f0edc8..c88525e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,7 @@ extern crate petgraph; extern crate primal; +mod arraymap; mod systematic_constants; mod rng; mod octet; diff --git a/src/matrix.rs b/src/matrix.rs index e77a417..6cab1fd 100644 --- a/src/matrix.rs +++ b/src/matrix.rs @@ -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, Option, Vec, Option) { + // 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, Option, ArrayMap, Option) { 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; }