26     int svd_eigen_HH(
const Eigen::MatrixXd &A, Eigen::MatrixXd &U, Eigen::VectorXd &S, Eigen::MatrixXd &V, Eigen::VectorXd &tmp, 
int maxiter, 
double epsilon)
 
   29         const int rows = 
static_cast<int>(A.rows());
 
   30         const int cols = 
static_cast<int>(A.cols());
 
   33         U.topLeftCorner(rows,cols)=A;
 
   35         int i(-1),its(-1),j(-1),jj(-1),k(-1),nm=0;
 
   37         bool flag,maxarg1,maxarg2;
 
   38         double anorm(0),c(0),f(0),h(0),s(0),scale(0),x(0),y(0),z(0),g(0);
 
   41         for (i=0;i<cols;i++) {
 
   47                 for (k=i;k<rows;k++) scale += fabs(U(k,i));
 
   51                     for (k=i;k<rows;k++) {
 
   56                     if (!(s>=0)) 
return -3;
 
   60                     for (j=ppi;j<cols;j++) {
 
   62                         for (s=0.0,k=i;k<rows;k++) s += U(k,i)*U(k,j);
 
   63                         if (!(h!=0)) 
return -4;
 
   66                         for (k=i;k<rows;k++) U(k,j) += f*U(k,i);
 
   68                     for (k=i;k<rows;k++) U(k,i) *= scale;
 
   74             if ((i <rows) && (i+1 != cols)) {
 
   76                 for (k=ppi;k<cols;k++) scale += fabs(U(i,k));
 
   78                     for (k=ppi;k<cols;k++) {
 
   83                     if (!(s>=0)) 
return -5;
 
   87                     if (!(h!=0)) 
return -6;
 
   88                     for (k=ppi;k<cols;k++) tmp(k)=U(i,k)/h;
 
   89                     for (j=ppi;j<rows;j++) {
 
   90                         for (s=0.0,k=ppi;k<cols;k++) s += U(j,k)*U(i,k);
 
   91                         for (k=ppi;k<cols;k++) U(j,k) += s*tmp(k);
 
   93                     for (k=ppi;k<cols;k++) U(i,k) *= scale;
 
   97             maxarg2=(fabs(S(i))+fabs(tmp(i)));
 
   98             anorm = maxarg1 > maxarg2 ? maxarg1 : maxarg2;
 
  101         for (i=cols-1;i>=0;i--) {
 
  104                     if (!(U(i,ppi)!=0)) 
return -7;
 
  105                     for (j=ppi;j<cols;j++) V(j,i)=(U(i,j)/U(i,ppi))/g;
 
  106                     for (j=ppi;j<cols;j++) {
 
  107                         for (s=0.0,k=ppi;k<cols;k++) s += U(i,k)*V(k,j);
 
  108                         for (k=ppi;k<cols;k++) V(k,j) += s*V(k,i);
 
  111                 for (j=ppi;j<cols;j++) V(i,j)=V(j,i)=0.0;
 
  118         for (i=cols-1<rows-1 ? cols-1:rows-1;i>=0;i--) {
 
  121             for (j=ppi;j<cols;j++) U(i,j)=0.0;
 
  124                 for (j=ppi;j<cols;j++) {
 
  125                     for (s=0.0,k=ppi;k<rows;k++) s += U(k,i)*U(k,j);
 
  126                     if (!(U(i,i)!=0)) 
return -8;
 
  128                     for (k=i;k<rows;k++) U(k,j) += f*U(k,i);
 
  130                 for (j=i;j<rows;j++) U(j,i) *= g;
 
  132                 for (j=i;j<rows;j++) U(j,i)=0.0;
 
  138         for (k=cols-1;k>=0;k--) { 
 
  139             for (its=1;its<=maxiter;its++) {  
 
  141                 for (ppi=k;ppi>=0;ppi--) {  
 
  143                     if ((fabs(tmp(ppi))+anorm) == anorm) {
 
  147                     if ((fabs(S(nm)+anorm) == anorm)) 
break;
 
  152                     for (i=ppi;i<=k;i++) {
 
  155                         if ((fabs(f)+anorm) == anorm) 
break;
 
  159                         if (!(h!=0)) 
return -9;
 
  163                         for (j=0;j<rows;j++) {
 
  176                         for (j=0;j<cols;j++) V(j,k)=-V(j,k);
 
  186                 if (!(h!=0&&y!=0)) 
return -10;
 
  187                 f=((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y);
 
  190                 if (!(x!=0)) 
return -11;
 
  191                 if (!((f+
SIGN(g,f))!=0)) 
return -12;
 
  192                 f=((x-z)*(x+z)+h*((y/(f+
SIGN(g,f)))-h))/x;
 
  196                 for (j=ppi;j<=nm;j++) {
 
  204                     if (!(z!=0)) 
return -13;
 
  211                     for (jj=0;jj<cols;jj++) {
 
  226                     for (jj=0;jj<rows;jj++) {
 
  240         for (i=0; i<cols; i++){
 
  244             for (j=i+1; j<cols; j++){
 
  258                 U.col(i).swap(U.col(i_max));
 
  259                 V.col(i).swap(V.col(i_max));