From 91b2be2c4cf08f0b9552b5077e632fbb28ef4ab1 Mon Sep 17 00:00:00 2001 From: Jim Turner Date: Tue, 11 May 2021 19:57:18 -0400 Subject: [PATCH 1/3] Include EigVals::eigvals in tests --- ndarray-linalg/tests/eig.rs | 55 +++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/ndarray-linalg/tests/eig.rs b/ndarray-linalg/tests/eig.rs index 28314b8a..d5a6e635 100644 --- a/ndarray-linalg/tests/eig.rs +++ b/ndarray-linalg/tests/eig.rs @@ -2,8 +2,11 @@ use ndarray::*; use ndarray_linalg::*; // Test Av_i = e_i v_i for i = 0..n -fn test_eig(a: Array2, eigs: Array1, vecs: Array2) -where +fn test_eig( + a: ArrayView2<'_, T>, + eigs: ArrayView1<'_, T::Complex>, + vecs: ArrayView2<'_, T::Complex>, +) where T::Complex: Lapack, { println!("a\n{:+.4}", &a); @@ -205,29 +208,37 @@ macro_rules! impl_test_real { #[test] fn [<$real _eigvals >]() { let a = test_matrix_real::<$real>(); - let (e, _vecs) = a.eig().unwrap(); - assert_close_l2!(&e, &answer_eig_real::<$real>(), 1.0e-3); + let (e1, _vecs) = a.eig().unwrap(); + let e2 = a.eigvals().unwrap(); + assert_close_l2!(&e1, &answer_eig_real::<$real>(), 1.0e-3); + assert_close_l2!(&e2, &answer_eig_real::<$real>(), 1.0e-3); } #[test] fn [<$real _eigvals_t>]() { let a = test_matrix_real_t::<$real>(); - let (e, _vecs) = a.eig().unwrap(); - assert_close_l2!(&e, &answer_eig_real::<$real>(), 1.0e-3); + let (e1, _vecs) = a.eig().unwrap(); + let e2 = a.eigvals().unwrap(); + assert_close_l2!(&e1, &answer_eig_real::<$real>(), 1.0e-3); + assert_close_l2!(&e2, &answer_eig_real::<$real>(), 1.0e-3); } #[test] fn [<$real _eig>]() { let a = test_matrix_real::<$real>(); - let (e, vecs) = a.eig().unwrap(); - test_eig(a, e, vecs); + let (e1, vecs) = a.eig().unwrap(); + let e2 = a.eigvals().unwrap(); + test_eig(a.view(), e1.view(), vecs.view()); + test_eig(a.view(), e2.view(), vecs.view()); } #[test] fn [<$real _eig_t>]() { let a = test_matrix_real_t::<$real>(); - let (e, vecs) = a.eig().unwrap(); - test_eig(a, e, vecs); + let (e1, vecs) = a.eig().unwrap(); + let e2 = a.eigvals().unwrap(); + test_eig(a.view(), e1.view(), vecs.view()); + test_eig(a.view(), e2.view(), vecs.view()); } } // paste::item! @@ -243,15 +254,19 @@ macro_rules! impl_test_complex { #[test] fn [<$complex _eigvals >]() { let a = test_matrix_complex::<$complex>(); - let (e, _vecs) = a.eig().unwrap(); - assert_close_l2!(&e, &answer_eig_complex::<$complex>(), 1.0e-3); + let (e1, _vecs) = a.eig().unwrap(); + let e2 = a.eigvals().unwrap(); + assert_close_l2!(&e1, &answer_eig_complex::<$complex>(), 1.0e-3); + assert_close_l2!(&e2, &answer_eig_complex::<$complex>(), 1.0e-3); } #[test] fn [<$complex _eigvals_t>]() { let a = test_matrix_complex_t::<$complex>(); - let (e, _vecs) = a.eig().unwrap(); - assert_close_l2!(&e, &answer_eig_complex::<$complex>(), 1.0e-3); + let (e1, _vecs) = a.eig().unwrap(); + let e2 = a.eigvals().unwrap(); + assert_close_l2!(&e1, &answer_eig_complex::<$complex>(), 1.0e-3); + assert_close_l2!(&e2, &answer_eig_complex::<$complex>(), 1.0e-3); } #[test] @@ -271,15 +286,19 @@ macro_rules! impl_test_complex { #[test] fn [<$complex _eig>]() { let a = test_matrix_complex::<$complex>(); - let (e, vecs) = a.eig().unwrap(); - test_eig(a, e, vecs); + let (e1, vecs) = a.eig().unwrap(); + let e2 = a.eigvals().unwrap(); + test_eig(a.view(), e1.view(), vecs.view()); + test_eig(a.view(), e2.view(), vecs.view()); } #[test] fn [<$complex _eig_t>]() { let a = test_matrix_complex_t::<$complex>(); - let (e, vecs) = a.eig().unwrap(); - test_eig(a, e, vecs); + let (e1, vecs) = a.eig().unwrap(); + let e2 = a.eigvals().unwrap(); + test_eig(a.view(), e1.view(), vecs.view()); + test_eig(a.view(), e2.view(), vecs.view()); } } // paste::item! }; From 6eb1d85cde8e1775a13556e795224804b6be4ce8 Mon Sep 17 00:00:00 2001 From: Jim Turner Date: Tue, 11 May 2021 19:57:59 -0400 Subject: [PATCH 2/3] Avoid calculating eigenvectors unless requested --- ndarray-linalg/src/eig.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ndarray-linalg/src/eig.rs b/ndarray-linalg/src/eig.rs index 17f5a1e8..ad9ac685 100644 --- a/ndarray-linalg/src/eig.rs +++ b/ndarray-linalg/src/eig.rs @@ -72,7 +72,7 @@ where fn eigvals(&self) -> Result { let mut a = self.to_owned(); - let (s, _) = A::eig(true, a.square_layout()?, a.as_allocated_mut()?)?; + let (s, _) = A::eig(false, a.square_layout()?, a.as_allocated_mut()?)?; Ok(ArrayBase::from(s)) } } From 484cabe148cf70cd50c4a43cf6c61e943de9ca78 Mon Sep 17 00:00:00 2001 From: Jim Turner Date: Tue, 11 May 2021 20:13:53 -0400 Subject: [PATCH 3/3] Relax bound on EigVals from DataMut to Data --- ndarray-linalg/src/eig.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ndarray-linalg/src/eig.rs b/ndarray-linalg/src/eig.rs index ad9ac685..833f6d49 100644 --- a/ndarray-linalg/src/eig.rs +++ b/ndarray-linalg/src/eig.rs @@ -66,7 +66,7 @@ pub trait EigVals { impl EigVals for ArrayBase where A: Scalar + Lapack, - S: DataMut, + S: Data, { type EigVal = Array1;