diff options
author | Gael Guennebaud <g.gael@free.fr> | 2014-07-01 22:29:04 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2014-07-01 22:29:04 +0200 |
commit | bf334b8ae51725754f525c2ffcfbd83ffc55ff2e (patch) | |
tree | 30f69cd0be588b3b61193e78536d6d3aeda28ce4 /Eigen/src/IterativeLinearSolvers | |
parent | 324e7e8fc9a20503d3f7ee9969c886400bbf5786 (diff) |
Fix regeression in bicgstab: the threshold used to detect the need for a restart was much too large.
Diffstat (limited to 'Eigen/src/IterativeLinearSolvers')
-rw-r--r-- | Eigen/src/IterativeLinearSolvers/BiCGSTAB.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h b/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h index 7a46b51fa..dc524c225 100644 --- a/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +++ b/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h @@ -61,6 +61,7 @@ bool bicgstab(const MatrixType& mat, const Rhs& rhs, Dest& x, VectorType s(n), t(n); RealScalar tol2 = tol*tol; + RealScalar eps2 = NumTraits<Scalar>::epsilon()*NumTraits<Scalar>::epsilon(); int i = 0; int restarts = 0; @@ -69,7 +70,7 @@ bool bicgstab(const MatrixType& mat, const Rhs& rhs, Dest& x, Scalar rho_old = rho; rho = r0.dot(r); - if (internal::isMuchSmallerThan(rho,r0_sqnorm)) + if (abs(rho) < eps2*r0_sqnorm) { // The new residual vector became too orthogonal to the arbitrarily choosen direction r0 // Let's restart with a new r0: |