This bugzilla service is closed. All entries have been migrated to https://gitlab.com/libeigen/eigen
Bug 101 - Investigate newer JacobiSVD techniques
Summary: Investigate newer JacobiSVD techniques
Status: NEW
Alias: None
Product: Eigen
Classification: Unclassified
Component: SVD (show other bugs)
Version: unspecified
Hardware: All All
: --- Unknown
Assignee: Nobody
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-10-29 15:40 UTC by Benoit Jacob
Modified: 2019-12-04 09:56 UTC (History)
2 users (show)



Attachments

Description Benoit Jacob 2010-10-29 15:40:34 UTC
Reading e.g. this paper: "New fast and accurate Jacobi SVD algorithm: I. LAPACK working note" by Drmac and Veselic,
www.netlib.org/lapack/lawnspdf/lawn169.pdf

Stuff worth considering:
 * TFA claims that QR preconditioning makes JacobiSVD converge faster, and that a second LQ applied to R helps even more.
 * Parallelization (block Jacobi SVD).

However there is also lots of stuff that we DON'T want:
 * TFA claims that the second LQ does not need to be pivoting. But that will necessarily reduce the reliability of the algorithm. So if we do a LQ, either make it non-default or make it pivoting.
 * Large parts of TFA are about how working on the transposed matrix is more numerically stable: this is an artifact of them doing one-sided Jacobi SVD. Since our JacobiSVD is two-sided, we don't need to bother about this. The fact that they worry about this is quite a testament to how real the issues with one-sided Jacobi are!
Comment 1 Dirk Toewe 2019-07-19 20:23:25 UTC
One small change that I would suggest is to use a different stopping criterion. The Jacobi SVD can achieve higher relative accuracy than other Jacobi SVD methods, at least according to this paper:

http://www.netlib.org/lapack/lawnspdf/lawn15.pdf

In order to achieve this accuracy, however, I believe the stopping criterion of JacobiSVD would have to be changed. If I understand the code correctly, the current stopping criterion compares the off-diagonal values to the largest diagonal entry:

n*eps*max[i](S[i,i]) >= max[i != j]( S[i,j] )

The aforementioned paper suggests a stopping criterion along the lines of:

n*eps >= max[i != j]( |S[i,j]| / sqrt|S[i,i]*S[j,j]| )

The paper however only covers the symmetric case. Not sure how to generalize this to the non-symmetric case. My guess would be something like

n*eps >= max[i != j]( max{|S[i,j]|,|S[j,i]|} / sqrt|S[i,i]*S[j,j]| )
Comment 2 Nobody 2019-12-04 09:56:06 UTC
-- GitLab Migration Automatic Message --

This bug has been migrated to gitlab.com's GitLab instance and has been closed from further activity.

You can subscribe and participate further through the new bug through this link to our GitLab instance: https://gitlab.com/libeigen/eigen/issues/101.

Note You need to log in before you can comment on or make changes to this bug.