summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/packages/algebra.scm7
-rw-r--r--gnu/packages/patches/eigen-stabilise-sparseqr-test.patch74
3 files changed, 79 insertions, 3 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index 5cde920c8c..caa73d44d4 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -826,6 +826,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/dstat-fix-crash-when-specifying-delay.patch	\
   %D%/packages/patches/dstat-skip-devices-without-io.patch	\
   %D%/packages/patches/dvd+rw-tools-add-include.patch 		\
+  %D%/packages/patches/eigen-stabilise-sparseqr-test.patch	\
   %D%/packages/patches/einstein-build.patch			\
   %D%/packages/patches/elfutils-tests-ptrace.patch		\
   %D%/packages/patches/elixir-path-length.patch			\
diff --git a/gnu/packages/algebra.scm b/gnu/packages/algebra.scm
index 50cb3001cb..8682ecd8d0 100644
--- a/gnu/packages/algebra.scm
+++ b/gnu/packages/algebra.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2014, 2018 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2017 Efraim Flashner <efraim@flashner.co.il>
-;;; Copyright © 2017, 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2017, 2018, 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2017 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2017, 2019 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2020 Björn Höfling <bjoern.hoefling@bjoernhoefling.de>
@@ -910,15 +910,16 @@ Sine Transform} (DST) and @dfn{Discrete Hartley Transform} (DHT).")
 (define-public eigen
   (package
     (name "eigen")
-    (version "3.3.5")
+    (version "3.3.7")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://bitbucket.org/eigen/eigen/get/"
                                   version ".tar.bz2"))
               (sha256
                (base32
-                "1qh3yrwn78ms5yhwbpl5wvblk4gbz02cacdygxylr7i9xbrvylkk"))
+                "1km3fyfzyqfdvmnl79drps3fjwnz3zbh0c7l34mfbqyvvs8cy4wz"))
               (file-name (string-append name "-" version ".tar.bz2"))
+              (patches (search-patches "eigen-stabilise-sparseqr-test.patch"))
               (modules '((guix build utils)))
               (snippet
                ;; There are 3 test failures in the "unsupported" directory,
diff --git a/gnu/packages/patches/eigen-stabilise-sparseqr-test.patch b/gnu/packages/patches/eigen-stabilise-sparseqr-test.patch
new file mode 100644
index 0000000000..b95b46077a
--- /dev/null
+++ b/gnu/packages/patches/eigen-stabilise-sparseqr-test.patch
@@ -0,0 +1,74 @@
+From: Tobias Geerinckx-Rice <me@tobias.gr>
+Date: Mon, 16 Mar 2020 22:51:37 +0000
+Subject: gnu: eigen: Stabilise sparseqr test.
+
+Taken verbatim from this[0] upstream commit.
+
+[0]: https://gitlab.com/libeigen/eigen/-/commit/3b5deeb546d4017b24846f5b0dc3296a50a039fe
+
+From 3b5deeb546d4017b24846f5b0dc3296a50a039fe Mon Sep 17 00:00:00 2001
+From: Gael Guennebaud <g.gael@free.fr>
+Date: Tue, 19 Feb 2019 22:57:51 +0100
+Subject: [PATCH] bug #899: make sparseqr unit test more stable by 1) trying
+ with larger threshold and 2) relax rank computation for rank-deficient
+ problems.
+
+---
+ test/sparseqr.cpp | 31 ++++++++++++++++++++++++++-----
+ 1 file changed, 26 insertions(+), 5 deletions(-)
+
+diff --git a/test/sparseqr.cpp b/test/sparseqr.cpp
+index 3ffe62314..3576cc626 100644
+--- a/test/sparseqr.cpp
++++ b/test/sparseqr.cpp
+@@ -43,6 +43,7 @@ int generate_sparse_rectangular_problem(MatrixType& A, DenseMat& dA, int maxRows
+ 
+ template<typename Scalar> void test_sparseqr_scalar()
+ {
++  typedef typename NumTraits<Scalar>::Real RealScalar;
+   typedef SparseMatrix<Scalar,ColMajor> MatrixType; 
+   typedef Matrix<Scalar,Dynamic,Dynamic> DenseMat;
+   typedef Matrix<Scalar,Dynamic,1> DenseVector;
+@@ -91,14 +92,34 @@ template<typename Scalar> void test_sparseqr_scalar()
+     exit(0);
+     return;
+   }
+-  
+-  VERIFY_IS_APPROX(A * x, b);
+-  
+-  //Compare with a dense QR solver
++
++  // Compare with a dense QR solver
+   ColPivHouseholderQR<DenseMat> dqr(dA);
+   refX = dqr.solve(b);
+   
+-  VERIFY_IS_EQUAL(dqr.rank(), solver.rank());
++  bool rank_deficient = A.cols()>A.rows() || dqr.rank()<A.cols();
++  if(rank_deficient)
++  {
++    // rank deficient problem -> we might have to increase the threshold
++    // to get a correct solution.
++    RealScalar th = RealScalar(20)*dA.colwise().norm().maxCoeff()*(A.rows()+A.cols()) * NumTraits<RealScalar>::epsilon();
++    for(Index k=0; (k<16) && !test_isApprox(A*x,b); ++k)
++    {
++      th *= RealScalar(10);
++      solver.setPivotThreshold(th);
++      solver.compute(A);
++      x = solver.solve(b);
++    }
++  }
++
++  VERIFY_IS_APPROX(A * x, b);
++  
++  // For rank deficient problem, the estimated rank might
++  // be slightly off, so let's only raise a warning in such cases.
++  if(rank_deficient) ++g_test_level;
++  VERIFY_IS_EQUAL(solver.rank(), dqr.rank());
++  if(rank_deficient) --g_test_level;
++
+   if(solver.rank()==A.cols()) // full rank
+     VERIFY_IS_APPROX(x, refX);
+ //   else
+-- 
+2.24.1
+