From d1db3361406c9844bbc6d7d7ff3d9755d423e684 Mon Sep 17 00:00:00 2001 From: Martin Geisler Date: Sun, 9 Aug 2020 14:26:32 +0200 Subject: [PATCH 1/2] Use MongePrim::ConstantRows and ConstantCols in random_monge_matrix This fixes a warning that the enum values are never constructed. To avoid overflows, the constant value picked for the rows and columns is either zero or one. --- src/lib.rs | 51 +++++++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 90682b4..8f6840e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -479,12 +479,16 @@ impl MongePrim { match *self { MongePrim::ConstantRows => { for mut row in matrix.genrows_mut() { - row.fill(rng.gen()); + if rng.gen::() { + row.fill(T::one()) + } } } MongePrim::ConstantCols => { for mut col in matrix.gencolumns_mut() { - col.fill(rng.gen()); + if rng.gen::() { + col.fill(T::one()) + } } } MongePrim::UpperRightOnes => { @@ -508,13 +512,15 @@ pub fn random_monge_matrix(m: usize, n: usize, rng: &mut R) where Standard: Distribution, { + let monge_primitives = [ + MongePrim::ConstantRows, + MongePrim::ConstantCols, + MongePrim::LowerLeftOnes, + MongePrim::UpperRightOnes, + ]; let mut matrix = Array2::from_elem((m, n), T::zero()); for _ in 0..(m + n) { - let monge = if rng.gen::() { - MongePrim::LowerLeftOnes - } else { - MongePrim::UpperRightOnes - }; + let monge = monge_primitives[rng.gen_range(0, monge_primitives.len())]; matrix = matrix + monge.to_matrix(m, n, rng); } matrix @@ -523,7 +529,7 @@ where #[cfg(test)] mod tests { use super::*; - use ndarray::arr2; + use ndarray::{arr2, Array}; use rand::SeedableRng; use rand_chacha::ChaCha20Rng; @@ -543,16 +549,11 @@ mod tests { fn monge_constant_rows() { let mut rng = ChaCha20Rng::seed_from_u64(0); let matrix: Array2 = MongePrim::ConstantRows.to_matrix(5, 4, &mut rng); - assert_eq!( - matrix, - arr2(&[ - [178, 178, 178, 178], - [214, 214, 214, 214], - [168, 168, 168, 168], - [126, 126, 126, 126], - [192, 192, 192, 192], - ]) - ); + assert!(is_monge(&matrix)); + for row in matrix.genrows() { + let elem = row[0]; + assert_eq!(row, Array::from_elem(matrix.ncols(), elem)); + } } #[test] @@ -560,16 +561,10 @@ mod tests { let mut rng = ChaCha20Rng::seed_from_u64(0); let matrix: Array2 = MongePrim::ConstantCols.to_matrix(5, 4, &mut rng); assert!(is_monge(&matrix)); - assert_eq!( - matrix, - arr2(&[ - [178, 214, 168, 126], - [178, 214, 168, 126], - [178, 214, 168, 126], - [178, 214, 168, 126], - [178, 214, 168, 126] - ]) - ); + for column in matrix.gencolumns() { + let elem = column[0]; + assert_eq!(column, Array::from_elem(matrix.nrows(), elem)); + } } #[test] From fc40b919fa39521638ea281a85e91c1646ad85ff Mon Sep 17 00:00:00 2001 From: Martin Geisler Date: Sun, 9 Aug 2020 14:28:53 +0200 Subject: [PATCH 2/2] Remove unnecessary mut --- tests/complexity.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/complexity.rs b/tests/complexity.rs index 6f4cc7c..d69e2e8 100644 --- a/tests/complexity.rs +++ b/tests/complexity.rs @@ -58,7 +58,7 @@ fn online_linear_complexity() { let mut data = vec![]; for &size in &[1, 2, 3, 4, 5, 10, 15, 20, 30, 40, 50, 60, 70, 80, 90, 100] { - let mut matrix: Array2 = random_monge_matrix(size, size, &mut rng); + let matrix: Array2 = random_monge_matrix(size, size, &mut rng); let count = std::cell::RefCell::new(0); online_column_minima(0, size, |_, i, j| { *count.borrow_mut() += 1;