* gnu/packages/algebra.scm (eigen): Update to 3.3.7. [source]: Add a patch to fix a test failure. * gnu/packages/patches/eigen-stabilise-sparseqr-test.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it.
		
			
				
	
	
		
			74 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| 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
 | |
| 
 |