From 0ca488fe382dbbf576eecf5511e640dd24228902 Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Fri, 10 May 2019 04:18:20 +0900 Subject: [PATCH 1/9] Add Windows setting to azure --- azure-pipelines.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a6b1f035..2d05237f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -58,3 +58,16 @@ jobs: cargo test -v --features=intel-mkl --no-default-features cargo test -v --features=intel-mkl,serde-1 --no-default-features displayName: run test + + - job: Windows + pool: + vmImage: 'windows-2019' + steps: + - script: | + curl -sSf -o rustup-init.exe https://win.rustup.rs + rustup-init.exe -y 2>&1 + set PATH=%PATH%;%USERPROFILE%\.cargo\bin + echo '##vso[task.setvariable variable=PATH;]%PATH%;%USERPROFILE%\.cargo\bin' + displayName: install rustup on Windows + - script: cargo test -v --features=intel-mkl --no-default-features 2>&1 + displayName: run test From 7126e5029a6c2e1eb38816f541338d473842017d Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Fri, 10 May 2019 23:13:32 +0900 Subject: [PATCH 2/9] Link intel-mkl-src 0.4.0 directly To bypass the blas-src/lapack-src until their PR are merged - https://github.com/blas-lapack-rs/blas-src/pull/3 - https://github.com/blas-lapack-rs/lapack-src/pull/3 --- Cargo.toml | 7 ++++++- src/lib.rs | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 47ecfe65..2b18b1dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ categories = ["algorithms", "science"] [features] default = [] -intel-mkl = ["lapack-src/intel-mkl", "blas-src/intel-mkl"] +intel-mkl = ["intel-mkl-src"] netlib = ["lapack-src/netlib", "blas-src/netlib"] openblas = ["lapack-src/openblas", "blas-src/openblas"] serde-1 = ["ndarray/serde-1", "num-complex/serde"] @@ -40,3 +40,8 @@ optional = true version = "0.2" default-features = false optional = true + +[dependencies.intel-mkl-src] +version = "0.4" +default-features = false +optional = true diff --git a/src/lib.rs b/src/lib.rs index 1a55a082..75ffd4c8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,6 +36,9 @@ //! - [Random matrix generators](generate/index.html) //! - [Scalar trait](types/trait.Scalar.html) +#[cfg(feature = "intel-mkl")] +extern crate intel_mkl_src; + pub mod assert; pub mod cholesky; pub mod convert; From bcaf9596dcad0183a3cb9aaf1dda4a2a0142a96c Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Fri, 10 May 2019 23:15:22 +0900 Subject: [PATCH 3/9] Fix job name --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 2d05237f..b5f1de0c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -59,7 +59,7 @@ jobs: cargo test -v --features=intel-mkl,serde-1 --no-default-features displayName: run test - - job: Windows + - job: WindowsIntelMKL pool: vmImage: 'windows-2019' steps: From 549e6d6e9557efc75e673862a80802368d92daf9 Mon Sep 17 00:00:00 2001 From: termoshtt Date: Sat, 11 May 2019 03:33:34 +0900 Subject: [PATCH 4/9] Add test for eigh --- tests/eigh.rs | 84 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 78 insertions(+), 6 deletions(-) diff --git a/tests/eigh.rs b/tests/eigh.rs index a8b088d5..77be699b 100644 --- a/tests/eigh.rs +++ b/tests/eigh.rs @@ -2,10 +2,15 @@ use ndarray::*; use ndarray_linalg::*; #[test] -fn eigen_vector_manual() { +fn fixed() { let a = arr2(&[[3.0, 1.0, 1.0], [1.0, 3.0, 1.0], [1.0, 1.0, 3.0]]); let (e, vecs): (Array1<_>, Array2<_>) = (&a).eigh(UPLO::Upper).unwrap(); assert_close_l2!(&e, &arr1(&[2.0, 2.0, 5.0]), 1.0e-7); + + // Check eigenvectors are orthogonalized + let s = vecs.t().dot(&vecs); + assert_close_l2!(&s, &Array::eye(3), 1.0e-7); + for (i, v) in vecs.axis_iter(Axis(1)).enumerate() { let av = a.dot(&v); let ev = v.mapv(|x| e[i] * x); @@ -14,12 +19,53 @@ fn eigen_vector_manual() { } #[test] -fn diagonalize() { - let a = arr2(&[[3.0, 1.0, 1.0], [1.0, 3.0, 1.0], [1.0, 1.0, 3.0]]); +fn fixed_t() { + let a = arr2(&[[3.0, 1.0, 1.0], [1.0, 3.0, 1.0], [1.0, 1.0, 3.0]]).reversed_axes(); let (e, vecs): (Array1<_>, Array2<_>) = (&a).eigh(UPLO::Upper).unwrap(); - let s = vecs.t().dot(&a).dot(&vecs); - for i in 0..3 { - assert_rclose!(e[i], s[(i, i)], 1e-7); + assert_close_l2!(&e, &arr1(&[2.0, 2.0, 5.0]), 1.0e-7); + + // Check eigenvectors are orthogonalized + let s = vecs.t().dot(&vecs); + assert_close_l2!(&s, &Array::eye(3), 1.0e-7); + + for (i, v) in vecs.axis_iter(Axis(1)).enumerate() { + let av = a.dot(&v); + let ev = v.mapv(|x| e[i] * x); + assert_close_l2!(&av, &ev, 1.0e-7); + } +} + +#[test] +fn fixed_lower() { + let a = arr2(&[[3.0, 1.0, 1.0], [1.0, 3.0, 1.0], [1.0, 1.0, 3.0]]); + let (e, vecs): (Array1<_>, Array2<_>) = (&a).eigh(UPLO::Lower).unwrap(); + assert_close_l2!(&e, &arr1(&[2.0, 2.0, 5.0]), 1.0e-7); + + // Check eigenvectors are orthogonalized + let s = vecs.t().dot(&vecs); + assert_close_l2!(&s, &Array::eye(3), 1.0e-7); + + for (i, v) in vecs.axis_iter(Axis(1)).enumerate() { + let av = a.dot(&v); + let ev = v.mapv(|x| e[i] * x); + assert_close_l2!(&av, &ev, 1.0e-7); + } +} + +#[test] +fn fixed_t_lower() { + let a = arr2(&[[3.0, 1.0, 1.0], [1.0, 3.0, 1.0], [1.0, 1.0, 3.0]]).reversed_axes(); + let (e, vecs): (Array1<_>, Array2<_>) = (&a).eigh(UPLO::Lower).unwrap(); + assert_close_l2!(&e, &arr1(&[2.0, 2.0, 5.0]), 1.0e-7); + + // Check eigenvectors are orthogonalized + let s = vecs.t().dot(&vecs); + assert_close_l2!(&s, &Array::eye(3), 1.0e-7); + + for (i, v) in vecs.axis_iter(Axis(1)).enumerate() { + let av = a.dot(&v); + let ev = v.mapv(|x| e[i] * x); + assert_close_l2!(&av, &ev, 1.0e-7); } } @@ -48,3 +94,29 @@ fn ssqrt_t() { println!("ss = {:?}", &ss); assert_close_l2!(&ss, &ans, 1e-7); } + +#[test] +fn ssqrt_lower() { + let a: Array2 = random_hpd(3); + let ans = a.clone(); + let s = a.ssqrt(UPLO::Lower).unwrap(); + println!("a = {:?}", &ans); + println!("s = {:?}", &s); + assert_close_l2!(&s.t(), &s, 1e-7); + let ss = s.dot(&s); + println!("ss = {:?}", &ss); + assert_close_l2!(&ss, &ans, 1e-7); +} + +#[test] +fn ssqrt_t_lower() { + let a: Array2 = random_hpd(3).reversed_axes(); + let ans = a.clone(); + let s = a.ssqrt(UPLO::Lower).unwrap(); + println!("a = {:?}", &ans); + println!("s = {:?}", &s); + assert_close_l2!(&s.t(), &s, 1e-7); + let ss = s.dot(&s); + println!("ss = {:?}", &ss); + assert_close_l2!(&ss, &ans, 1e-7); +} From 70516315bb2efb50a865b7e002f01fddbf65a0e6 Mon Sep 17 00:00:00 2001 From: termoshtt Date: Tue, 11 Jun 2019 13:55:22 +0900 Subject: [PATCH 5/9] Force layout to be Fortran --- src/eigh.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/eigh.rs b/src/eigh.rs index a3ce912f..40add365 100644 --- a/src/eigh.rs +++ b/src/eigh.rs @@ -63,6 +63,13 @@ where type EigVal = Array1; fn eigh_inplace(&mut self, uplo: UPLO) -> Result<(Self::EigVal, &mut Self)> { + dbg!(&self); + let layout = self.square_layout()?; + // XXX Force layout to be Fortran (see #146) + match layout { + MatrixLayout::C(_) => self.swap_axes(0, 1), + MatrixLayout::F(_) => {} + } let s = unsafe { A::eigh(true, self.square_layout()?, uplo, self.as_allocated_mut()?)? }; Ok((ArrayBase::from_vec(s), self)) } From 233ef5cb1e11320dff975796f921037427d35b9f Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Tue, 11 Jun 2019 14:04:12 +0900 Subject: [PATCH 6/9] Remove dbg! --- src/eigh.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/eigh.rs b/src/eigh.rs index 40add365..90115d14 100644 --- a/src/eigh.rs +++ b/src/eigh.rs @@ -63,7 +63,6 @@ where type EigVal = Array1; fn eigh_inplace(&mut self, uplo: UPLO) -> Result<(Self::EigVal, &mut Self)> { - dbg!(&self); let layout = self.square_layout()?; // XXX Force layout to be Fortran (see #146) match layout { From 2adcd054f815d09d45b8ef30d0c0a261ddd4f047 Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Tue, 11 Jun 2019 21:49:15 +0900 Subject: [PATCH 7/9] Use lapack-sys 0.3 which supporting intel-mkl-src 0.4 --- Cargo.toml | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2b18b1dc..5d9e44bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ categories = ["algorithms", "science"] [features] default = [] -intel-mkl = ["intel-mkl-src"] +intel-mkl = ["lapack-src/intel-mkl", "blas-src/intel-mkl"] netlib = ["lapack-src/netlib", "blas-src/netlib"] openblas = ["lapack-src/openblas", "blas-src/openblas"] serde-1 = ["ndarray/serde-1", "num-complex/serde"] @@ -32,16 +32,11 @@ features = ["blas"] default-features = false [dependencies.blas-src] -version = "0.2" +version = "0.3" default-features = false optional = true [dependencies.lapack-src] -version = "0.2" -default-features = false -optional = true - -[dependencies.intel-mkl-src] -version = "0.4" +version = "0.3" default-features = false optional = true From f9bf4a074416802968c6333fdccccf3b29746047 Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Tue, 11 Jun 2019 21:56:54 +0900 Subject: [PATCH 8/9] Remove intel_mkl_src extern --- src/lib.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index ac934982..90f7c003 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,9 +36,6 @@ //! - [Random matrix generators](generate/index.html) //! - [Scalar trait](types/trait.Scalar.html) -#[cfg(feature = "intel-mkl")] -extern crate intel_mkl_src; - pub mod assert; pub mod cholesky; pub mod convert; From d8d779c1074034b7980a96adf9a03a991b1a86b5 Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Wed, 12 Jun 2019 01:59:24 +0900 Subject: [PATCH 9/9] Link blas,lapack_src explicitly --- src/lib.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 90f7c003..834c6f26 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,6 +36,9 @@ //! - [Random matrix generators](generate/index.html) //! - [Scalar trait](types/trait.Scalar.html) +extern crate blas_src; +extern crate lapack_src; + pub mod assert; pub mod cholesky; pub mod convert;