diff --git a/src/algorithm/neighbour/fastpair.rs b/src/algorithm/neighbour/fastpair.rs index ab3c7a2..eca73ed 100644 --- a/src/algorithm/neighbour/fastpair.rs +++ b/src/algorithm/neighbour/fastpair.rs @@ -260,8 +260,8 @@ mod tests_fastpair { let distances = fastpair.distances; let neighbours = fastpair.neighbours; - assert!(distances.len() != 0); - assert!(neighbours.len() != 0); + assert!(!distances.is_empty()); + assert!(!neighbours.is_empty()); assert_eq!(10, neighbours.len()); assert_eq!(10, distances.len()); @@ -276,17 +276,13 @@ mod tests_fastpair { // We expect an error when we run `FastPair` on this dataset, // becuase `FastPair` currently only works on a minimum of 3 // points. - let _fastpair = FastPair::new(&dataset); + let fastpair = FastPair::new(&dataset); + assert!(fastpair.is_err()); - match _fastpair { - Err(e) => { - let expected_error = - Failed::because(FailedError::FindFailed, "min number of rows should be 3"); - assert_eq!(e, expected_error) - } - _ => { - assert!(false); - } + if let Err(e) = fastpair { + let expected_error = + Failed::because(FailedError::FindFailed, "min number of rows should be 3"); + assert_eq!(e, expected_error) } } @@ -582,7 +578,7 @@ mod tests_fastpair { }; for p in dissimilarities.iter() { if p.distance.unwrap() < min_dissimilarity.distance.unwrap() { - min_dissimilarity = p.clone() + min_dissimilarity = *p } } diff --git a/src/cluster/dbscan.rs b/src/cluster/dbscan.rs index 2887dc2..e9e3329 100644 --- a/src/cluster/dbscan.rs +++ b/src/cluster/dbscan.rs @@ -511,6 +511,6 @@ mod tests { .and_then(|dbscan| dbscan.predict(&x)) .unwrap(); - println!("{:?}", labels); + println!("{labels:?}"); } } diff --git a/src/cluster/kmeans.rs b/src/cluster/kmeans.rs index 18f8308..c2470ab 100644 --- a/src/cluster/kmeans.rs +++ b/src/cluster/kmeans.rs @@ -498,8 +498,8 @@ mod tests { let y: Vec = kmeans.predict(&x).unwrap(); - for i in 0..y.len() { - assert_eq!(y[i] as usize, kmeans._y[i]); + for (i, _y_i) in y.iter().enumerate() { + assert_eq!({ y[i] }, kmeans._y[i]); } } diff --git a/src/dataset/boston.rs b/src/dataset/boston.rs index f10db61..cc7a55b 100644 --- a/src/dataset/boston.rs +++ b/src/dataset/boston.rs @@ -31,7 +31,7 @@ use crate::dataset::Dataset; pub fn load_dataset() -> Dataset { let (x, y, num_samples, num_features) = match deserialize_data(std::include_bytes!("boston.xy")) { - Err(why) => panic!("Can't deserialize boston.xy. {}", why), + Err(why) => panic!("Can't deserialize boston.xy. {why}"), Ok((x, y, num_samples, num_features)) => (x, y, num_samples, num_features), }; diff --git a/src/dataset/breast_cancer.rs b/src/dataset/breast_cancer.rs index b88eaf9..c60da87 100644 --- a/src/dataset/breast_cancer.rs +++ b/src/dataset/breast_cancer.rs @@ -33,7 +33,7 @@ use crate::dataset::Dataset; pub fn load_dataset() -> Dataset { let (x, y, num_samples, num_features) = match deserialize_data(std::include_bytes!("breast_cancer.xy")) { - Err(why) => panic!("Can't deserialize breast_cancer.xy. {}", why), + Err(why) => panic!("Can't deserialize breast_cancer.xy. {why}"), Ok((x, y, num_samples, num_features)) => ( x, y.into_iter().map(|x| x as u32).collect(), diff --git a/src/dataset/diabetes.rs b/src/dataset/diabetes.rs index 0450522..faf169e 100644 --- a/src/dataset/diabetes.rs +++ b/src/dataset/diabetes.rs @@ -26,7 +26,7 @@ use crate::dataset::Dataset; pub fn load_dataset() -> Dataset { let (x, y, num_samples, num_features) = match deserialize_data(std::include_bytes!("diabetes.xy")) { - Err(why) => panic!("Can't deserialize diabetes.xy. {}", why), + Err(why) => panic!("Can't deserialize diabetes.xy. {why}"), Ok((x, y, num_samples, num_features)) => ( x, y.into_iter().map(|x| x as u32).collect(), diff --git a/src/dataset/digits.rs b/src/dataset/digits.rs index 6f081de..b3556e5 100644 --- a/src/dataset/digits.rs +++ b/src/dataset/digits.rs @@ -16,7 +16,7 @@ use crate::dataset::Dataset; pub fn load_dataset() -> Dataset { let (x, y, num_samples, num_features) = match deserialize_data(std::include_bytes!("digits.xy")) { - Err(why) => panic!("Can't deserialize digits.xy. {}", why), + Err(why) => panic!("Can't deserialize digits.xy. {why}"), Ok((x, y, num_samples, num_features)) => (x, y, num_samples, num_features), }; diff --git a/src/dataset/iris.rs b/src/dataset/iris.rs index 838f1ec..fe60241 100644 --- a/src/dataset/iris.rs +++ b/src/dataset/iris.rs @@ -22,7 +22,7 @@ use crate::dataset::Dataset; pub fn load_dataset() -> Dataset { let (x, y, num_samples, num_features): (Vec, Vec, usize, usize) = match deserialize_data(std::include_bytes!("iris.xy")) { - Err(why) => panic!("Can't deserialize iris.xy. {}", why), + Err(why) => panic!("Can't deserialize iris.xy. {why}"), Ok((x, y, num_samples, num_features)) => ( x, y.into_iter().map(|x| x as u32).collect(), diff --git a/src/dataset/mod.rs b/src/dataset/mod.rs index 855b288..d7d456c 100644 --- a/src/dataset/mod.rs +++ b/src/dataset/mod.rs @@ -78,7 +78,7 @@ pub(crate) fn serialize_data( .collect(); file.write_all(&y)?; } - Err(why) => panic!("couldn't create {}: {}", filename, why), + Err(why) => panic!("couldn't create {filename}: {why}"), } Ok(()) } diff --git a/src/decomposition/pca.rs b/src/decomposition/pca.rs index 20aee37..d4116ed 100644 --- a/src/decomposition/pca.rs +++ b/src/decomposition/pca.rs @@ -231,8 +231,7 @@ impl + SVDDecomposable + EVDDecomposable if parameters.n_components > n { return Err(Failed::fit(&format!( - "Number of components, n_components should be <= number of attributes ({})", - n + "Number of components, n_components should be <= number of attributes ({n})" ))); } @@ -374,21 +373,20 @@ mod tests { let parameters = PCASearchParameters { n_components: vec![2, 4], use_correlation_matrix: vec![true, false], - ..Default::default() }; let mut iter = parameters.into_iter(); let next = iter.next().unwrap(); assert_eq!(next.n_components, 2); - assert_eq!(next.use_correlation_matrix, true); + assert!(next.use_correlation_matrix); let next = iter.next().unwrap(); assert_eq!(next.n_components, 4); - assert_eq!(next.use_correlation_matrix, true); + assert!(next.use_correlation_matrix); let next = iter.next().unwrap(); assert_eq!(next.n_components, 2); - assert_eq!(next.use_correlation_matrix, false); + assert!(!next.use_correlation_matrix); let next = iter.next().unwrap(); assert_eq!(next.n_components, 4); - assert_eq!(next.use_correlation_matrix, false); + assert!(!next.use_correlation_matrix); assert!(iter.next().is_none()); } @@ -572,8 +570,8 @@ mod tests { epsilon = 1e-4 )); - for i in 0..pca.eigenvalues.len() { - assert!((pca.eigenvalues[i].abs() - expected_eigenvalues[i].abs()).abs() < 1e-8); + for (i, pca_eigenvalues_i) in pca.eigenvalues.iter().enumerate() { + assert!((pca_eigenvalues_i.abs() - expected_eigenvalues[i].abs()).abs() < 1e-8); } let us_arrests_t = pca.transform(&us_arrests).unwrap(); @@ -694,8 +692,8 @@ mod tests { epsilon = 1e-4 )); - for i in 0..pca.eigenvalues.len() { - assert!((pca.eigenvalues[i].abs() - expected_eigenvalues[i].abs()).abs() < 1e-8); + for (i, pca_eigenvalues_i) in pca.eigenvalues.iter().enumerate() { + assert!((pca_eigenvalues_i.abs() - expected_eigenvalues[i].abs()).abs() < 1e-8); } let us_arrests_t = pca.transform(&us_arrests).unwrap(); diff --git a/src/decomposition/svd.rs b/src/decomposition/svd.rs index dab7099..a82dfbd 100644 --- a/src/decomposition/svd.rs +++ b/src/decomposition/svd.rs @@ -180,8 +180,7 @@ impl + SVDDecomposable + EVDDecomposable if parameters.n_components >= p { return Err(Failed::fit(&format!( - "Number of components, n_components should be < number of attributes ({})", - p + "Number of components, n_components should be < number of attributes ({p})" ))); } @@ -202,8 +201,7 @@ impl + SVDDecomposable + EVDDecomposable let (p_c, k) = self.components.shape(); if p_c != p { return Err(Failed::transform(&format!( - "Can not transform a {}x{} matrix into {}x{} matrix, incorrect input dimentions", - n, p, n, k + "Can not transform a {n}x{p} matrix into {n}x{k} matrix, incorrect input dimentions" ))); } @@ -227,7 +225,6 @@ mod tests { fn search_parameters() { let parameters = SVDSearchParameters { n_components: vec![10, 100], - ..Default::default() }; let mut iter = parameters.into_iter(); let next = iter.next().unwrap(); diff --git a/src/error/mod.rs b/src/error/mod.rs index 1b240c2..5a99e85 100644 --- a/src/error/mod.rs +++ b/src/error/mod.rs @@ -98,7 +98,7 @@ impl fmt::Display for FailedError { FailedError::SolutionFailed => "Can't find solution", FailedError::ParametersError => "Error in input, check parameters", }; - write!(f, "{}", failed_err_str) + write!(f, "{failed_err_str}") } } diff --git a/src/lib.rs b/src/lib.rs index 03bfc03..136584e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,7 +3,8 @@ clippy::too_many_arguments, clippy::many_single_char_names, clippy::unnecessary_wraps, - clippy::upper_case_acronyms + clippy::upper_case_acronyms, + clippy::approx_constant )] #![warn(missing_docs)] #![warn(rustdoc::missing_doc_code_examples)] diff --git a/src/linalg/basic/arrays.rs b/src/linalg/basic/arrays.rs index 6c8c801..e11bb6c 100644 --- a/src/linalg/basic/arrays.rs +++ b/src/linalg/basic/arrays.rs @@ -548,7 +548,7 @@ pub trait ArrayView2: Array = (0..ncols).map(|c| *self.get((r, c))).collect(); - writeln!(f, "{:?}", row)? + writeln!(f, "{row:?}")? } Ok(()) } @@ -918,8 +918,7 @@ pub trait Array1: MutArrayView1 + Sized + let len = self.shape(); assert!( index.iter().all(|&i| i < len), - "All indices in `take` should be < {}", - len + "All indices in `take` should be < {len}" ); Self::from_iterator(index.iter().map(move |&i| *self.get(i)), index.len()) } @@ -990,10 +989,7 @@ pub trait Array1: MutArrayView1 + Sized + }; assert!( d1 == len, - "Can not multiply {}x{} matrix by {} vector", - nrows, - ncols, - len + "Can not multiply {nrows}x{ncols} matrix by {len} vector" ); let mut result = Self::zeros(d2); for i in 0..d2 { @@ -1111,11 +1107,7 @@ pub trait Array2: MutArrayView2 + Sized + assert!( nrows * ncols == onrows * oncols, - "Can't reshape {}x{} array into a {}x{} array", - onrows, - oncols, - nrows, - ncols + "Can't reshape {onrows}x{oncols} array into a {nrows}x{ncols} array" ); Self::from_iterator(self.iterator(0).cloned(), nrows, ncols, axis) @@ -1129,11 +1121,7 @@ pub trait Array2: MutArrayView2 + Sized + let (o_nrows, o_ncols) = other.shape(); assert!( ncols == o_nrows, - "Can't multiply {}x{} and {}x{} matrices", - nrows, - ncols, - o_nrows, - o_ncols + "Can't multiply {nrows}x{ncols} and {o_nrows}x{o_ncols} matrices" ); let inner_d = ncols; let mut result = Self::zeros(nrows, o_ncols); @@ -1166,7 +1154,7 @@ pub trait Array2: MutArrayView2 + Sized + _ => (nrows, ncols, o_nrows, o_ncols), }; if d1 != d4 { - panic!("Can not multiply {}x{} by {}x{} matrices", d2, d1, d4, d3); + panic!("Can not multiply {d2}x{d1} by {d4}x{d3} matrices"); } let mut result = Self::zeros(d2, d3); for r in 0..d2 { @@ -1198,10 +1186,7 @@ pub trait Array2: MutArrayView2 + Sized + }; assert!( d2 == len, - "Can not multiply {}x{} matrix by {} vector", - nrows, - ncols, - len + "Can not multiply {nrows}x{ncols} matrix by {len} vector" ); let mut result = Self::zeros(d1, 1); for i in 0..d1 { @@ -1432,8 +1417,7 @@ pub trait Array2: MutArrayView2 + Sized + 0 => { assert!( index.iter().all(|&i| i < nrows), - "All indices in `take` should be < {}", - nrows + "All indices in `take` should be < {nrows}" ); Self::from_iterator( index @@ -1448,8 +1432,7 @@ pub trait Array2: MutArrayView2 + Sized + _ => { assert!( index.iter().all(|&i| i < ncols), - "All indices in `take` should be < {}", - ncols + "All indices in `take` should be < {ncols}" ); Self::from_iterator( (0..nrows) @@ -1736,7 +1719,7 @@ mod tests { let r = Vec::::rand(4); assert!(r.iterator(0).all(|&e| e <= 1f32)); assert!(r.iterator(0).all(|&e| e >= 0f32)); - assert!(r.iterator(0).map(|v| *v).sum::() > 0f32); + assert!(r.iterator(0).copied().sum::() > 0f32); } #[test] @@ -1954,7 +1937,7 @@ mod tests { DenseMatrix::from_2d_array(&[&[1, 3], &[2, 4]]) ); assert_eq!( - DenseMatrix::concatenate_2d(&[&a.clone(), &b.clone()], 0), + DenseMatrix::concatenate_2d(&[&a, &b], 0), DenseMatrix::from_2d_array(&[&[1, 2], &[3, 4], &[5, 6], &[7, 8]]) ); assert_eq!( @@ -2025,7 +2008,7 @@ mod tests { let r = DenseMatrix::::rand(2, 2); assert!(r.iterator(0).all(|&e| e <= 1f32)); assert!(r.iterator(0).all(|&e| e >= 0f32)); - assert!(r.iterator(0).map(|v| *v).sum::() > 0f32); + assert!(r.iterator(0).copied().sum::() > 0f32); } #[test] diff --git a/src/linalg/basic/matrix.rs b/src/linalg/basic/matrix.rs index bde6b78..f21e04f 100644 --- a/src/linalg/basic/matrix.rs +++ b/src/linalg/basic/matrix.rs @@ -581,9 +581,9 @@ mod tests { vec![4, 5, 6], DenseMatrix::from_slice(&(*x.slice(1..2, 0..3))).values ); - let second_row: Vec = x.slice(1..2, 0..3).iterator(0).map(|x| *x).collect(); + let second_row: Vec = x.slice(1..2, 0..3).iterator(0).copied().collect(); assert_eq!(vec![4, 5, 6], second_row); - let second_col: Vec = x.slice(0..3, 1..2).iterator(0).map(|x| *x).collect(); + let second_col: Vec = x.slice(0..3, 1..2).iterator(0).copied().collect(); assert_eq!(vec![2, 5, 8], second_col); } @@ -640,12 +640,12 @@ mod tests { let x = DenseMatrix::<&str>::from_2d_array(&[&["1", "2", "3"], &["4", "5", "6"]]); assert_eq!(vec!["1", "4", "2", "5", "3", "6"], x.values); - assert!(x.column_major == true); + assert!(x.column_major); // transpose let x = x.transpose(); assert_eq!(vec!["1", "4", "2", "5", "3", "6"], x.values); - assert!(x.column_major == false); // should change column_major + assert!(!x.column_major); // should change column_major } #[test] @@ -659,7 +659,7 @@ mod tests { vec![1, 2, 3, 4, 5, 6], m.values.iter().map(|e| **e).collect::>() ); - assert!(m.column_major == false); + assert!(!m.column_major); } #[test] @@ -667,10 +667,10 @@ mod tests { let a = DenseMatrix::from_2d_array(&[&[1, 2, 3], &[4, 5, 6]]); let b = DenseMatrix::from_2d_array(&[&[1, 2], &[3, 4], &[5, 6]]); - println!("{}", a); + println!("{a}"); // take column 0 and 2 assert_eq!(vec![1, 3, 4, 6], a.take(&[0, 2], 1).values); - println!("{}", b); + println!("{b}"); // take rows 0 and 2 assert_eq!(vec![1, 2, 5, 6], b.take(&[0, 2], 0).values); } @@ -692,11 +692,11 @@ mod tests { let a = a.reshape(2, 6, 0); assert_eq!(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], a.values); - assert!(a.ncols == 6 && a.nrows == 2 && a.column_major == false); + assert!(a.ncols == 6 && a.nrows == 2 && !a.column_major); let a = a.reshape(3, 4, 1); assert_eq!(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], a.values); - assert!(a.ncols == 4 && a.nrows == 3 && a.column_major == true); + assert!(a.ncols == 4 && a.nrows == 3 && a.column_major); } #[test] diff --git a/src/linalg/basic/vector.rs b/src/linalg/basic/vector.rs index ea883c4..99da981 100644 --- a/src/linalg/basic/vector.rs +++ b/src/linalg/basic/vector.rs @@ -160,8 +160,8 @@ mod tests { fn dot_product>(v: &V) -> T { let vv = V::zeros(10); let v_s = vv.slice(0..3); - let dot = v_s.dot(v); - dot + + v_s.dot(v) } fn vector_ops>(_: &V) -> T { @@ -216,7 +216,7 @@ mod tests { #[test] fn test_mut_iterator() { let mut x = vec![1, 2, 3]; - x.iterator_mut(0).for_each(|v| *v = *v * 2); + x.iterator_mut(0).for_each(|v| *v *= 2); assert_eq!(vec![2, 4, 6], x); } diff --git a/src/linalg/ndarray/matrix.rs b/src/linalg/ndarray/matrix.rs index 5e0e285..adc8d7e 100644 --- a/src/linalg/ndarray/matrix.rs +++ b/src/linalg/ndarray/matrix.rs @@ -217,7 +217,7 @@ mod tests { fn test_iterator() { let a = arr2(&[[1, 2, 3], [4, 5, 6]]); - let v: Vec = a.iterator(0).map(|&v| v).collect(); + let v: Vec = a.iterator(0).copied().collect(); assert_eq!(v, vec!(1, 2, 3, 4, 5, 6)); } @@ -236,7 +236,7 @@ mod tests { let x = arr2(&[[1, 2, 3], [4, 5, 6]]); let x_slice = Array2::slice(&x, 0..2, 1..2); assert_eq!((2, 1), x_slice.shape()); - let v: Vec = x_slice.iterator(0).map(|&v| v).collect(); + let v: Vec = x_slice.iterator(0).copied().collect(); assert_eq!(v, [2, 5]); } @@ -245,11 +245,11 @@ mod tests { let x = arr2(&[[1, 2, 3], [4, 5, 6]]); let x_slice = Array2::slice(&x, 0..2, 0..3); assert_eq!( - x_slice.iterator(0).map(|&v| v).collect::>(), + x_slice.iterator(0).copied().collect::>(), vec![1, 2, 3, 4, 5, 6] ); assert_eq!( - x_slice.iterator(1).map(|&v| v).collect::>(), + x_slice.iterator(1).copied().collect::>(), vec![1, 4, 2, 5, 3, 6] ); } @@ -279,8 +279,8 @@ mod tests { fn test_c_from_iterator() { let data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; let a: NDArray2 = Array2::from_iterator(data.clone().into_iter(), 4, 3, 0); - println!("{}", a); + println!("{a}"); let a: NDArray2 = Array2::from_iterator(data.into_iter(), 4, 3, 1); - println!("{}", a); + println!("{a}"); } } diff --git a/src/linalg/ndarray/vector.rs b/src/linalg/ndarray/vector.rs index 302cdf6..7105da8 100644 --- a/src/linalg/ndarray/vector.rs +++ b/src/linalg/ndarray/vector.rs @@ -152,7 +152,7 @@ mod tests { fn test_iterator() { let a = arr1(&[1, 2, 3]); - let v: Vec = a.iterator(0).map(|&v| v).collect(); + let v: Vec = a.iterator(0).copied().collect(); assert_eq!(v, vec!(1, 2, 3)); } diff --git a/src/linalg/traits/evd.rs b/src/linalg/traits/evd.rs index c0a54df..ccbdded 100644 --- a/src/linalg/traits/evd.rs +++ b/src/linalg/traits/evd.rs @@ -66,7 +66,7 @@ pub trait EVDDecomposable: Array2 { fn evd_mut(mut self, symmetric: bool) -> Result, Failed> { let (nrows, ncols) = self.shape(); if ncols != nrows { - panic!("Matrix is not square: {} x {}", nrows, ncols); + panic!("Matrix is not square: {nrows} x {ncols}"); } let n = nrows; @@ -837,10 +837,8 @@ mod tests { evd.V.abs(), epsilon = 1e-4 )); - for i in 0..eigen_values.len() { - assert!((eigen_values[i] - evd.d[i]).abs() < 1e-4); - } - for i in 0..eigen_values.len() { + for (i, eigen_values_i) in eigen_values.iter().enumerate() { + assert!((eigen_values_i - evd.d[i]).abs() < 1e-4); assert!((0f64 - evd.e[i]).abs() < std::f64::EPSILON); } } @@ -871,10 +869,8 @@ mod tests { evd.V.abs(), epsilon = 1e-4 )); - for i in 0..eigen_values.len() { - assert!((eigen_values[i] - evd.d[i]).abs() < 1e-4); - } - for i in 0..eigen_values.len() { + for (i, eigen_values_i) in eigen_values.iter().enumerate() { + assert!((eigen_values_i - evd.d[i]).abs() < 1e-4); assert!((0f64 - evd.e[i]).abs() < std::f64::EPSILON); } } @@ -908,11 +904,11 @@ mod tests { evd.V.abs(), epsilon = 1e-4 )); - for i in 0..eigen_values_d.len() { - assert!((eigen_values_d[i] - evd.d[i]).abs() < 1e-4); + for (i, eigen_values_d_i) in eigen_values_d.iter().enumerate() { + assert!((eigen_values_d_i - evd.d[i]).abs() < 1e-4); } - for i in 0..eigen_values_e.len() { - assert!((eigen_values_e[i] - evd.e[i]).abs() < 1e-4); + for (i, eigen_values_e_i) in eigen_values_e.iter().enumerate() { + assert!((eigen_values_e_i - evd.e[i]).abs() < 1e-4); } } } diff --git a/src/linalg/traits/lu.rs b/src/linalg/traits/lu.rs index 020c271..1f0d5f4 100644 --- a/src/linalg/traits/lu.rs +++ b/src/linalg/traits/lu.rs @@ -126,7 +126,7 @@ impl> LU { let (m, n) = self.LU.shape(); if m != n { - panic!("Matrix is not square: {}x{}", m, n); + panic!("Matrix is not square: {m}x{n}"); } let mut inv = M::zeros(n, n); @@ -143,10 +143,7 @@ impl> LU { let (b_m, b_n) = b.shape(); if b_m != m { - panic!( - "Row dimensions do not agree: A is {} x {}, but B is {} x {}", - m, n, b_m, b_n - ); + panic!("Row dimensions do not agree: A is {m} x {n}, but B is {b_m} x {b_n}"); } if self.singular { diff --git a/src/linalg/traits/qr.rs b/src/linalg/traits/qr.rs index da13729..eb452e1 100644 --- a/src/linalg/traits/qr.rs +++ b/src/linalg/traits/qr.rs @@ -102,10 +102,7 @@ impl> QR { let (b_nrows, b_ncols) = b.shape(); if b_nrows != m { - panic!( - "Row dimensions do not agree: A is {} x {}, but B is {} x {}", - m, n, b_nrows, b_ncols - ); + panic!("Row dimensions do not agree: A is {m} x {n}, but B is {b_nrows} x {b_ncols}"); } if self.singular { diff --git a/src/linalg/traits/stats.rs b/src/linalg/traits/stats.rs index 3bd7042..052da47 100644 --- a/src/linalg/traits/stats.rs +++ b/src/linalg/traits/stats.rs @@ -286,7 +286,7 @@ mod tests { } { - let mut m = m.clone(); + let mut m = m; m.standard_scale_mut(&m.mean(1), &m.std(1), 1); assert_eq!(&m, &expected_1); } diff --git a/src/linalg/traits/svd.rs b/src/linalg/traits/svd.rs index 93c8d9a..8608942 100644 --- a/src/linalg/traits/svd.rs +++ b/src/linalg/traits/svd.rs @@ -509,8 +509,8 @@ mod tests { assert!(relative_eq!(V.abs(), svd.V.abs(), epsilon = 1e-4)); assert!(relative_eq!(U.abs(), svd.U.abs(), epsilon = 1e-4)); - for i in 0..s.len() { - assert!((s[i] - svd.s[i]).abs() < 1e-4); + for (i, s_i) in s.iter().enumerate() { + assert!((s_i - svd.s[i]).abs() < 1e-4); } } #[cfg_attr( @@ -713,8 +713,8 @@ mod tests { assert!(relative_eq!(V.abs(), svd.V.abs(), epsilon = 1e-4)); assert!(relative_eq!(U.abs(), svd.U.abs(), epsilon = 1e-4)); - for i in 0..s.len() { - assert!((s[i] - svd.s[i]).abs() < 1e-4); + for (i, s_i) in s.iter().enumerate() { + assert!((s_i - svd.s[i]).abs() < 1e-4); } } #[cfg_attr( diff --git a/src/linear/elastic_net.rs b/src/linear/elastic_net.rs index 7d57e1d..87deddc 100644 --- a/src/linear/elastic_net.rs +++ b/src/linear/elastic_net.rs @@ -425,10 +425,7 @@ impl, Y: Array1> for (i, col_std_i) in col_std.iter().enumerate() { if (*col_std_i - TX::zero()).abs() < TX::epsilon() { - return Err(Failed::fit(&format!( - "Cannot rescale constant column {}", - i - ))); + return Err(Failed::fit(&format!("Cannot rescale constant column {i}"))); } } diff --git a/src/linear/lasso.rs b/src/linear/lasso.rs index 150d5ca..8de391f 100644 --- a/src/linear/lasso.rs +++ b/src/linear/lasso.rs @@ -356,10 +356,7 @@ impl, Y: Array1> Las for (i, col_std_i) in col_std.iter().enumerate() { if (*col_std_i - TX::zero()).abs() < TX::epsilon() { - return Err(Failed::fit(&format!( - "Cannot rescale constant column {}", - i - ))); + return Err(Failed::fit(&format!("Cannot rescale constant column {i}"))); } } diff --git a/src/linear/logistic_regression.rs b/src/linear/logistic_regression.rs index 8bf65bf..044a771 100644 --- a/src/linear/logistic_regression.rs +++ b/src/linear/logistic_regression.rs @@ -449,8 +449,7 @@ impl, Y: match k.cmp(&2) { Ordering::Less => Err(Failed::fit(&format!( - "incorrect number of classes: {}. Should be >= 2.", - k + "incorrect number of classes: {k}. Should be >= 2." ))), Ordering::Equal => { let x0 = Vec::zeros(num_attributes + 1); @@ -636,19 +635,19 @@ mod tests { assert!((g[0] + 33.000068218163484).abs() < std::f64::EPSILON); - let f = objective.f(&vec![1., 2., 3., 4., 5., 6., 7., 8., 9.]); + let f = objective.f(&[1., 2., 3., 4., 5., 6., 7., 8., 9.]); assert!((f - 408.0052230582765).abs() < std::f64::EPSILON); let objective_reg = MultiClassObjectiveFunction { x: &x, - y: y.clone(), + y, k: 3, alpha: 1.0, _phantom_t: PhantomData, }; - let f = objective_reg.f(&vec![1., 2., 3., 4., 5., 6., 7., 8., 9.]); + let f = objective_reg.f(&[1., 2., 3., 4., 5., 6., 7., 8., 9.]); assert!((f - 487.5052).abs() < 1e-4); objective_reg.df(&mut g, &vec![1., 2., 3., 4., 5., 6., 7., 8., 9.]); @@ -697,18 +696,18 @@ mod tests { assert!((g[1] - 10.239000702928523).abs() < std::f64::EPSILON); assert!((g[2] - 3.869294270156324).abs() < std::f64::EPSILON); - let f = objective.f(&vec![1., 2., 3.]); + let f = objective.f(&[1., 2., 3.]); assert!((f - 59.76994756647412).abs() < std::f64::EPSILON); let objective_reg = BinaryObjectiveFunction { x: &x, - y: y.clone(), + y, alpha: 1.0, _phantom_t: PhantomData, }; - let f = objective_reg.f(&vec![1., 2., 3.]); + let f = objective_reg.f(&[1., 2., 3.]); assert!((f - 62.2699).abs() < 1e-4); objective_reg.df(&mut g, &vec![1., 2., 3.]); diff --git a/src/linear/ridge_regression.rs b/src/linear/ridge_regression.rs index 6bd5595..2cddb00 100644 --- a/src/linear/ridge_regression.rs +++ b/src/linear/ridge_regression.rs @@ -384,10 +384,7 @@ impl< for (i, col_std_i) in col_std.iter().enumerate() { if (*col_std_i - TX::zero()).abs() < TX::epsilon() { - return Err(Failed::fit(&format!( - "Cannot rescale constant column {}", - i - ))); + return Err(Failed::fit(&format!("Cannot rescale constant column {i}"))); } } diff --git a/src/metrics/cluster_hcv.rs b/src/metrics/cluster_hcv.rs index ad43c94..2be4a76 100644 --- a/src/metrics/cluster_hcv.rs +++ b/src/metrics/cluster_hcv.rs @@ -98,8 +98,8 @@ mod tests { let mut scores = HCVScore::new(); scores.compute(&v1, &v2); - assert!((0.2548 - scores.homogeneity.unwrap() as f64).abs() < 1e-4); - assert!((0.5440 - scores.completeness.unwrap() as f64).abs() < 1e-4); - assert!((0.3471 - scores.v_measure.unwrap() as f64).abs() < 1e-4); + assert!((0.2548 - scores.homogeneity.unwrap()).abs() < 1e-4); + assert!((0.5440 - scores.completeness.unwrap()).abs() < 1e-4); + assert!((0.3471 - scores.v_measure.unwrap()).abs() < 1e-4); } } diff --git a/src/metrics/cluster_helpers.rs b/src/metrics/cluster_helpers.rs index 47d8061..0711737 100644 --- a/src/metrics/cluster_helpers.rs +++ b/src/metrics/cluster_helpers.rs @@ -125,7 +125,7 @@ mod tests { fn entropy_test() { let v1 = vec![0, 0, 1, 1, 2, 0, 4]; - assert!((1.2770 - entropy(&v1).unwrap() as f64).abs() < 1e-4); + assert!((1.2770 - entropy(&v1).unwrap()).abs() < 1e-4); } #[cfg_attr( diff --git a/src/metrics/f1.rs b/src/metrics/f1.rs index 437863a..3ca58b8 100644 --- a/src/metrics/f1.rs +++ b/src/metrics/f1.rs @@ -95,8 +95,8 @@ mod tests { let score1: f64 = F1::new_with(beta).get_score(&y_true, &y_pred); let score2: f64 = F1::new_with(beta).get_score(&y_true, &y_true); - println!("{:?}", score1); - println!("{:?}", score2); + println!("{score1:?}"); + println!("{score2:?}"); assert!((score1 - 0.57142857).abs() < 1e-8); assert!((score2 - 1.0).abs() < 1e-8); diff --git a/src/model_selection/kfold.rs b/src/model_selection/kfold.rs index 680d2ac..760881b 100644 --- a/src/model_selection/kfold.rs +++ b/src/model_selection/kfold.rs @@ -213,17 +213,17 @@ mod tests { for t in &test_masks[0][0..11] { // TODO: this can be prob done better - assert_eq!(*t, true) + assert!(*t) } for t in &test_masks[0][11..22] { - assert_eq!(*t, false) + assert!(!*t) } for t in &test_masks[1][0..11] { - assert_eq!(*t, false) + assert!(!*t) } for t in &test_masks[1][11..22] { - assert_eq!(*t, true) + assert!(*t) } } diff --git a/src/model_selection/mod.rs b/src/model_selection/mod.rs index 222b9d7..27571fd 100644 --- a/src/model_selection/mod.rs +++ b/src/model_selection/mod.rs @@ -169,7 +169,7 @@ pub fn train_test_split< let n_test = ((n as f32) * test_size) as usize; if n_test < 1 { - panic!("number of sample is too small {}", n); + panic!("number of sample is too small {n}"); } let mut indices: Vec = (0..n).collect(); @@ -553,6 +553,6 @@ mod tests { &accuracy, ) .unwrap(); - println!("{:?}", results); + println!("{results:?}"); } } diff --git a/src/naive_bayes/bernoulli.rs b/src/naive_bayes/bernoulli.rs index 27731b2..52a3c52 100644 --- a/src/naive_bayes/bernoulli.rs +++ b/src/naive_bayes/bernoulli.rs @@ -271,21 +271,18 @@ impl BernoulliNBDistribution { let y_samples = y.shape(); if y_samples != n_samples { return Err(Failed::fit(&format!( - "Size of x should equal size of y; |x|=[{}], |y|=[{}]", - n_samples, y_samples + "Size of x should equal size of y; |x|=[{n_samples}], |y|=[{y_samples}]" ))); } if n_samples == 0 { return Err(Failed::fit(&format!( - "Size of x and y should greater than 0; |x|=[{}]", - n_samples + "Size of x and y should greater than 0; |x|=[{n_samples}]" ))); } if alpha < 0f64 { return Err(Failed::fit(&format!( - "Alpha should be greater than 0; |alpha|=[{}]", - alpha + "Alpha should be greater than 0; |alpha|=[{alpha}]" ))); } @@ -318,8 +315,7 @@ impl BernoulliNBDistribution { feature_in_class_counter[class_index][idx] += row_i.to_usize().ok_or_else(|| { Failed::fit(&format!( - "Elements of the matrix should be 1.0 or 0.0 |found|=[{}]", - row_i + "Elements of the matrix should be 1.0 or 0.0 |found|=[{row_i}]" )) })?; } diff --git a/src/naive_bayes/categorical.rs b/src/naive_bayes/categorical.rs index 970f799..2c0c7a4 100644 --- a/src/naive_bayes/categorical.rs +++ b/src/naive_bayes/categorical.rs @@ -158,8 +158,7 @@ impl CategoricalNBDistribution { pub fn fit, Y: Array1>(x: &X, y: &Y, alpha: f64) -> Result { if alpha < 0f64 { return Err(Failed::fit(&format!( - "alpha should be >= 0, alpha=[{}]", - alpha + "alpha should be >= 0, alpha=[{alpha}]" ))); } @@ -167,15 +166,13 @@ impl CategoricalNBDistribution { let y_samples = y.shape(); if y_samples != n_samples { return Err(Failed::fit(&format!( - "Size of x should equal size of y; |x|=[{}], |y|=[{}]", - n_samples, y_samples + "Size of x should equal size of y; |x|=[{n_samples}], |y|=[{y_samples}]" ))); } if n_samples == 0 { return Err(Failed::fit(&format!( - "Size of x and y should greater than 0; |x|=[{}]", - n_samples + "Size of x and y should greater than 0; |x|=[{n_samples}]" ))); } let y: Vec = y.iterator(0).map(|y_i| y_i.to_usize().unwrap()).collect(); @@ -202,8 +199,7 @@ impl CategoricalNBDistribution { .max() .ok_or_else(|| { Failed::fit(&format!( - "Failed to get the categories for feature = {}", - feature + "Failed to get the categories for feature = {feature}" )) })?; n_categories.push(feature_max + 1); @@ -429,7 +425,6 @@ mod tests { fn search_parameters() { let parameters = CategoricalNBSearchParameters { alpha: vec![1., 2.], - ..Default::default() }; let mut iter = parameters.into_iter(); let next = iter.next().unwrap(); diff --git a/src/naive_bayes/gaussian.rs b/src/naive_bayes/gaussian.rs index a9c1d4f..d72d27d 100644 --- a/src/naive_bayes/gaussian.rs +++ b/src/naive_bayes/gaussian.rs @@ -185,15 +185,13 @@ impl GaussianNBDistribution { let y_samples = y.shape(); if y_samples != n_samples { return Err(Failed::fit(&format!( - "Size of x should equal size of y; |x|=[{}], |y|=[{}]", - n_samples, y_samples + "Size of x should equal size of y; |x|=[{n_samples}], |y|=[{y_samples}]" ))); } if n_samples == 0 { return Err(Failed::fit(&format!( - "Size of x and y should greater than 0; |x|=[{}]", - n_samples + "Size of x and y should greater than 0; |x|=[{n_samples}]" ))); } let (class_labels, indices) = y.unique_with_indices(); @@ -375,7 +373,6 @@ mod tests { fn search_parameters() { let parameters = GaussianNBSearchParameters { priors: vec![Some(vec![1.]), Some(vec![2.])], - ..Default::default() }; let mut iter = parameters.into_iter(); let next = iter.next().unwrap(); diff --git a/src/naive_bayes/multinomial.rs b/src/naive_bayes/multinomial.rs index 4191106..a340c40 100644 --- a/src/naive_bayes/multinomial.rs +++ b/src/naive_bayes/multinomial.rs @@ -220,21 +220,18 @@ impl MultinomialNBDistribution { let y_samples = y.shape(); if y_samples != n_samples { return Err(Failed::fit(&format!( - "Size of x should equal size of y; |x|=[{}], |y|=[{}]", - n_samples, y_samples + "Size of x should equal size of y; |x|=[{n_samples}], |y|=[{y_samples}]" ))); } if n_samples == 0 { return Err(Failed::fit(&format!( - "Size of x and y should greater than 0; |x|=[{}]", - n_samples + "Size of x and y should greater than 0; |x|=[{n_samples}]" ))); } if alpha < 0f64 { return Err(Failed::fit(&format!( - "Alpha should be greater than 0; |alpha|=[{}]", - alpha + "Alpha should be greater than 0; |alpha|=[{alpha}]" ))); } @@ -266,8 +263,7 @@ impl MultinomialNBDistribution { feature_in_class_counter[class_index][idx] += row_i.to_usize().ok_or_else(|| { Failed::fit(&format!( - "Elements of the matrix should be convertible to usize |found|=[{}]", - row_i + "Elements of the matrix should be convertible to usize |found|=[{row_i}]" )) })?; } diff --git a/src/neighbors/knn_classifier.rs b/src/neighbors/knn_classifier.rs index 882ac55..a70a12e 100644 --- a/src/neighbors/knn_classifier.rs +++ b/src/neighbors/knn_classifier.rs @@ -236,8 +236,7 @@ impl, Y: Array1, D: Distance, Y: Array1, D: Distance>> if x_n != y_n { return Err(Failed::fit(&format!( - "Size of x should equal size of y; |x|=[{}], |y|=[{}]", - x_n, y_n + "Size of x should equal size of y; |x|=[{x_n}], |y|=[{y_n}]" ))); } diff --git a/src/optimization/first_order/gradient_descent.rs b/src/optimization/first_order/gradient_descent.rs index 5603a34..9cc78f0 100644 --- a/src/optimization/first_order/gradient_descent.rs +++ b/src/optimization/first_order/gradient_descent.rs @@ -113,12 +113,13 @@ mod tests { g[1] = 200. * (x[1] - x[0].powf(2.)); }; - let mut ls: Backtracking = Default::default(); - ls.order = FunctionOrder::THIRD; + let ls: Backtracking = Backtracking:: { + order: FunctionOrder::THIRD, + ..Default::default() + }; let optimizer: GradientDescent = Default::default(); let result = optimizer.optimize(&f, &df, &x0, &ls); - println!("{:?}", result); assert!((result.f_x - 0.0).abs() < 1e-5); assert!((result.x[0] - 1.0).abs() < 1e-2); diff --git a/src/optimization/first_order/lbfgs.rs b/src/optimization/first_order/lbfgs.rs index 3bd5f13..81e7b64 100644 --- a/src/optimization/first_order/lbfgs.rs +++ b/src/optimization/first_order/lbfgs.rs @@ -196,9 +196,9 @@ impl LBFGS { } /// - fn update_hessian<'a, T: FloatNumber, X: Array1>( + fn update_hessian>( &self, - _: &'a DF<'_, X>, + _: &DF<'_, X>, state: &mut LBFGSState, ) { state.dg = state.x_df.sub(&state.x_df_prev); @@ -291,8 +291,10 @@ mod tests { g[0] = -2. * (1. - x[0]) - 400. * (x[1] - x[0].powf(2.)) * x[0]; g[1] = 200. * (x[1] - x[0].powf(2.)); }; - let mut ls: Backtracking = Default::default(); - ls.order = FunctionOrder::THIRD; + let ls: Backtracking = Backtracking:: { + order: FunctionOrder::THIRD, + ..Default::default() + }; let optimizer: LBFGS = Default::default(); let result = optimizer.optimize(&f, &df, &x0, &ls); diff --git a/src/preprocessing/categorical.rs b/src/preprocessing/categorical.rs index 048dd26..933d7c2 100644 --- a/src/preprocessing/categorical.rs +++ b/src/preprocessing/categorical.rs @@ -132,8 +132,7 @@ impl OneHotEncoder { data.copy_col_as_vec(idx, &mut col_buf); if !validate_col_is_categorical(&col_buf) { let msg = format!( - "Column {} of data matrix containts non categorizable (integer) values", - idx + "Column {idx} of data matrix containts non categorizable (integer) values" ); return Err(Failed::fit(&msg[..])); } @@ -182,7 +181,7 @@ impl OneHotEncoder { match oh_vec { None => { // Since we support T types, bad value in a series causes in to be invalid - let msg = format!("At least one value in column {} doesn't conform to category definition", old_cidx); + let msg = format!("At least one value in column {old_cidx} doesn't conform to category definition"); return Err(Failed::transform(&msg[..])); } Some(v) => { @@ -338,11 +337,7 @@ mod tests { ]); let params = OneHotEncoderParams::from_cat_idx(&[1]); - match OneHotEncoder::fit(&m, params) { - Err(_) => { - assert!(true); - } - _ => assert!(false), - } + let result = OneHotEncoder::fit(&m, params); + assert!(result.is_err()); } } diff --git a/src/preprocessing/numerical.rs b/src/preprocessing/numerical.rs index 2e424e0..c673731 100644 --- a/src/preprocessing/numerical.rs +++ b/src/preprocessing/numerical.rs @@ -294,7 +294,7 @@ mod tests { &[0.5708488802, 0.1846414616, 0.9590802982, 0.5591871046], &[0.8387612750, 0.5754861361, 0.5537109852, 0.1077646442], ])); - println!("{}", transformed_values); + println!("{transformed_values}"); assert!(transformed_values.approximate_eq( &DenseMatrix::from_2d_array(&[ &[-1.1154020653, -0.4031985330, 0.9284605204, -0.4271473866], diff --git a/src/preprocessing/series_encoder.rs b/src/preprocessing/series_encoder.rs index 5d8b720..269ef2f 100644 --- a/src/preprocessing/series_encoder.rs +++ b/src/preprocessing/series_encoder.rs @@ -206,7 +206,7 @@ mod tests { #[test] fn from_categories() { let fake_categories: Vec = vec![1, 2, 3, 4, 5, 3, 5, 3, 1, 2, 4]; - let it = fake_categories.iter().map(|&a| a); + let it = fake_categories.iter().copied(); let enc = CategoryMapper::::fit_to_iter(it); let oh_vec: Vec = match enc.get_one_hot(&1) { None => panic!("Wrong categories"), @@ -218,8 +218,8 @@ mod tests { fn build_fake_str_enc<'a>() -> CategoryMapper<&'a str> { let fake_category_pos = vec!["background", "dog", "cat"]; - let enc = CategoryMapper::<&str>::from_positional_category_vec(fake_category_pos); - enc + + CategoryMapper::<&str>::from_positional_category_vec(fake_category_pos) } #[cfg_attr( all(target_arch = "wasm32", not(target_os = "wasi")), @@ -275,7 +275,7 @@ mod tests { let lab = enc.invert_one_hot(res).unwrap(); assert_eq!(lab, "dog"); if let Err(e) = enc.invert_one_hot(vec![0.0, 0.0, 0.0]) { - let pos_entries = format!("Expected a single positive entry, 0 entires found"); + let pos_entries = "Expected a single positive entry, 0 entires found".to_string(); assert_eq!(e, Failed::transform(&pos_entries[..])); }; } diff --git a/src/readers/csv.rs b/src/readers/csv.rs index 0b2c18c..730f293 100644 --- a/src/readers/csv.rs +++ b/src/readers/csv.rs @@ -167,7 +167,7 @@ where } /// Ensure that a string containing a csv row conforms to a specified row format. -fn validate_csv_row<'a>(row: &'a str, row_format: &CSVRowFormat<'_>) -> Result<(), ReadingError> { +fn validate_csv_row(row: &str, row_format: &CSVRowFormat<'_>) -> Result<(), ReadingError> { let actual_number_of_fields = row.split(row_format.field_seperator).count(); if row_format.n_fields == actual_number_of_fields { Ok(()) @@ -208,7 +208,7 @@ where match value_string.parse::().ok() { Some(value) => Ok(value), None => Err(ReadingError::InvalidField { - msg: format!("Value '{}' could not be read.", value_string,), + msg: format!("Value '{value_string}' could not be read.",), }), } } diff --git a/src/svm/svc.rs b/src/svm/svc.rs index 8cd5d5b..131f44c 100644 --- a/src/svm/svc.rs +++ b/src/svm/svc.rs @@ -983,11 +983,7 @@ mod tests { .unwrap(); let acc = accuracy(&y, &(y_hat.iter().map(|e| e.to_i32().unwrap()).collect())); - assert!( - acc >= 0.9, - "accuracy ({}) is not larger or equal to 0.9", - acc - ); + assert!(acc >= 0.9, "accuracy ({acc}) is not larger or equal to 0.9"); } #[cfg_attr( @@ -1076,11 +1072,7 @@ mod tests { let acc = accuracy(&y, &(y_hat.iter().map(|e| e.to_i32().unwrap()).collect())); - assert!( - acc >= 0.9, - "accuracy ({}) is not larger or equal to 0.9", - acc - ); + assert!(acc >= 0.9, "accuracy ({acc}) is not larger or equal to 0.9"); } #[cfg_attr( diff --git a/src/svm/svr.rs b/src/svm/svr.rs index bf53e72..6fbd15b 100644 --- a/src/svm/svr.rs +++ b/src/svm/svr.rs @@ -662,7 +662,7 @@ mod tests { .unwrap(); let t = mean_squared_error(&y_hat, &y); - println!("{:?}", t); + println!("{t:?}"); assert!(t < 2.5); } diff --git a/src/tree/decision_tree_classifier.rs b/src/tree/decision_tree_classifier.rs index cbce14e..95c1d89 100644 --- a/src/tree/decision_tree_classifier.rs +++ b/src/tree/decision_tree_classifier.rs @@ -560,8 +560,7 @@ impl, Y: Array1> let k = classes.len(); if k < 2 { return Err(Failed::fit(&format!( - "Incorrect number of classes: {}. Should be >= 2.", - k + "Incorrect number of classes: {k}. Should be >= 2." ))); } @@ -901,15 +900,13 @@ mod tests { )] #[test] fn gini_impurity() { + assert!((impurity(&SplitCriterion::Gini, &[7, 3], 10) - 0.42).abs() < std::f64::EPSILON); assert!( - (impurity(&SplitCriterion::Gini, &vec![7, 3], 10) - 0.42).abs() < std::f64::EPSILON - ); - assert!( - (impurity(&SplitCriterion::Entropy, &vec![7, 3], 10) - 0.8812908992306927).abs() + (impurity(&SplitCriterion::Entropy, &[7, 3], 10) - 0.8812908992306927).abs() < std::f64::EPSILON ); assert!( - (impurity(&SplitCriterion::ClassificationError, &vec![7, 3], 10) - 0.3).abs() + (impurity(&SplitCriterion::ClassificationError, &[7, 3], 10) - 0.3).abs() < std::f64::EPSILON ); }