diff -ucr jama.orig/jama_cholesky.h jama/jama_cholesky.h *** jama.orig/jama_cholesky.h Sat Oct 16 06:07:11 2004 --- jama/jama_cholesky.h Tue May 10 11:26:54 2005 *************** *** 21,32 ****

Typical usage looks like:

! 	Array2D A(n,n);
! 	Array2D L;
  
  	 ... 
  
! 	Cholesky chol(A);
  
  	if (chol.is_spd())
  		L = chol.getL();
--- 21,32 ----
  
     

Typical usage looks like:

! 	Array2D A(n,n);
! 	Array2D L;
  
  	 ... 
  
! 	Cholesky chol(A);
  
  	if (chol.is_spd())
  		L = chol.getL();
***************
*** 110,119 ****
        // Main loop.
       for (int j = 0; j < n; j++) 
  	 {
!         double d = 0.0;
          for (int k = 0; k < j; k++) 
  		{
!             Real s = 0.0;
              for (int i = 0; i < k; i++) 
  			{
                 s += L_[k][i]*L_[j][i];
--- 110,119 ----
        // Main loop.
       for (int j = 0; j < n; j++) 
  	 {
!         Real d = 0;
          for (int k = 0; k < j; k++) 
  		{
!             Real s = 0;
              for (int i = 0; i < k; i++) 
  			{
                 s += L_[k][i]*L_[j][i];
***************
*** 123,133 ****
              isspd = isspd && (A[k][j] == A[j][k]); 
           }
           d = A[j][j] - d;
!          isspd = isspd && (d > 0.0);
!          L_[j][j] = sqrt(d > 0.0 ? d : 0.0);
           for (int k = j+1; k < n; k++) 
  		 {
!             L_[j][k] = 0.0;
           }
  	}
  }
--- 123,133 ----
              isspd = isspd && (A[k][j] == A[j][k]); 
           }
           d = A[j][j] - d;
!          isspd = isspd && (d > 0);
!          L_[j][j] = sqrt(d > 0 ? d : 0);
           for (int k = j+1; k < n; k++) 
  		 {
!             L_[j][k] = 0;
           }
  	}
  }
diff -ucr jama.orig/jama_eig.h jama/jama_eig.h
*** jama.orig/jama_eig.h	Sat Oct 16 06:07:11 2004
--- jama/jama_eig.h	Tue May 10 11:26:54 2005
***************
*** 117,133 ****
     
           // Scale to avoid under/overflow.
     
!          Real scale = 0.0;
!          Real h = 0.0;
           for (int k = 0; k < i; k++) {
              scale = scale + abs(d[k]);
           }
!          if (scale == 0.0) {
              e[i] = d[i-1];
              for (int j = 0; j < i; j++) {
                 d[j] = V[i-1][j];
!                V[i][j] = 0.0;
!                V[j][i] = 0.0;
              }
           } else {
     
--- 117,133 ----
     
           // Scale to avoid under/overflow.
     
!          Real scale = 0;
!          Real h = 0;
           for (int k = 0; k < i; k++) {
              scale = scale + abs(d[k]);
           }
!          if (scale == 0) {
              e[i] = d[i-1];
              for (int j = 0; j < i; j++) {
                 d[j] = V[i-1][j];
!                V[i][j] = 0;
!                V[j][i] = 0;
              }
           } else {
     
***************
*** 146,152 ****
              h = h - f * g;
              d[i-1] = f - g;
              for (int j = 0; j < i; j++) {
!                e[j] = 0.0;
              }
     
              // Apply similarity transformation to remaining columns.
--- 146,152 ----
              h = h - f * g;
              d[i-1] = f - g;
              for (int j = 0; j < i; j++) {
!                e[j] = 0;
              }
     
              // Apply similarity transformation to remaining columns.
***************
*** 161,167 ****
                 }
                 e[j] = g;
              }
!             f = 0.0;
              for (int j = 0; j < i; j++) {
                 e[j] /= h;
                 f += e[j] * d[j];
--- 161,167 ----
                 }
                 e[j] = g;
              }
!             f = 0;
              for (int j = 0; j < i; j++) {
                 e[j] /= h;
                 f += e[j] * d[j];
***************
*** 177,183 ****
                    V[k][j] -= (f * e[k] + g * d[k]);
                 }
                 d[j] = V[i-1][j];
!                V[i][j] = 0.0;
              }
           }
           d[i] = h;
--- 177,183 ----
                    V[k][j] -= (f * e[k] + g * d[k]);
                 }
                 d[j] = V[i-1][j];
!                V[i][j] = 0;
              }
           }
           d[i] = h;
***************
*** 187,200 ****
     
        for (int i = 0; i < n-1; i++) {
           V[n-1][i] = V[i][i];
!          V[i][i] = 1.0;
           Real h = d[i+1];
!          if (h != 0.0) {
              for (int k = 0; k <= i; k++) {
                 d[k] = V[k][i+1] / h;
              }
              for (int j = 0; j <= i; j++) {
!                Real g = 0.0;
                 for (int k = 0; k <= i; k++) {
                    g += V[k][i+1] * V[k][j];
                 }
--- 187,200 ----
     
        for (int i = 0; i < n-1; i++) {
           V[n-1][i] = V[i][i];
!          V[i][i] = 1;
           Real h = d[i+1];
!          if (h != 0) {
              for (int k = 0; k <= i; k++) {
                 d[k] = V[k][i+1] / h;
              }
              for (int j = 0; j <= i; j++) {
!                Real g = 0;
                 for (int k = 0; k <= i; k++) {
                    g += V[k][i+1] * V[k][j];
                 }
***************
*** 204,218 ****
              }
           }
           for (int k = 0; k <= i; k++) {
!             V[k][i+1] = 0.0;
           }
        }
        for (int j = 0; j < n; j++) {
           d[j] = V[n-1][j];
!          V[n-1][j] = 0.0;
        }
!       V[n-1][n-1] = 1.0;
!       e[0] = 0.0;
     } 
  
     // Symmetric tridiagonal QL algorithm.
--- 204,218 ----
              }
           }
           for (int k = 0; k <= i; k++) {
!             V[k][i+1] = 0;
           }
        }
        for (int j = 0; j < n; j++) {
           d[j] = V[n-1][j];
!          V[n-1][j] = 0;
        }
!       V[n-1][n-1] = 1;
!       e[0] = 0;
     } 
  
     // Symmetric tridiagonal QL algorithm.
***************
*** 227,237 ****
        for (int i = 1; i < n; i++) {
           e[i-1] = e[i];
        }
!       e[n-1] = 0.0;
     
!       Real f = 0.0;
!       Real tst1 = 0.0;
!       Real eps = pow(2.0,-52.0);
        for (int l = 0; l < n; l++) {
  
           // Find small subdiagonal element
--- 227,237 ----
        for (int i = 1; i < n; i++) {
           e[i-1] = e[i];
        }
!       e[n-1] = 0;
     
!       Real f = 0;
!       Real tst1 = 0;
!       Real eps = pow(2,-52);
        for (int l = 0; l < n; l++) {
  
           // Find small subdiagonal element
***************
*** 259,266 ****
                 // Compute implicit shift
     
                 Real g = d[l];
!                Real p = (d[l+1] - g) / (2.0 * e[l]);
!                Real r = hypot(p,1.0);
                 if (p < 0) {
                    r = -r;
                 }
--- 259,266 ----
                 // Compute implicit shift
     
                 Real g = d[l];
!                Real p = (d[l+1] - g) / (2 * e[l]);
!                Real r = hypot(p,1);
                 if (p < 0) {
                    r = -r;
                 }
***************
*** 276,287 ****
                 // Implicit QL transformation.
     
                 p = d[m];
!                Real c = 1.0;
                 Real c2 = c;
                 Real c3 = c;
                 Real el1 = e[l+1];
!                Real s = 0.0;
!                Real s2 = 0.0;
                 for (int i = m-1; i >= l; i--) {
                    c3 = c2;
                    c2 = c;
--- 276,287 ----
                 // Implicit QL transformation.
     
                 p = d[m];
!                Real c = 1;
                 Real c2 = c;
                 Real c3 = c;
                 Real el1 = e[l+1];
!                Real s = 0;
!                Real s2 = 0;
                 for (int i = m-1; i >= l; i--) {
                    c3 = c2;
                    c2 = c;
***************
*** 312,318 ****
              } while (abs(e[l]) > eps*tst1);
           }
           d[l] = d[l] + f;
!          e[l] = 0.0;
        }
       
        // Sort eigenvalues and corresponding vectors.
--- 312,318 ----
              } while (abs(e[l]) > eps*tst1);
           }
           d[l] = d[l] + f;
!          e[l] = 0;
        }
       
        // Sort eigenvalues and corresponding vectors.
***************
*** 354,368 ****
     
           // Scale column.
     
!          Real scale = 0.0;
           for (int i = m; i <= high; i++) {
              scale = scale + abs(H[i][m-1]);
           }
!          if (scale != 0.0) {
     
              // Compute Householder transformation.
     
!             Real h = 0.0;
              for (int i = high; i >= m; i--) {
                 ort[i] = H[i][m-1]/scale;
                 h += ort[i] * ort[i];
--- 354,368 ----
     
           // Scale column.
     
!          Real scale = 0;
           for (int i = m; i <= high; i++) {
              scale = scale + abs(H[i][m-1]);
           }
!          if (scale != 0) {
     
              // Compute Householder transformation.
     
!             Real h = 0;
              for (int i = high; i >= m; i--) {
                 ort[i] = H[i][m-1]/scale;
                 h += ort[i] * ort[i];
***************
*** 378,384 ****
              // H = (I-u*u'/h)*H*(I-u*u')/h)
     
              for (int j = m; j < n; j++) {
!                Real f = 0.0;
                 for (int i = high; i >= m; i--) {
                    f += ort[i]*H[i][j];
                 }
--- 378,384 ----
              // H = (I-u*u'/h)*H*(I-u*u')/h)
     
              for (int j = m; j < n; j++) {
!                Real f = 0;
                 for (int i = high; i >= m; i--) {
                    f += ort[i]*H[i][j];
                 }
***************
*** 389,395 ****
             }
     
             for (int i = 0; i <= high; i++) {
!                Real f = 0.0;
                 for (int j = high; j >= m; j--) {
                    f += ort[j]*H[i][j];
                 }
--- 389,395 ----
             }
     
             for (int i = 0; i <= high; i++) {
!                Real f = 0;
                 for (int j = high; j >= m; j--) {
                    f += ort[j]*H[i][j];
                 }
***************
*** 407,423 ****
  
        for (int i = 0; i < n; i++) {
           for (int j = 0; j < n; j++) {
!             V[i][j] = (i == j ? 1.0 : 0.0);
           }
        }
  
        for (int m = high-1; m >= low+1; m--) {
!          if (H[m][m-1] != 0.0) {
              for (int i = m+1; i <= high; i++) {
                 ort[i] = H[i][m-1];
              }
              for (int j = m; j <= high; j++) {
!                Real g = 0.0;
                 for (int i = m; i <= high; i++) {
                    g += ort[i] * V[i][j];
                 }
--- 407,423 ----
  
        for (int i = 0; i < n; i++) {
           for (int j = 0; j < n; j++) {
!             V[i][j] = (i == j ? 1 : 0);
           }
        }
  
        for (int m = high-1; m >= low+1; m--) {
!          if (H[m][m-1] != 0) {
              for (int i = m+1; i <= high; i++) {
                 ort[i] = H[i][m-1];
              }
              for (int j = m; j <= high; j++) {
!                Real g = 0;
                 for (int i = m; i <= high; i++) {
                    g += ort[i] * V[i][j];
                 }
***************
*** 466,482 ****
        int n = nn-1;
        int low = 0;
        int high = nn-1;
!       Real eps = pow(2.0,-52.0);
!       Real exshift = 0.0;
        Real p=0,q=0,r=0,s=0,z=0,t,w,x,y;
     
        // Store roots isolated by balanc and compute matrix norm
     
!       Real norm = 0.0;
        for (int i = 0; i < nn; i++) {
           if ((i < low) || (i > high)) {
              d[i] = H[i][i];
!             e[i] = 0.0;
           }
           for (int j = max(i-1,0); j < nn; j++) {
              norm = norm + abs(H[i][j]);
--- 466,482 ----
        int n = nn-1;
        int low = 0;
        int high = nn-1;
!       Real eps = pow(2,-52);
!       Real exshift = 0;
        Real p=0,q=0,r=0,s=0,z=0,t,w,x,y;
     
        // Store roots isolated by balanc and compute matrix norm
     
!       Real norm = 0;
        for (int i = 0; i < nn; i++) {
           if ((i < low) || (i > high)) {
              d[i] = H[i][i];
!             e[i] = 0;
           }
           for (int j = max(i-1,0); j < nn; j++) {
              norm = norm + abs(H[i][j]);
***************
*** 493,499 ****
           int l = n;
           while (l > low) {
              s = abs(H[l-1][l-1]) + abs(H[l][l]);
!             if (s == 0.0) {
                 s = norm;
              }
              if (abs(H[l][l-1]) < eps * s) {
--- 493,499 ----
           int l = n;
           while (l > low) {
              s = abs(H[l-1][l-1]) + abs(H[l][l]);
!             if (s == 0) {
                 s = norm;
              }
              if (abs(H[l][l-1]) < eps * s) {
***************
*** 508,514 ****
           if (l == n) {
              H[n][n] = H[n][n] + exshift;
              d[n] = H[n][n];
!             e[n] = 0.0;
              n--;
              iter = 0;
     
--- 508,514 ----
           if (l == n) {
              H[n][n] = H[n][n] + exshift;
              d[n] = H[n][n];
!             e[n] = 0;
              n--;
              iter = 0;
     
***************
*** 516,522 ****
     
           } else if (l == n-1) {
              w = H[n][n-1] * H[n-1][n];
!             p = (H[n-1][n-1] - H[n][n]) / 2.0;
              q = p * p + w;
              z = sqrt(abs(q));
              H[n][n] = H[n][n] + exshift;
--- 516,522 ----
     
           } else if (l == n-1) {
              w = H[n][n-1] * H[n-1][n];
!             p = (H[n-1][n-1] - H[n][n]) / 2;
              q = p * p + w;
              z = sqrt(abs(q));
              H[n][n] = H[n][n] + exshift;
***************
*** 533,543 ****
                 }
                 d[n-1] = x + z;
                 d[n] = d[n-1];
!                if (z != 0.0) {
                    d[n] = x - w / z;
                 }
!                e[n-1] = 0.0;
!                e[n] = 0.0;
                 x = H[n][n-1];
                 s = abs(x) + abs(z);
                 p = x / s;
--- 533,543 ----
                 }
                 d[n-1] = x + z;
                 d[n] = d[n-1];
!                if (z != 0) {
                    d[n] = x - w / z;
                 }
!                e[n-1] = 0;
!                e[n] = 0;
                 x = H[n][n-1];
                 s = abs(x) + abs(z);
                 p = x / s;
***************
*** 588,595 ****
              // Form shift
     
              x = H[n][n];
!             y = 0.0;
!             w = 0.0;
              if (l < n) {
                 y = H[n-1][n-1];
                 w = H[n][n-1] * H[n-1][n];
--- 588,595 ----
              // Form shift
     
              x = H[n][n];
!             y = 0;
!             w = 0;
              if (l < n) {
                 y = H[n-1][n-1];
                 w = H[n][n-1] * H[n-1][n];
***************
*** 603,616 ****
                    H[i][i] -= x;
                 }
                 s = abs(H[n][n-1]) + abs(H[n-1][n-2]);
!                x = y = 0.75 * s;
!                w = -0.4375 * s * s;
              }
  
              // MATLAB's new ad hoc shift
  
              if (iter == 30) {
!                 s = (y - x) / 2.0;
                  s = s * s + w;
                  if (s > 0) {
                      s = sqrt(s);
--- 603,616 ----
                    H[i][i] -= x;
                 }
                 s = abs(H[n][n-1]) + abs(H[n-1][n-2]);
!                x = y = 3/4 * s;
!                w = -4375/10000 * s * s;
              }
  
              // MATLAB's new ad hoc shift
  
              if (iter == 30) {
!                 s = (y - x) / 2;
                  s = s * s + w;
                  if (s > 0) {
                      s = sqrt(s);
***************
*** 617,628 ****
                      if (y < x) {
                         s = -s;
                      }
!                     s = x - w / ((y - x) / 2.0 + s);
                      for (int i = low; i <= n; i++) {
                         H[i][i] -= s;
                      }
                      exshift += s;
!                     x = y = w = 0.964;
                  }
              }
     
--- 617,628 ----
                      if (y < x) {
                         s = -s;
                      }
!                     s = x - w / ((y - x) / 2 + s);
                      for (int i = low; i <= n; i++) {
                         H[i][i] -= s;
                      }
                      exshift += s;
!                     x = y = w = 964/1000;
                  }
              }
     
***************
*** 654,662 ****
              }
     
              for (int i = m+2; i <= n; i++) {
!                H[i][i-2] = 0.0;
                 if (i > m+2) {
!                   H[i][i-3] = 0.0;
                 }
              }
     
--- 654,662 ----
              }
     
              for (int i = m+2; i <= n; i++) {
!                H[i][i-2] = 0;
                 if (i > m+2) {
!                   H[i][i-3] = 0;
                 }
              }
     
***************
*** 667,681 ****
                 if (k != m) {
                    p = H[k][k-1];
                    q = H[k+1][k-1];
!                   r = (notlast ? H[k+2][k-1] : 0.0);
                    x = abs(p) + abs(q) + abs(r);
!                   if (x != 0.0) {
                       p = p / x;
                       q = q / x;
                       r = r / x;
                    }
                 }
!                if (x == 0.0) {
                    break;
                 }
                 s = sqrt(p * p + q * q + r * r);
--- 667,681 ----
                 if (k != m) {
                    p = H[k][k-1];
                    q = H[k+1][k-1];
!                   r = (notlast ? H[k+2][k-1] : 0);
                    x = abs(p) + abs(q) + abs(r);
!                   if (x != 0) {
                       p = p / x;
                       q = q / x;
                       r = r / x;
                    }
                 }
!                if (x == 0) {
                    break;
                 }
                 s = sqrt(p * p + q * q + r * r);
***************
*** 737,743 ****
        
        // Backsubstitute to find vectors of upper triangular form
  
!       if (norm == 0.0) {
           return;
        }
     
--- 737,743 ----
        
        // Backsubstitute to find vectors of upper triangular form
  
!       if (norm == 0) {
           return;
        }
     
***************
*** 749,768 ****
     
           if (q == 0) {
              int l = n;
!             H[n][n] = 1.0;
              for (int i = n-1; i >= 0; i--) {
                 w = H[i][i] - p;
!                r = 0.0;
                 for (int j = l; j <= n; j++) {
                    r = r + H[i][j] * H[j][n];
                 }
!                if (e[i] < 0.0) {
                    z = w;
                    s = r;
                 } else {
                    l = i;
!                   if (e[i] == 0.0) {
!                      if (w != 0.0) {
                          H[i][n] = -r / w;
                       } else {
                          H[i][n] = -r / (eps * norm);
--- 749,768 ----
     
           if (q == 0) {
              int l = n;
!             H[n][n] = 1;
              for (int i = n-1; i >= 0; i--) {
                 w = H[i][i] - p;
!                r = 0;
                 for (int j = l; j <= n; j++) {
                    r = r + H[i][j] * H[j][n];
                 }
!                if (e[i] < 0) {
                    z = w;
                    s = r;
                 } else {
                    l = i;
!                   if (e[i] == 0) {
!                      if (w != 0) {
                          H[i][n] = -r / w;
                       } else {
                          H[i][n] = -r / (eps * norm);
***************
*** 805,820 ****
                 H[n-1][n-1] = q / H[n][n-1];
                 H[n-1][n] = -(H[n][n] - p) / H[n][n-1];
              } else {
!                cdiv(0.0,-H[n-1][n],H[n-1][n-1]-p,q);
                 H[n-1][n-1] = cdivr;
                 H[n-1][n] = cdivi;
              }
!             H[n][n-1] = 0.0;
!             H[n][n] = 1.0;
              for (int i = n-2; i >= 0; i--) {
                 Real ra,sa,vr,vi;
!                ra = 0.0;
!                sa = 0.0;
                 for (int j = l; j <= n; j++) {
                    ra = ra + H[i][j] * H[j][n-1];
                    sa = sa + H[i][j] * H[j][n];
--- 805,820 ----
                 H[n-1][n-1] = q / H[n][n-1];
                 H[n-1][n] = -(H[n][n] - p) / H[n][n-1];
              } else {
!                cdiv(0,-H[n-1][n],H[n-1][n-1]-p,q);
                 H[n-1][n-1] = cdivr;
                 H[n-1][n] = cdivi;
              }
!             H[n][n-1] = 0;
!             H[n][n] = 1;
              for (int i = n-2; i >= 0; i--) {
                 Real ra,sa,vr,vi;
!                ra = 0;
!                sa = 0;
                 for (int j = l; j <= n; j++) {
                    ra = ra + H[i][j] * H[j][n-1];
                    sa = sa + H[i][j] * H[j][n];
***************
*** 821,827 ****
                 }
                 w = H[i][i] - p;
     
!                if (e[i] < 0.0) {
                    z = w;
                    r = ra;
                    s = sa;
--- 821,827 ----
                 }
                 w = H[i][i] - p;
     
!                if (e[i] < 0) {
                    z = w;
                    r = ra;
                    s = sa;
***************
*** 838,845 ****
                       x = H[i][i+1];
                       y = H[i+1][i];
                       vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q;
!                      vi = (d[i] - p) * 2.0 * q;
!                      if ((vr == 0.0) && (vi == 0.0)) {
                          vr = eps * norm * (abs(w) + abs(q) +
                          abs(x) + abs(y) + abs(z));
                       }
--- 838,845 ----
                       x = H[i][i+1];
                       y = H[i+1][i];
                       vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q;
!                      vi = (d[i] - p) * 2 * q;
!                      if ((vr == 0) && (vi == 0)) {
                          vr = eps * norm * (abs(w) + abs(q) +
                          abs(x) + abs(y) + abs(z));
                       }
***************
*** 884,890 ****
     
        for (int j = nn-1; j >= low; j--) {
           for (int i = low; i <= high; i++) {
!             z = 0.0;
              for (int k = low; k <= min(j,high); k++) {
                 z = z + V[i][k] * H[k][j];
              }
--- 884,890 ----
     
        for (int j = nn-1; j >= low; j--) {
           for (int i = low; i <= high; i++) {
!             z = 0;
              for (int k = low; k <= min(j,high); k++) {
                 z = z + V[i][k] * H[k][j];
              }
***************
*** 1011,1017 ****
        D = Array2D(n,n);
        for (int i = 0; i < n; i++) {
           for (int j = 0; j < n; j++) {
!             D[i][j] = 0.0;
           }
           D[i][i] = d[i];
           if (e[i] > 0) {
--- 1011,1017 ----
        D = Array2D(n,n);
        for (int i = 0; i < n; i++) {
           for (int j = 0; j < n; j++) {
!             D[i][j] = 0;
           }
           D[i][i] = d[i];
           if (e[i] > 0) {
diff -ucr jama.orig/jama_lu.h jama/jama_lu.h
*** jama.orig/jama_lu.h	Wed Nov 17 04:28:42 2004
--- jama/jama_lu.h	Tue May 10 11:26:54 2005
***************
*** 107,113 ****
              // Most of the time is spent in the following dot product.
  
              int kmax = min(i,j);
!             double s = 0.0;
              for (int k = 0; k < kmax; k++) {
                 s += LUrowi[k]*LUcolj[k];
              }
--- 107,113 ----
              // Most of the time is spent in the following dot product.
  
              int kmax = min(i,j);
!             Real s = 0;
              for (int k = 0; k < kmax; k++) {
                 s += LUrowi[k]*LUcolj[k];
              }
***************
*** 126,132 ****
           if (p != j) {
  		    int k=0;
              for (k = 0; k < n; k++) {
!                double t = LU_[p][k]; 
  			   LU_[p][k] = LU_[j][k]; 
  			   LU_[j][k] = t;
              }
--- 126,132 ----
           if (p != j) {
  		    int k=0;
              for (k = 0; k < n; k++) {
!                Real t = LU_[p][k]; 
  			   LU_[p][k] = LU_[j][k]; 
  			   LU_[j][k] = t;
              }
***************
*** 138,144 ****
  
           // Compute multipliers.
           
!          if ((j < m) && (LU_[j][j] != 0.0)) {
              for (int i = j+1; i < m; i++) {
                 LU_[i][j] /= LU_[j][j];
              }
--- 138,144 ----
  
           // Compute multipliers.
           
!          if ((j < m) && (LU_[j][j] != 0)) {
              for (int i = j+1; i < m; i++) {
                 LU_[i][j] /= LU_[j][j];
              }
***************
*** 171,179 ****
              if (i > j) {
                 L_[i][j] = LU_[i][j];
              } else if (i == j) {
!                L_[i][j] = 1.0;
              } else {
!                L_[i][j] = 0.0;
              }
           }
        }
--- 171,179 ----
              if (i > j) {
                 L_[i][j] = LU_[i][j];
              } else if (i == j) {
!                L_[i][j] = 1;
              } else {
!                L_[i][j] = 0;
              }
           }
        }
***************
*** 191,197 ****
              if (i <= j) {
                 U_[i][j] = LU_[i][j];
              } else {
!                U_[i][j] = 0.0;
              }
           }
        }
--- 191,197 ----
              if (i <= j) {
                 U_[i][j] = LU_[i][j];
              } else {
!                U_[i][j] = 0;
              }
           }
        }
diff -ucr jama.orig/jama_qr.h jama/jama_qr.h
*** jama.orig/jama_qr.h	Sat Oct 16 06:07:11 2004
--- jama/jama_qr.h	Tue May 10 11:26:54 2005
***************
*** 76,82 ****
              nrm = hypot(nrm,QR_[i][k]);
           }
  
!          if (nrm != 0.0) {
              // Form k-th Householder vector.
              if (QR_[k][k] < 0) {
                 nrm = -nrm;
--- 76,82 ----
              nrm = hypot(nrm,QR_[i][k]);
           }
  
!          if (nrm != 0) {
              // Form k-th Householder vector.
              if (QR_[k][k] < 0) {
                 nrm = -nrm;
***************
*** 84,94 ****
              for (i = k; i < m; i++) {
                 QR_[i][k] /= nrm;
              }
!             QR_[k][k] += 1.0;
  
              // Apply transformation to remaining columns.
              for (j = k+1; j < n; j++) {
!                Real s = 0.0; 
                 for (i = k; i < m; i++) {
                    s += QR_[i][k]*QR_[i][j];
                 }
--- 84,94 ----
              for (i = k; i < m; i++) {
                 QR_[i][k] /= nrm;
              }
!             QR_[k][k] += 1;
  
              // Apply transformation to remaining columns.
              for (j = k+1; j < n; j++) {
!                Real s = 0; 
                 for (i = k; i < m; i++) {
                    s += QR_[i][k]*QR_[i][j];
                 }
***************
*** 141,147 ****
              if (i >= j) {
                 H[i][j] = QR_[i][j];
              } else {
!                H[i][j] = 0.0;
              }
           }
        }
--- 141,147 ----
              if (i >= j) {
                 H[i][j] = QR_[i][j];
              } else {
!                H[i][j] = 0;
              }
           }
        }
***************
*** 164,170 ****
              } else if (i == j) {
                 R[i][j] = Rdiag[i];
              } else {
!                R[i][j] = 0.0;
              }
           }
        }
--- 164,170 ----
              } else if (i == j) {
                 R[i][j] = Rdiag[i];
              } else {
!                R[i][j] = 0;
              }
           }
        }
***************
*** 187,198 ****
  	  TNT::Array2D Q(m,n);
        for (k = n-1; k >= 0; k--) {
           for (i = 0; i < m; i++) {
!             Q[i][k] = 0.0;
           }
!          Q[k][k] = 1.0;
           for (j = k; j < n; j++) {
              if (QR_[k][k] != 0) {
!                Real s = 0.0;
                 for (i = k; i < m; i++) {
                    s += QR_[i][k]*Q[i][j];
                 }
--- 187,198 ----
  	  TNT::Array2D Q(m,n);
        for (k = n-1; k >= 0; k--) {
           for (i = 0; i < m; i++) {
!             Q[i][k] = 0;
           }
!          Q[k][k] = 1;
           for (j = k; j < n; j++) {
              if (QR_[k][k] != 0) {
!                Real s = 0;
                 for (i = k; i < m; i++) {
                    s += QR_[i][k]*Q[i][j];
                 }
***************
*** 229,235 ****
        // Compute Y = transpose(Q)*b
        for (int k = 0; k < n; k++) 
  	  {
!             Real s = 0.0; 
              for (int i = k; i < m; i++) 
  			{
                 s += QR_[i][k]*x[i];
--- 229,235 ----
        // Compute Y = transpose(Q)*b
        for (int k = 0; k < n; k++) 
  	  {
!             Real s = 0; 
              for (int i = k; i < m; i++) 
  			{
                 s += QR_[i][k]*x[i];
***************
*** 282,288 ****
        // Compute Y = transpose(Q)*B
        for (k = 0; k < n; k++) {
           for (j = 0; j < nx; j++) {
!             Real s = 0.0; 
              for (i = k; i < m; i++) {
                 s += QR_[i][k]*X[i][j];
              }
--- 282,288 ----
        // Compute Y = transpose(Q)*B
        for (k = 0; k < n; k++) {
           for (j = 0; j < nx; j++) {
!             Real s = 0; 
              for (i = k; i < m; i++) {
                 s += QR_[i][k]*X[i][j];
              }
diff -ucr jama.orig/jama_svd.h jama/jama_svd.h
*** jama.orig/jama_svd.h	Sat Nov 13 03:39:54 2004
--- jama/jama_svd.h	Tue May 10 11:26:54 2005
***************
*** 78,100 ****
              for (i = k; i < m; i++) {
                 s[k] = hypot(s[k],A[i][k]);
              }
!             if (s[k] != 0.0) {
!                if (A[k][k] < 0.0) {
                    s[k] = -s[k];
                 }
                 for (i = k; i < m; i++) {
                    A[i][k] /= s[k];
                 }
!                A[k][k] += 1.0;
              }
              s[k] = -s[k];
           }
           for (j = k+1; j < n; j++) {
!             if ((k < nct) && (s[k] != 0.0))  {
  
              // Apply the transformation.
  
!                double t = 0;
                 for (i = k; i < m; i++) {
                    t += A[i][k]*A[i][j];
                 }
--- 78,100 ----
              for (i = k; i < m; i++) {
                 s[k] = hypot(s[k],A[i][k]);
              }
!             if (s[k] != 0) {
!                if (A[k][k] < 0) {
                    s[k] = -s[k];
                 }
                 for (i = k; i < m; i++) {
                    A[i][k] /= s[k];
                 }
!                A[k][k] += 1;
              }
              s[k] = -s[k];
           }
           for (j = k+1; j < n; j++) {
!             if ((k < nct) && (s[k] != 0))  {
  
              // Apply the transformation.
  
!                Real t = 0;
                 for (i = k; i < m; i++) {
                    t += A[i][k]*A[i][j];
                 }
***************
*** 127,148 ****
              for (i = k+1; i < n; i++) {
                 e[k] = hypot(e[k],e[i]);
              }
!             if (e[k] != 0.0) {
!                if (e[k+1] < 0.0) {
                    e[k] = -e[k];
                 }
                 for (i = k+1; i < n; i++) {
                    e[i] /= e[k];
                 }
!                e[k+1] += 1.0;
              }
              e[k] = -e[k];
!             if ((k+1 < m) & (e[k] != 0.0)) {
  
              // Apply the transformation.
  
                 for (i = k+1; i < m; i++) {
!                   work[i] = 0.0;
                 }
                 for (j = k+1; j < n; j++) {
                    for (i = k+1; i < m; i++) {
--- 127,148 ----
              for (i = k+1; i < n; i++) {
                 e[k] = hypot(e[k],e[i]);
              }
!             if (e[k] != 0) {
!                if (e[k+1] < 0) {
                    e[k] = -e[k];
                 }
                 for (i = k+1; i < n; i++) {
                    e[i] /= e[k];
                 }
!                e[k+1] += 1;
              }
              e[k] = -e[k];
!             if ((k+1 < m) & (e[k] != 0)) {
  
              // Apply the transformation.
  
                 for (i = k+1; i < m; i++) {
!                   work[i] = 0;
                 }
                 for (j = k+1; j < n; j++) {
                    for (i = k+1; i < m; i++) {
***************
*** 150,156 ****
                    }
                 }
                 for (j = k+1; j < n; j++) {
!                   double t = -e[j]/e[k+1];
                    for (i = k+1; i < m; i++) {
                       A[i][j] += t*work[i];
                    }
--- 150,156 ----
                    }
                 }
                 for (j = k+1; j < n; j++) {
!                   Real t = -e[j]/e[k+1];
                    for (i = k+1; i < m; i++) {
                       A[i][j] += t*work[i];
                    }
***************
*** 175,186 ****
           s[nct] = A[nct][nct];
        }
        if (m < p) {
!          s[p-1] = 0.0;
        }
        if (nrt+1 < p) {
           e[nrt] = A[nrt][p-1];
        }
!       e[p-1] = 0.0;
  
        // If required, generate U.
  
--- 175,186 ----
           s[nct] = A[nct][nct];
        }
        if (m < p) {
!          s[p-1] = 0;
        }
        if (nrt+1 < p) {
           e[nrt] = A[nrt][p-1];
        }
!       e[p-1] = 0;
  
        // If required, generate U.
  
***************
*** 187,200 ****
        if (wantu) {
           for (j = nct; j < nu; j++) {
              for (i = 0; i < m; i++) {
!                U[i][j] = 0.0;
              }
!             U[j][j] = 1.0;
           }
           for (k = nct-1; k >= 0; k--) {
!             if (s[k] != 0.0) {
                 for (j = k+1; j < nu; j++) {
!                   double t = 0;
                    for (i = k; i < m; i++) {
                       t += U[i][k]*U[i][j];
                    }
--- 187,200 ----
        if (wantu) {
           for (j = nct; j < nu; j++) {
              for (i = 0; i < m; i++) {
!                U[i][j] = 0;
              }
!             U[j][j] = 1;
           }
           for (k = nct-1; k >= 0; k--) {
!             if (s[k] != 0) {
                 for (j = k+1; j < nu; j++) {
!                   Real t = 0;
                    for (i = k; i < m; i++) {
                       t += U[i][k]*U[i][j];
                    }
***************
*** 206,220 ****
                 for (i = k; i < m; i++ ) {
                    U[i][k] = -U[i][k];
                 }
!                U[k][k] = 1.0 + U[k][k];
                 for (i = 0; i < k-1; i++) {
!                   U[i][k] = 0.0;
                 }
              } else {
                 for (i = 0; i < m; i++) {
!                   U[i][k] = 0.0;
                 }
!                U[k][k] = 1.0;
              }
           }
        }
--- 206,220 ----
                 for (i = k; i < m; i++ ) {
                    U[i][k] = -U[i][k];
                 }
!                U[k][k] = 1 + U[k][k];
                 for (i = 0; i < k-1; i++) {
!                   U[i][k] = 0;
                 }
              } else {
                 for (i = 0; i < m; i++) {
!                   U[i][k] = 0;
                 }
!                U[k][k] = 1;
              }
           }
        }
***************
*** 223,231 ****
  
        if (wantv) {
           for (k = n-1; k >= 0; k--) {
!             if ((k < nrt) & (e[k] != 0.0)) {
                 for (j = k+1; j < nu; j++) {
!                   double t = 0;
                    for (i = k+1; i < n; i++) {
                       t += V[i][k]*V[i][j];
                    }
--- 223,231 ----
  
        if (wantv) {
           for (k = n-1; k >= 0; k--) {
!             if ((k < nrt) & (e[k] != 0)) {
                 for (j = k+1; j < nu; j++) {
!                   Real t = 0;
                    for (i = k+1; i < n; i++) {
                       t += V[i][k]*V[i][j];
                    }
***************
*** 236,244 ****
                 }
              }
              for (i = 0; i < n; i++) {
!                V[i][k] = 0.0;
              }
!             V[k][k] = 1.0;
           }
        }
  
--- 236,244 ----
                 }
              }
              for (i = 0; i < n; i++) {
!                V[i][k] = 0;
              }
!             V[k][k] = 1;
           }
        }
  
***************
*** 246,252 ****
  
        int pp = p-1;
        int iter = 0;
!       double eps = pow(2.0,-52.0);
        while (p > 0) {
           int k=0;
  		 int kase=0;
--- 246,252 ----
  
        int pp = p-1;
        int iter = 0;
!       Real eps = pow(2,-52);
        while (p > 0) {
           int k=0;
  		 int kase=0;
***************
*** 268,274 ****
                 break;
              }
              if (abs(e[k]) <= eps*(abs(s[k]) + abs(s[k+1]))) {
!                e[k] = 0.0;
                 break;
              }
           }
--- 268,274 ----
                 break;
              }
              if (abs(e[k]) <= eps*(abs(s[k]) + abs(s[k+1]))) {
!                e[k] = 0;
                 break;
              }
           }
***************
*** 280,289 ****
                 if (ks == k) {
                    break;
                 }
!                double t = (ks != p ? abs(e[ks]) : 0.) + 
!                           (ks != k+1 ? abs(e[ks-1]) : 0.);
                 if (abs(s[ks]) <= eps*t)  {
!                   s[ks] = 0.0;
                    break;
                 }
              }
--- 280,289 ----
                 if (ks == k) {
                    break;
                 }
!                Real t = (ks != p ? abs(e[ks]) : 0) + 
!                           (ks != k+1 ? abs(e[ks-1]) : 0);
                 if (abs(s[ks]) <= eps*t)  {
!                   s[ks] = 0;
                    break;
                 }
              }
***************
*** 305,316 ****
              // Deflate negligible s(p).
  
              case 1: {
!                double f = e[p-2];
!                e[p-2] = 0.0;
                 for (j = p-2; j >= k; j--) {
!                   double t = hypot(s[j],f);
!                   double cs = s[j]/t;
!                   double sn = f/t;
                    s[j] = t;
                    if (j != k) {
                       f = -sn*e[j-1];
--- 305,316 ----
              // Deflate negligible s(p).
  
              case 1: {
!                Real f = e[p-2];
!                e[p-2] = 0;
                 for (j = p-2; j >= k; j--) {
!                   Real t = hypot(s[j],f);
!                   Real cs = s[j]/t;
!                   Real sn = f/t;
                    s[j] = t;
                    if (j != k) {
                       f = -sn*e[j-1];
***************
*** 330,341 ****
              // Split at negligible s(k).
  
              case 2: {
!                double f = e[k-1];
!                e[k-1] = 0.0;
                 for (j = k; j < p; j++) {
!                   double t = hypot(s[j],f);
!                   double cs = s[j]/t;
!                   double sn = f/t;
                    s[j] = t;
                    f = -sn*e[j];
                    e[j] = cs*e[j];
--- 330,341 ----
              // Split at negligible s(k).
  
              case 2: {
!                Real f = e[k-1];
!                e[k-1] = 0;
                 for (j = k; j < p; j++) {
!                   Real t = hypot(s[j],f);
!                   Real cs = s[j]/t;
!                   Real sn = f/t;
                    s[j] = t;
                    f = -sn*e[j];
                    e[j] = cs*e[j];
***************
*** 356,388 ****
  
                 // Calculate the shift.
     
!                double scale = max(max(max(max(
                         abs(s[p-1]),abs(s[p-2])),abs(e[p-2])), 
                         abs(s[k])),abs(e[k]));
!                double sp = s[p-1]/scale;
!                double spm1 = s[p-2]/scale;
!                double epm1 = e[p-2]/scale;
!                double sk = s[k]/scale;
!                double ek = e[k]/scale;
!                double b = ((spm1 + sp)*(spm1 - sp) + epm1*epm1)/2.0;
!                double c = (sp*epm1)*(sp*epm1);
!                double shift = 0.0;
!                if ((b != 0.0) || (c != 0.0)) {
                    shift = sqrt(b*b + c);
!                   if (b < 0.0) {
                       shift = -shift;
                    }
                    shift = c/(b + shift);
                 }
!                double f = (sk + sp)*(sk - sp) + shift;
!                double g = sk*ek;
     
                 // Chase zeros.
     
                 for (j = k; j < p-1; j++) {
!                   double t = hypot(f,g);
!                   double cs = f/t;
!                   double sn = g/t;
                    if (j != k) {
                       e[j-1] = t;
                    }
--- 356,388 ----
  
                 // Calculate the shift.
     
!                Real scale = max(max(max(max(
                         abs(s[p-1]),abs(s[p-2])),abs(e[p-2])), 
                         abs(s[k])),abs(e[k]));
!                Real sp = s[p-1]/scale;
!                Real spm1 = s[p-2]/scale;
!                Real epm1 = e[p-2]/scale;
!                Real sk = s[k]/scale;
!                Real ek = e[k]/scale;
!                Real b = ((spm1 + sp)*(spm1 - sp) + epm1*epm1)/2;
!                Real c = (sp*epm1)*(sp*epm1);
!                Real shift = 0;
!                if ((b != 0) || (c != 0)) {
                    shift = sqrt(b*b + c);
!                   if (b < 0) {
                       shift = -shift;
                    }
                    shift = c/(b + shift);
                 }
!                Real f = (sk + sp)*(sk - sp) + shift;
!                Real g = sk*ek;
     
                 // Chase zeros.
     
                 for (j = k; j < p-1; j++) {
!                   Real t = hypot(f,g);
!                   Real cs = f/t;
!                   Real sn = g/t;
                    if (j != k) {
                       e[j-1] = t;
                    }
***************
*** 424,431 ****
  
                 // Make the singular values positive.
     
!                if (s[k] <= 0.0) {
!                   s[k] = (s[k] < 0.0 ? -s[k] : 0.0);
                    if (wantv) {
                       for (i = 0; i <= pp; i++) {
                          V[i][k] = -V[i][k];
--- 424,431 ----
  
                 // Make the singular values positive.
     
!                if (s[k] <= 0) {
!                   s[k] = (s[k] < 0 ? -s[k] : 0);
                    if (wantv) {
                       for (i = 0; i <= pp; i++) {
                          V[i][k] = -V[i][k];
***************
*** 439,445 ****
                    if (s[k] >= s[k+1]) {
                       break;
                    }
!                   double t = s[k];
                    s[k] = s[k+1];
                    s[k+1] = t;
                    if (wantv && (k < n-1)) {
--- 439,445 ----
                    if (s[k] >= s[k+1]) {
                       break;
                    }
!                   Real t = s[k];
                    s[k] = s[k+1];
                    s[k+1] = t;
                    if (wantv && (k < n-1)) {
***************
*** 497,503 ****
     	  A = Array2D(n,n);
        for (int i = 0; i < n; i++) {
           for (int j = 0; j < n; j++) {
!             A[i][j] = 0.0;
           }
           A[i][i] = s[i];
        }
--- 497,503 ----
     	  A = Array2D(n,n);
        for (int i = 0; i < n; i++) {
           for (int j = 0; j < n; j++) {
!             A[i][j] = 0;
           }
           A[i][i] = s[i];
        }
***************
*** 505,517 ****
  
     /** Two norm  (max(S)) */
  
!    double norm2 () {
        return s[0];
     }
  
     /** Two norm of condition number (max(S)/min(S)) */
  
!    double cond () {
        return s[0]/s[min(m,n)-1];
     }
  
--- 505,517 ----
  
     /** Two norm  (max(S)) */
  
!    Real norm2 () {
        return s[0];
     }
  
     /** Two norm of condition number (max(S)/min(S)) */
  
!    Real cond () {
        return s[0]/s[min(m,n)-1];
     }
  
***************
*** 521,528 ****
  
     int rank () 
     {
!       double eps = pow(2.0,-52.0);
!       double tol = max(m,n)*s[0]*eps;
        int r = 0;
        for (int i = 0; i < s.dim(); i++) {
           if (s[i] > tol) {
--- 521,528 ----
  
     int rank () 
     {
!       Real eps = pow(2,-52);
!       Real tol = max(m,n)*s[0]*eps;
        int r = 0;
        for (int i = 0; i < s.dim(); i++) {
           if (s[i] > tol) {