From 4adb8643282d5462cd84c369562082ca083e2600 Mon Sep 17 00:00:00 2001 From: skewballfox Date: Fri, 23 Dec 2022 13:01:56 -0600 Subject: [PATCH 01/10] undoing last few changes, then reapplying --- .github/workflows/ci.yml | 2 +- src/zip/mod.rs | 62 +++++++++++++++++++++------------------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1c76bd9d1..29efd39eb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: - stable - beta - nightly - - 1.51.0 # MSRV + - 1.59.0 # MSRV steps: - uses: actions/checkout@v2 diff --git a/src/zip/mod.rs b/src/zip/mod.rs index a6cd0c1fe..5fc449e4b 100644 --- a/src/zip/mod.rs +++ b/src/zip/mod.rs @@ -14,16 +14,16 @@ mod ndproducer; use std::mem::MaybeUninit; use crate::imp_prelude::*; +use crate::partial::Partial; use crate::AssignElem; use crate::IntoDimension; use crate::Layout; -use crate::partial::Partial; -use crate::indexes::{indices, Indices}; -use crate::split_at::{SplitPreference, SplitAt}; use crate::dimension; +use crate::indexes::{indices, Indices}; +use crate::split_at::{SplitAt, SplitPreference}; -pub use self::ndproducer::{NdProducer, IntoNdProducer, Offset}; +pub use self::ndproducer::{IntoNdProducer, NdProducer, Offset}; /// Return if the expression is a break value. macro_rules! fold_while { @@ -91,6 +91,7 @@ where D: Dimension, { type Output = ArrayView<'a, A, E::Dim>; + #[allow(clippy::needless_borrow, unconditional_recursion)] fn broadcast_unwrap(self, shape: E) -> Self::Output { let res: ArrayView<'_, A, E::Dim> = (&self).broadcast_unwrap(shape.into_dimension()); unsafe { ArrayView::new(res.ptr, res.dim, res.strides) } @@ -196,7 +197,6 @@ pub struct Zip { layout_tendency: i32, } - impl Zip<(P,), D> where D: Dimension, @@ -256,7 +256,6 @@ where ); } - impl Zip where D: Dimension, @@ -274,8 +273,8 @@ where } fn prefer_f(&self) -> bool { - !self.layout.is(Layout::CORDER) && - (self.layout.is(Layout::FORDER) || self.layout_tendency < 0) + !self.layout.is(Layout::CORDER) + && (self.layout.is(Layout::FORDER) || self.layout_tendency < 0) } /// Return an *approximation* to the max stride axis; if @@ -283,16 +282,14 @@ where /// others. fn max_stride_axis(&self) -> Axis { let i = if self.prefer_f() { - self - .dimension + self.dimension .slice() .iter() .rposition(|&len| len > 1) .unwrap_or(self.dimension.ndim() - 1) } else { /* corder or default */ - self - .dimension + self.dimension .slice() .iter() .position(|&len| len > 1) @@ -329,9 +326,7 @@ where let size = self.dimension.size(); let ptrs = self.parts.as_ptr(); let inner_strides = self.parts.contiguous_stride(); - unsafe { - self.inner(acc, ptrs, inner_strides, size, &mut function) - } + unsafe { self.inner(acc, ptrs, inner_strides, size, &mut function) } } /// The innermost loop of the Zip for_each methods @@ -342,11 +337,17 @@ where /// `strides`: strides for the elements in this stretch /// `len`: number of elements /// `function`: closure - unsafe fn inner(&self, mut acc: Acc, ptr: P::Ptr, strides: P::Stride, - len: usize, function: &mut F) -> FoldWhile + unsafe fn inner( + &self, + mut acc: Acc, + ptr: P::Ptr, + strides: P::Stride, + len: usize, + function: &mut F, + ) -> FoldWhile where F: FnMut(Acc, P::Item) -> FoldWhile, - P: ZippableTuple + P: ZippableTuple, { let mut i = 0; while i < len { @@ -357,7 +358,6 @@ where FoldWhile::Continue(acc) } - fn for_each_core_strided(&mut self, acc: Acc, function: F) -> FoldWhile where F: FnMut(Acc, P::Item) -> FoldWhile, @@ -414,7 +414,8 @@ where loop { unsafe { let ptr = self.parts.uget_ptr(&index); - acc = fold_while![self.inner(acc, ptr, inner_strides, inner_len, &mut function)]; + acc = + fold_while![self.inner(acc, ptr, inner_strides, inner_len, &mut function)]; } if !self.dimension.next_for_f(&mut index) { @@ -426,8 +427,7 @@ where } #[cfg(feature = "rayon")] - pub(crate) fn uninitialized_for_current_layout(&self) -> Array, D> - { + pub(crate) fn uninitialized_for_current_layout(&self) -> Array, D> { let is_f = self.prefer_f(); Array::uninit(self.dimension.clone().set_f(is_f)) } @@ -436,23 +436,27 @@ where impl Zip<(P1, P2), D> where D: Dimension, - P1: NdProducer, - P1: NdProducer, + P1: NdProducer, + P1: NdProducer, { /// Debug assert traversal order is like c (including 1D case) // Method placement: only used for binary Zip at the moment. #[inline] pub(crate) fn debug_assert_c_order(self) -> Self { - debug_assert!(self.layout.is(Layout::CORDER) || self.layout_tendency >= 0 || - self.dimension.slice().iter().filter(|&&d| d > 1).count() <= 1, - "Assertion failed: traversal is not c-order or 1D for \ + debug_assert!( + self.layout.is(Layout::CORDER) + || self.layout_tendency >= 0 + || self.dimension.slice().iter().filter(|&&d| d > 1).count() <= 1, + "Assertion failed: traversal is not c-order or 1D for \ layout {:?}, tendency {}, dimension {:?}", - self.layout, self.layout_tendency, self.dimension); + self.layout, + self.layout_tendency, + self.dimension + ); self } } - /* trait Offset : Copy { unsafe fn offset(self, off: isize) -> Self; From 5421b3039c5affec67b7426608642dc2db3fc3d6 Mon Sep 17 00:00:00 2001 From: skewballfox Date: Fri, 23 Dec 2022 13:12:07 -0600 Subject: [PATCH 02/10] reran cargo clippy --fix --no-deps, discarding potentially incorrect changes --- src/dimension/dimension_trait.rs | 6 +++--- src/dimension/dynindeximpl.rs | 2 +- src/dimension/mod.rs | 2 +- src/impl_methods.rs | 2 +- src/indexes.rs | 4 ++-- src/iterators/mod.rs | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/dimension/dimension_trait.rs b/src/dimension/dimension_trait.rs index 6ebb9cad4..7181d2268 100644 --- a/src/dimension/dimension_trait.rs +++ b/src/dimension/dimension_trait.rs @@ -83,7 +83,7 @@ pub trait Dimension: /// Compute the size of the dimension (number of elements) fn size(&self) -> usize { - self.slice().iter().fold(1, |s, &a| s * a as usize) + self.slice().iter().product() } /// Compute the size while checking for overflow. @@ -603,7 +603,7 @@ impl Dimension for Dim<[Ix; 2]> { fn size_checked(&self) -> Option { let m = get!(self, 0); let n = get!(self, 1); - (m as usize).checked_mul(n as usize) + m.checked_mul(n) } #[inline] @@ -728,7 +728,7 @@ impl Dimension for Dim<[Ix; 3]> { let m = get!(self, 0); let n = get!(self, 1); let o = get!(self, 2); - m as usize * n as usize * o as usize + m * n * o } #[inline] diff --git a/src/dimension/dynindeximpl.rs b/src/dimension/dynindeximpl.rs index 85b34bdbe..e81bf4f3d 100644 --- a/src/dimension/dynindeximpl.rs +++ b/src/dimension/dynindeximpl.rs @@ -96,7 +96,7 @@ impl PartialEq for IxDynRepr { match (self, rhs) { (&IxDynRepr::Inline(slen, ref sarr), &IxDynRepr::Inline(rlen, ref rarr)) => { slen == rlen - && (0..CAP as usize) + && (0..CAP) .filter(|&i| i < slen as usize) .all(|i| sarr[i] == rarr[i]) } diff --git a/src/dimension/mod.rs b/src/dimension/mod.rs index dd34052ec..6755efeb7 100644 --- a/src/dimension/mod.rs +++ b/src/dimension/mod.rs @@ -47,7 +47,7 @@ mod sequence; /// Calculate offset from `Ix` stride converting sign properly #[inline(always)] pub fn stride_offset(n: Ix, stride: Ix) -> isize { - (n as isize) * ((stride as Ixs) as isize) + (n as isize) * (stride as Ixs) } /// Check whether the given `dim` and `stride` lead to overlapping indices diff --git a/src/impl_methods.rs b/src/impl_methods.rs index 115cd2d71..4a6b42223 100644 --- a/src/impl_methods.rs +++ b/src/impl_methods.rs @@ -1990,7 +1990,7 @@ where let strides = unlimited_transmute::(self.strides); return Ok(ArrayBase::from_data_ptr(self.data, self.ptr) .with_strides_dim(strides, dim)); - } else if D::NDIM == None || D2::NDIM == None { // one is dynamic dim + } else if D::NDIM.is_none() || D2::NDIM.is_none() { // one is dynamic dim // safe because dim, strides are equivalent under a different type if let Some(dim) = D2::from_dimension(&self.dim) { if let Some(strides) = D2::from_dimension(&self.strides) { diff --git a/src/indexes.rs b/src/indexes.rs index 23ae2744c..541570184 100644 --- a/src/indexes.rs +++ b/src/indexes.rs @@ -75,7 +75,7 @@ where .slice() .iter() .zip(ix.slice().iter()) - .fold(0, |s, (&a, &b)| s + a as usize * b as usize); + .fold(0, |s, (&a, &b)| s + a * b); self.dim.size() - gone } }; @@ -286,7 +286,7 @@ where .slice() .iter() .zip(self.index.slice().iter()) - .fold(0, |s, (&a, &b)| s + a as usize * b as usize); + .fold(0, |s, (&a, &b)| s + a * b); let l = self.dim.size() - gone; (l, Some(l)) } diff --git a/src/iterators/mod.rs b/src/iterators/mod.rs index 85da56fe5..063b22053 100644 --- a/src/iterators/mod.rs +++ b/src/iterators/mod.rs @@ -114,7 +114,7 @@ impl ExactSizeIterator for Baseiter { .slice() .iter() .zip(ix.slice().iter()) - .fold(0, |s, (&a, &b)| s + a as usize * b as usize); + .fold(0, |s, (&a, &b)| s + a * b); self.dim.size() - gone } } From 585ef6f0ebab86ac1c229e7b4cd65ee7f8cf461a Mon Sep 17 00:00:00 2001 From: skewballfox Date: Fri, 23 Dec 2022 13:24:48 -0600 Subject: [PATCH 03/10] applying changes from `clippy fix` --- src/dimension/broadcast.rs | 2 +- tests/array-construct.rs | 2 +- tests/ixdyn.rs | 2 +- tests/oper.rs | 26 +++++++++++++------------- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/dimension/broadcast.rs b/src/dimension/broadcast.rs index dc1513f04..be279ddff 100644 --- a/src/dimension/broadcast.rs +++ b/src/dimension/broadcast.rs @@ -104,7 +104,7 @@ mod tests { D1: Dimension + DimMax, D2: Dimension, { - let d = co_broadcast::>::Output>(&d1, d2); + let d = co_broadcast::>::Output>(d1, d2); assert_eq!(d, r); } test_co(&Dim([2, 3]), &Dim([4, 1, 3]), Ok(Dim([4, 2, 3]))); diff --git a/tests/array-construct.rs b/tests/array-construct.rs index c8948d1a3..b326f9656 100644 --- a/tests/array-construct.rs +++ b/tests/array-construct.rs @@ -153,7 +153,7 @@ fn deny_wraparound_from_vec() { let five_large = Array::from_shape_vec((3, 7, 29, 36760123, 823996703), five.clone()); println!("{:?}", five_large); assert!(five_large.is_err()); - let six = Array::from_shape_vec(6, five.clone()); + let six = Array::from_shape_vec(6, five); assert!(six.is_err()); } diff --git a/tests/ixdyn.rs b/tests/ixdyn.rs index 11af2c97a..ca1dfb5e7 100644 --- a/tests/ixdyn.rs +++ b/tests/ixdyn.rs @@ -109,7 +109,7 @@ fn test_ixdyn_uget() { fn test_0() { let mut a = Array::zeros(vec![]); let z = vec![].into_dimension(); - assert_eq!(a[z.clone()], 0.); + assert_eq!(a[z], 0.); a[[]] = 1.; assert_eq!(a[[]], 1.); assert_eq!(a.len(), 1); diff --git a/tests/oper.rs b/tests/oper.rs index 051728680..0451dfc04 100644 --- a/tests/oper.rs +++ b/tests/oper.rs @@ -30,7 +30,7 @@ fn test_oper(op: &str, a: &[f32], b: &[f32], c: &[f32]) { let aa = aa.reshape(dim); let bb = bb.reshape(dim); let cc = cc.reshape(dim); - test_oper_arr::(op, aa.clone(), bb.clone(), cc.clone()); + test_oper_arr::(op, aa, bb, cc); } @@ -170,24 +170,24 @@ fn dot_product() { for i in 1..max { let a1 = a.slice(s![i..]); let b1 = b.slice(s![i..]); - assert_abs_diff_eq!(a1.dot(&b1), reference_dot(&a1, &b1), epsilon = 1e-5); + assert_abs_diff_eq!(a1.dot(&b1), reference_dot(a1, b1), epsilon = 1e-5); let a2 = a.slice(s![..-i]); let b2 = b.slice(s![i..]); - assert_abs_diff_eq!(a2.dot(&b2), reference_dot(&a2, &b2), epsilon = 1e-5); + assert_abs_diff_eq!(a2.dot(&b2), reference_dot(a2, b2), epsilon = 1e-5); } - let a = a.map(|f| *f as f32); - let b = b.map(|f| *f as f32); + let a = a.map(|f| *f); + let b = b.map(|f| *f); assert_abs_diff_eq!(a.dot(&b), dot as f32, epsilon = 1e-5); let max = 8 as Ixs; for i in 1..max { let a1 = a.slice(s![i..]); let b1 = b.slice(s![i..]); - assert_abs_diff_eq!(a1.dot(&b1), reference_dot(&a1, &b1), epsilon = 1e-5); + assert_abs_diff_eq!(a1.dot(&b1), reference_dot(a1, b1), epsilon = 1e-5); let a2 = a.slice(s![..-i]); let b2 = b.slice(s![i..]); - assert_abs_diff_eq!(a2.dot(&b2), reference_dot(&a2, &b2), epsilon = 1e-5); + assert_abs_diff_eq!(a2.dot(&b2), reference_dot(a2, b2), epsilon = 1e-5); } let a = a.map(|f| *f as i32); @@ -202,17 +202,17 @@ fn dot_product_0() { let x = 1.5; let b = aview0(&x); let b = b.broadcast(a.dim()).unwrap(); - assert_abs_diff_eq!(a.dot(&b), reference_dot(&a, &b), epsilon = 1e-5); + assert_abs_diff_eq!(a.dot(&b), reference_dot(&a, b), epsilon = 1e-5); // test different alignments let max = 8 as Ixs; for i in 1..max { let a1 = a.slice(s![i..]); let b1 = b.slice(s![i..]); - assert_abs_diff_eq!(a1.dot(&b1), reference_dot(&a1, &b1), epsilon = 1e-5); + assert_abs_diff_eq!(a1.dot(&b1), reference_dot(a1, b1), epsilon = 1e-5); let a2 = a.slice(s![..-i]); let b2 = b.slice(s![i..]); - assert_abs_diff_eq!(a2.dot(&b2), reference_dot(&a2, &b2), epsilon = 1e-5); + assert_abs_diff_eq!(a2.dot(&b2), reference_dot(a2, b2), epsilon = 1e-5); } } @@ -225,13 +225,13 @@ fn dot_product_neg_stride() { // both negative let a = a.slice(s![..;stride]); let b = b.slice(s![..;stride]); - assert_abs_diff_eq!(a.dot(&b), reference_dot(&a, &b), epsilon = 1e-5); + assert_abs_diff_eq!(a.dot(&b), reference_dot(a, b), epsilon = 1e-5); } for stride in -10..0 { // mixed let a = a.slice(s![..;-stride]); let b = b.slice(s![..;stride]); - assert_abs_diff_eq!(a.dot(&b), reference_dot(&a, &b), epsilon = 1e-5); + assert_abs_diff_eq!(a.dot(&b), reference_dot(a, b), epsilon = 1e-5); } } @@ -478,7 +478,7 @@ fn mat_mul_rev() { let mut rev = Array::zeros(b.dim()); let mut rev = rev.slice_mut(s![..;-1, ..]); rev.assign(&b); - println!("{:.?}", rev); + println!("{:?}", rev); let c1 = a.dot(&b); let c2 = a.dot(&rev); From 05ed8737aa3931b35562a1d1c827ea010824b5b7 Mon Sep 17 00:00:00 2001 From: skewballfox Date: Fri, 23 Dec 2022 13:34:56 -0600 Subject: [PATCH 04/10] more clippy lints --- examples/type_conversion.rs | 2 +- tests/append.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/type_conversion.rs b/examples/type_conversion.rs index 7bec2542f..857dffa11 100644 --- a/examples/type_conversion.rs +++ b/examples/type_conversion.rs @@ -33,7 +33,7 @@ fn main() { // can be guaranteed to be lossless at compile time. This is the safest // approach. let a_u8: Array = array![[1, 2, 3], [4, 5, 6]]; - let a_f32 = a_u8.mapv(|element| f32::from(element)); + let a_f32 = a_u8.mapv(f32::from); assert_abs_diff_eq!(a_f32, array![[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]); // Fallible, lossless conversion with `TryFrom` diff --git a/tests/append.rs b/tests/append.rs index dcebcf50e..6d255468d 100644 --- a/tests/append.rs +++ b/tests/append.rs @@ -246,14 +246,14 @@ fn append_array_3d() { let aa = array![[[51, 52], [53, 54]], [[55, 56], [57, 58]]]; let av = aa.view(); println!("Send {:?} to append", av); - a.append(Axis(0), av.clone()).unwrap(); + a.append(Axis(0), av).unwrap(); a.swap_axes(0, 1); let aa = array![[[71, 72], [73, 74]], [[75, 76], [77, 78]]]; let mut av = aa.view(); av.swap_axes(0, 1); println!("Send {:?} to append", av); - a.append(Axis(1), av.clone()).unwrap(); + a.append(Axis(1), av).unwrap(); println!("{:?}", a); let aa = array![[[81, 82], [83, 84]], [[85, 86], [87, 88]]]; let mut av = aa.view(); @@ -290,7 +290,7 @@ fn test_append_2d() { println!("{:?}", a); assert_eq!(a.shape(), &[8, 4]); for (i, row) in a.rows().into_iter().enumerate() { - let ones = i < 3 || i >= 5; + let ones = !(3..5).contains(&i); assert!(row.iter().all(|&x| x == ones as i32 as f64), "failed on lane {}", i); } @@ -305,7 +305,7 @@ fn test_append_2d() { assert_eq!(a.shape(), &[4, 8]); for (i, row) in a.columns().into_iter().enumerate() { - let ones = i < 3 || i >= 5; + let ones = !(3..5).contains(&i); assert!(row.iter().all(|&x| x == ones as i32 as f64), "failed on lane {}", i); } } From 8649c0ae772ebfde9d8a8df18a42ed914209fc27 Mon Sep 17 00:00:00 2001 From: skewballfox Date: Fri, 23 Dec 2022 13:45:25 -0600 Subject: [PATCH 05/10] fixed warnings which weren't addressed --- src/dimension/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dimension/mod.rs b/src/dimension/mod.rs index 6755efeb7..4ca5926dc 100644 --- a/src/dimension/mod.rs +++ b/src/dimension/mod.rs @@ -463,7 +463,7 @@ pub fn do_slice(dim: &mut usize, stride: &mut usize, slice: Slice) -> isize { } else { let d = m / abs_step; let r = m % abs_step; - d + if r > 0 { 1 } else { 0 } + d + (r>0) as usize }; // Update stride. The additional check is necessary to avoid possible @@ -729,12 +729,12 @@ where let merged_len = into_len * take_len; if take_len <= 1 { dim.set_axis(into, merged_len); - dim.set_axis(take, if merged_len == 0 { 0 } else { 1 }); + dim.set_axis(take, (merged_len != 0) as usize); true } else if into_len <= 1 { strides.set_axis(into, take_stride as usize); dim.set_axis(into, merged_len); - dim.set_axis(take, if merged_len == 0 { 0 } else { 1 }); + dim.set_axis(take, (merged_len != 0) as usize); true } else if take_stride == into_len as isize * into_stride { dim.set_axis(into, merged_len); From 89dfe905cb6efdf6ce9f338c6b8ebc9681540c51 Mon Sep 17 00:00:00 2001 From: skewballfox Date: Fri, 23 Dec 2022 13:54:37 -0600 Subject: [PATCH 06/10] reapplied fix, without reformatting array.rs --- Cargo.toml | 2 +- tests/array.rs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 85c410449..93a91f6ae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ name = "ndarray" version = "0.15.6" edition = "2018" -rust-version = "1.51" +rust-version = "1.59" authors = [ "Ulrik Sverdrup \"bluss\"", "Jim Turner" diff --git a/tests/array.rs b/tests/array.rs index e3922ea8d..ebf051e01 100644 --- a/tests/array.rs +++ b/tests/array.rs @@ -9,7 +9,8 @@ use approx::assert_relative_eq; use defmac::defmac; -use itertools::{zip, Itertools}; +use itertools::Itertools; +use std::iter::zip; use ndarray::prelude::*; use ndarray::{arr3, rcarr2}; use ndarray::indices; From 0c859c40287691e87755d728c85b45c645e42760 Mon Sep 17 00:00:00 2001 From: skewballfox Date: Fri, 23 Dec 2022 14:12:31 -0600 Subject: [PATCH 07/10] switched toolchain to beta and reran lints --- examples/life.rs | 2 +- examples/zip_many.rs | 4 ++-- src/array_serde.rs | 4 ++-- src/arrayformat.rs | 32 +++++++++++++++---------------- src/error.rs | 2 +- src/layout/layoutfmt.rs | 4 ++-- src/slice.rs | 8 ++++---- tests/append.rs | 42 ++++++++++++++++++++--------------------- tests/azip.rs | 6 +++--- tests/oper.rs | 2 +- tests/zst.rs | 1 + 11 files changed, 53 insertions(+), 54 deletions(-) diff --git a/examples/life.rs b/examples/life.rs index 48f1d609f..1567fb91e 100644 --- a/examples/life.rs +++ b/examples/life.rs @@ -90,5 +90,5 @@ fn main() { } render(&a); let alive = a.iter().filter(|&&x| x > 0).count(); - println!("After {} steps there are {} cells alive", steps, alive); + println!("After {steps} steps there are {alive} cells alive"); } diff --git a/examples/zip_many.rs b/examples/zip_many.rs index e2c5169f2..7f9d53ebc 100644 --- a/examples/zip_many.rs +++ b/examples/zip_many.rs @@ -27,7 +27,7 @@ fn main() { // and this is how to do the *same thing* with azip!() azip!((a in &mut a, &b in &b, &c in c) *a = b + c); - println!("{:8.4}", a); + println!("{a:8.4}"); // sum of each row let mut sums = Array::zeros(a.nrows()); @@ -44,5 +44,5 @@ fn main() { Zip::from(a.exact_chunks(chunk_sz)) .and(&mut sums) .for_each(|chunk, sum| *sum = chunk.sum()); - println!("{:8.4}", sums); + println!("{sums:8.4}"); } diff --git a/src/array_serde.rs b/src/array_serde.rs index f1c9e1219..80635362b 100644 --- a/src/array_serde.rs +++ b/src/array_serde.rs @@ -27,7 +27,7 @@ where E: de::Error, { if v != ARRAY_FORMAT_VERSION { - let err_msg = format!("unknown array version: {}", v); + let err_msg = format!("unknown array version: {v}"); Err(de::Error::custom(err_msg)) } else { Ok(()) @@ -193,7 +193,7 @@ impl<'de> Deserialize<'de> for ArrayField { b"dim" => Ok(ArrayField::Dim), b"data" => Ok(ArrayField::Data), other => Err(de::Error::unknown_field( - &format!("{:?}", other), + &format!("{other:?}"), ARRAY_FIELDS, )), } diff --git a/src/arrayformat.rs b/src/arrayformat.rs index ae781df6a..e0553e98d 100644 --- a/src/arrayformat.rs +++ b/src/arrayformat.rs @@ -164,7 +164,7 @@ where shape => { let blank_lines = "\n".repeat(shape.len() - 2); let indent = " ".repeat(depth + 1); - let separator = format!(",\n{}{}", blank_lines, indent); + let separator = format!(",\n{blank_lines}{indent}"); f.write_str("[")?; let limit = fmt_opt.collapse_limit(full_ndim - depth - 1); @@ -220,7 +220,7 @@ where self.view().layout(), )?; match D::NDIM { - Some(ndim) => write!(f, ", const ndim={}", ndim)?, + Some(ndim) => write!(f, ", const ndim={ndim}")?, None => write!(f, ", dynamic ndim={}", self.ndim())?, } Ok(()) @@ -296,9 +296,7 @@ mod formatting_with_omit { // use assert to avoid printing the strings twice on failure assert!( expected == actual, - "formatting assertion failed\nexpected:\n{}\nactual:\n{}\n", - expected, - actual, + "formatting assertion failed\nexpected:\n{expected}\nactual:\n{actual}\n", ); } @@ -326,7 +324,7 @@ mod formatting_with_omit { #[test] fn empty_arrays() { let a: Array2 = arr2(&[[], []]); - let actual = format!("{}", a); + let actual = format!("{a}"); let expected = "[[]]"; assert_str_eq(expected, &actual); } @@ -334,7 +332,7 @@ mod formatting_with_omit { #[test] fn zero_length_axes() { let a = Array3::::zeros((3, 0, 4)); - let actual = format!("{}", a); + let actual = format!("{a}"); let expected = "[[[]]]"; assert_str_eq(expected, &actual); } @@ -343,7 +341,7 @@ mod formatting_with_omit { fn dim_0() { let element = 12; let a = arr0(element); - let actual = format!("{}", a); + let actual = format!("{a}"); let expected = "12"; assert_str_eq(expected, &actual); } @@ -352,7 +350,7 @@ mod formatting_with_omit { fn dim_1() { let overflow: usize = 2; let a = Array1::from_elem(ARRAY_MANY_ELEMENT_LIMIT + overflow, 1); - let actual = format!("{}", a); + let actual = format!("{a}"); let expected = format!("[{}]", ellipsize(AXIS_LIMIT_ROW, ", ", a.iter())); assert_str_eq(&expected, &actual); } @@ -361,7 +359,7 @@ mod formatting_with_omit { fn dim_1_alternate() { let overflow: usize = 2; let a = Array1::from_elem(ARRAY_MANY_ELEMENT_LIMIT + overflow, 1); - let actual = format!("{:#}", a); + let actual = format!("{a:#}"); let expected = format!("[{}]", a.iter().format(", ")); assert_str_eq(&expected, &actual); } @@ -373,7 +371,7 @@ mod formatting_with_omit { (AXIS_2D_OVERFLOW_LIMIT, AXIS_2D_OVERFLOW_LIMIT + overflow), 1, ); - let actual = format!("{}", a); + let actual = format!("{a}"); let expected = "\ [[1, 1, 1, 1, 1, ..., 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, ..., 1, 1, 1, 1, 1], @@ -392,7 +390,7 @@ mod formatting_with_omit { #[test] fn dim_2_non_last_axis_overflow() { let a = Array2::from_elem((ARRAY_MANY_ELEMENT_LIMIT / 10, 10), 1); - let actual = format!("{}", a); + let actual = format!("{a}"); let row = format!("{}", a.row(0)); let expected = format!( "[{}]", @@ -404,7 +402,7 @@ mod formatting_with_omit { #[test] fn dim_2_non_last_axis_overflow_alternate() { let a = Array2::from_elem((AXIS_LIMIT_COL * 4, 6), 1); - let actual = format!("{:#}", a); + let actual = format!("{a:#}"); let row = format!("{}", a.row(0)); let expected = format!("[{}]", (0..a.nrows()).map(|_| &row).format(",\n ")); assert_str_eq(&expected, &actual); @@ -420,7 +418,7 @@ mod formatting_with_omit { ), 1, ); - let actual = format!("{}", a); + let actual = format!("{a}"); let row = format!("[{}]", ellipsize(AXIS_LIMIT_ROW, ", ", a.row(0))); let expected = format!( "[{}]", @@ -439,7 +437,7 @@ mod formatting_with_omit { ), 1, ); - let actual = format!("{:#}", a); + let actual = format!("{a:#}"); let row = format!("{}", a.row(0)); let expected = format!("[{}]", (0..a.nrows()).map(|_| &row).format(",\n ")); assert_str_eq(&expected, &actual); @@ -453,7 +451,7 @@ mod formatting_with_omit { 1000. + (100. * ((i as f64).sqrt() + (j as f64).sin() + k as f64)).round() / 100. }, ); - let actual = format!("{:6.1}", a); + let actual = format!("{a:6.1}"); let expected = "\ [[[1000.0, 1001.0, 1002.0, 1003.0, 1004.0, ..., 1007.0, 1008.0, 1009.0, 1010.0, 1011.0], [1000.8, 1001.8, 1002.8, 1003.8, 1004.8, ..., 1007.8, 1008.8, 1009.8, 1010.8, 1011.8], @@ -534,7 +532,7 @@ mod formatting_with_omit { #[test] fn dim_4_overflow_outer() { let a = Array4::from_shape_fn((10, 10, 3, 3), |(i, j, k, l)| i + j + k + l); - let actual = format!("{:2}", a); + let actual = format!("{a:2}"); // Generated using NumPy with: // np.set_printoptions(threshold=500, edgeitems=3) // np.fromfunction(lambda i, j, k, l: i + j + k + l, (10, 10, 3, 3), dtype=int) diff --git a/src/error.rs b/src/error.rs index c45496142..a44e0bcee 100644 --- a/src/error.rs +++ b/src/error.rs @@ -89,7 +89,7 @@ impl fmt::Display for ShapeError { impl fmt::Debug for ShapeError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self) + write!(f, "{self}") } } diff --git a/src/layout/layoutfmt.rs b/src/layout/layoutfmt.rs index 3d7fad00a..7ecb419ae 100644 --- a/src/layout/layoutfmt.rs +++ b/src/layout/layoutfmt.rs @@ -19,9 +19,9 @@ impl fmt::Debug for Layout { } else { (0..32).filter(|&i| self.is(1 << i)).try_fold((), |_, i| { if let Some(name) = LAYOUT_NAMES.get(i) { - write!(f, "{}", name) + write!(f, "{name}") } else { - write!(f, "{:#x}", i) + write!(f, "{i:#x}") } })?; }; diff --git a/src/slice.rs b/src/slice.rs index 0146d6dba..d53e6da72 100644 --- a/src/slice.rs +++ b/src/slice.rs @@ -149,17 +149,17 @@ impl SliceInfoElem { impl fmt::Display for SliceInfoElem { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { - SliceInfoElem::Index(index) => write!(f, "{}", index)?, + SliceInfoElem::Index(index) => write!(f, "{index}")?, SliceInfoElem::Slice { start, end, step } => { if start != 0 { - write!(f, "{}", start)?; + write!(f, "{start}")?; } write!(f, "..")?; if let Some(i) = end { - write!(f, "{}", i)?; + write!(f, "{i}")?; } if step != 1 { - write!(f, ";{}", step)?; + write!(f, ";{step}")?; } } SliceInfoElem::NewAxis => write!(f, stringify!(NewAxis))?, diff --git a/tests/append.rs b/tests/append.rs index 6d255468d..dc656aa67 100644 --- a/tests/append.rs +++ b/tests/append.rs @@ -73,8 +73,8 @@ fn push_row_neg_stride_1() { // Changing the memory layout to fit the next append let mut a2 = a.clone(); - println!("a = {:?}", a); - println!("a2 = {:?}", a2); + println!("a = {a:?}"); + println!("a2 = {a2:?}"); a2.push_column(aview1(&[1., 2.])).unwrap(); assert_eq!(a2, array![[4., 5., 6., 7., 1.], @@ -116,8 +116,8 @@ fn push_row_neg_stride_2() { // Changing the memory layout to fit the next append let mut a2 = a.clone(); - println!("a = {:?}", a); - println!("a2 = {:?}", a2); + println!("a = {a:?}"); + println!("a2 = {a2:?}"); a2.push_column(aview1(&[1., 2.])).unwrap(); assert_eq!(a2, array![[3., 2., 1., 0., 1.], @@ -218,9 +218,9 @@ fn push_column() { fn append_array1() { let mut a = Array::zeros((0, 4)); a.append(Axis(0), aview2(&[[0., 1., 2., 3.]])).unwrap(); - println!("{:?}", a); + println!("{a:?}"); a.append(Axis(0), aview2(&[[4., 5., 6., 7.]])).unwrap(); - println!("{:?}", a); + println!("{a:?}"); //a.push_column(aview1(&[4., 5., 6., 7.])).unwrap(); //assert_eq!(a.shape(), &[4, 2]); @@ -229,7 +229,7 @@ fn append_array1() { [4., 5., 6., 7.]]); a.append(Axis(0), aview2(&[[5., 5., 4., 4.], [3., 3., 2., 2.]])).unwrap(); - println!("{:?}", a); + println!("{a:?}"); assert_eq!(a, array![[0., 1., 2., 3.], [4., 5., 6., 7.], @@ -241,26 +241,26 @@ fn append_array1() { fn append_array_3d() { let mut a = Array::zeros((0, 2, 2)); a.append(Axis(0), array![[[0, 1], [2, 3]]].view()).unwrap(); - println!("{:?}", a); + println!("{a:?}"); let aa = array![[[51, 52], [53, 54]], [[55, 56], [57, 58]]]; let av = aa.view(); - println!("Send {:?} to append", av); + println!("Send {av:?} to append"); a.append(Axis(0), av).unwrap(); a.swap_axes(0, 1); let aa = array![[[71, 72], [73, 74]], [[75, 76], [77, 78]]]; let mut av = aa.view(); av.swap_axes(0, 1); - println!("Send {:?} to append", av); + println!("Send {av:?} to append"); a.append(Axis(1), av).unwrap(); - println!("{:?}", a); + println!("{a:?}"); let aa = array![[[81, 82], [83, 84]], [[85, 86], [87, 88]]]; let mut av = aa.view(); av.swap_axes(0, 1); - println!("Send {:?} to append", av); + println!("Send {av:?} to append"); a.append(Axis(1), av).unwrap(); - println!("{:?}", a); + println!("{a:?}"); assert_eq!(a, array![[[0, 1], [51, 52], @@ -287,11 +287,11 @@ fn test_append_2d() { a.append(Axis(0), ones).unwrap(); a.append(Axis(0), zeros).unwrap(); a.append(Axis(0), ones).unwrap(); - println!("{:?}", a); + println!("{a:?}"); assert_eq!(a.shape(), &[8, 4]); for (i, row) in a.rows().into_iter().enumerate() { let ones = !(3..5).contains(&i); - assert!(row.iter().all(|&x| x == ones as i32 as f64), "failed on lane {}", i); + assert!(row.iter().all(|&x| x == ones as i32 as f64), "failed on lane {i}"); } let mut a = Array::zeros((0, 4)); @@ -301,12 +301,12 @@ fn test_append_2d() { a.append(Axis(1), ones).unwrap(); a.append(Axis(1), zeros).unwrap(); a.append(Axis(1), ones).unwrap(); - println!("{:?}", a); + println!("{a:?}"); assert_eq!(a.shape(), &[4, 8]); for (i, row) in a.columns().into_iter().enumerate() { let ones = !(3..5).contains(&i); - assert!(row.iter().all(|&x| x == ones as i32 as f64), "failed on lane {}", i); + assert!(row.iter().all(|&x| x == ones as i32 as f64), "failed on lane {i}"); } } @@ -315,16 +315,16 @@ fn test_append_middle_axis() { // ensure we can append to Axis(1) by letting it become outermost let mut a = Array::::zeros((3, 0, 2)); a.append(Axis(1), Array::from_iter(0..12).into_shape((3, 2, 2)).unwrap().view()).unwrap(); - println!("{:?}", a); + println!("{a:?}"); a.append(Axis(1), Array::from_iter(12..24).into_shape((3, 2, 2)).unwrap().view()).unwrap(); - println!("{:?}", a); + println!("{a:?}"); // ensure we can append to Axis(1) by letting it become outermost let mut a = Array::::zeros((3, 1, 2)); a.append(Axis(1), Array::from_iter(0..12).into_shape((3, 2, 2)).unwrap().view()).unwrap(); - println!("{:?}", a); + println!("{a:?}"); a.append(Axis(1), Array::from_iter(12..24).into_shape((3, 2, 2)).unwrap().view()).unwrap(); - println!("{:?}", a); + println!("{a:?}"); } #[test] diff --git a/tests/azip.rs b/tests/azip.rs index 6f0327f5d..3c7e98dcd 100644 --- a/tests/azip.rs +++ b/tests/azip.rs @@ -277,9 +277,9 @@ fn test_contiguous_but_not_c_or_f() { let mut ans = Array::zeros(a.dim().f()); azip!((ans in &mut ans, &a in &a, &b in &b) *ans = a + b); - println!("{:?}", a); - println!("{:?}", b); - println!("{:?}", ans); + println!("{a:?}"); + println!("{b:?}"); + println!("{ans:?}"); assert_eq!(ans[[0, 1, 2]], correct_012); assert_eq!(ans, correct); diff --git a/tests/oper.rs b/tests/oper.rs index 0451dfc04..53a3f771b 100644 --- a/tests/oper.rs +++ b/tests/oper.rs @@ -478,7 +478,7 @@ fn mat_mul_rev() { let mut rev = Array::zeros(b.dim()); let mut rev = rev.slice_mut(s![..;-1, ..]); rev.assign(&b); - println!("{:?}", rev); + println!("{rev:?}"); let c1 = a.dot(&b); let c2 = a.dot(&rev); diff --git a/tests/zst.rs b/tests/zst.rs index c3c779d2c..841d0b12e 100644 --- a/tests/zst.rs +++ b/tests/zst.rs @@ -16,6 +16,7 @@ fn test_swap() { } #[test] +#[allow(clippy::all)] //not sure what lint keeps fixing this, never shows up with clippy , but changes with --fix fn test() { let c = ArcArray::<(), _>::default((3, 4)); let mut d = c.clone(); From ce7d306b0ec6c4f555b9b1d49dbbd72c3138588a Mon Sep 17 00:00:00 2001 From: skewballfox Date: Fri, 23 Dec 2022 14:31:17 -0600 Subject: [PATCH 08/10] format changes in assert require an update --- src/arrayformat.rs | 2 +- tests/append.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/arrayformat.rs b/src/arrayformat.rs index e0553e98d..a8f487499 100644 --- a/src/arrayformat.rs +++ b/src/arrayformat.rs @@ -296,7 +296,7 @@ mod formatting_with_omit { // use assert to avoid printing the strings twice on failure assert!( expected == actual, - "formatting assertion failed\nexpected:\n{expected}\nactual:\n{actual}\n", + "formatting assertion failed\nexpected:\n{}\nactual:\n{}\n",expected,actual ); } diff --git a/tests/append.rs b/tests/append.rs index dc656aa67..bf15e6ecd 100644 --- a/tests/append.rs +++ b/tests/append.rs @@ -291,7 +291,7 @@ fn test_append_2d() { assert_eq!(a.shape(), &[8, 4]); for (i, row) in a.rows().into_iter().enumerate() { let ones = !(3..5).contains(&i); - assert!(row.iter().all(|&x| x == ones as i32 as f64), "failed on lane {i}"); + assert!(row.iter().all(|&x| x == ones as i32 as f64), "failed on lane {}",i); } let mut a = Array::zeros((0, 4)); @@ -306,7 +306,7 @@ fn test_append_2d() { for (i, row) in a.columns().into_iter().enumerate() { let ones = !(3..5).contains(&i); - assert!(row.iter().all(|&x| x == ones as i32 as f64), "failed on lane {i}"); + assert!(row.iter().all(|&x| x == ones as i32 as f64), "failed on lane {}",i); } } From 668b937256da753f369165b65d94f660a1c6022a Mon Sep 17 00:00:00 2001 From: skewballfox Date: Fri, 23 Dec 2022 16:39:43 -0600 Subject: [PATCH 09/10] third try, see if changing relative import of ndarray helps --- xtest-numeric/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xtest-numeric/Cargo.toml b/xtest-numeric/Cargo.toml index 7a6c3cedd..b92c93bab 100644 --- a/xtest-numeric/Cargo.toml +++ b/xtest-numeric/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] approx = "0.4" -ndarray = { path = "..", features = ["approx"] } +ndarray = { path = "../", features = ["approx"] } ndarray-rand = { path = "../ndarray-rand/" } rand_distr = "0.4" From 32b6c0e7640a1e3c811e7871dc4eb53453c86d83 Mon Sep 17 00:00:00 2001 From: skewballfox Date: Fri, 23 Dec 2022 18:03:11 -0600 Subject: [PATCH 10/10] fixed build failure by adding xtest-numeric to workspace --- Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 93a91f6ae..7dfa4769c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -78,8 +78,8 @@ matrixmultiply-threading = ["matrixmultiply/threading"] debug = true [workspace] -members = ["ndarray-rand", "xtest-serialization", "xtest-blas"] -exclude = ["xtest-numeric"] +members = ["ndarray-rand", "xtest-serialization", "xtest-blas","xtest-numeric"] + [package.metadata.release] no-dev-version = true