Author: tdunning
Date: Fri Jan 11 02:11:19 2013
New Revision: 1431808

URL: http://svn.apache.org/viewvc?rev=1431808&view=rev
Log:
MAHOUT-1139 - Fix termination test in LSMR.

Modified:
    mahout/trunk/math/src/main/java/org/apache/mahout/math/solver/LSMR.java
    mahout/trunk/math/src/test/java/org/apache/mahout/math/solver/LSMRTest.java

Modified: 
mahout/trunk/math/src/main/java/org/apache/mahout/math/solver/LSMR.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/math/src/main/java/org/apache/mahout/math/solver/LSMR.java?rev=1431808&r1=1431807&r2=1431808&view=diff
==============================================================================
--- mahout/trunk/math/src/main/java/org/apache/mahout/math/solver/LSMR.java 
(original)
+++ mahout/trunk/math/src/main/java/org/apache/mahout/math/solver/LSMR.java Fri 
Jan 11 02:11:19 2013
@@ -453,7 +453,7 @@ public final class LSMR {
         stop = StopCode.TRIVIAL;
       }
 
-      if (stop != StopCode.CONTINUE && stop.ordinal() != istop + 1) {
+      if (stop != StopCode.CONTINUE && stop.ordinal() != istop) {
         throw new IllegalStateException(String.format("bad code match %d vs 
%d", istop, stop.ordinal()));
       }
 

Modified: 
mahout/trunk/math/src/test/java/org/apache/mahout/math/solver/LSMRTest.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/math/src/test/java/org/apache/mahout/math/solver/LSMRTest.java?rev=1431808&r1=1431807&r2=1431808&view=diff
==============================================================================
--- mahout/trunk/math/src/test/java/org/apache/mahout/math/solver/LSMRTest.java 
(original)
+++ mahout/trunk/math/src/test/java/org/apache/mahout/math/solver/LSMRTest.java 
Fri Jan 11 02:11:19 2013
@@ -21,7 +21,9 @@ import org.apache.mahout.math.DenseMatri
 import org.apache.mahout.math.DenseVector;
 import org.apache.mahout.math.MahoutTestCase;
 import org.apache.mahout.math.Matrix;
+import org.apache.mahout.math.SingularValueDecomposition;
 import org.apache.mahout.math.Vector;
+import org.apache.mahout.math.function.Functions;
 import org.junit.Test;
 
 public final class LSMRTest extends MahoutTestCase {
@@ -58,6 +60,26 @@ public final class LSMRTest extends Maho
     
assertEquals(m.transpose().times(m).times(x1).minus(m.transpose().times(b)).norm(2),
 r.getNormalEquationResidual(), 1.0e-9);
   }
   
+  @Test
+  public void random() {
+    Matrix m = new DenseMatrix(200, 30).assign(Functions.random());
+
+    Vector b = new DenseVector(200).assign(1);
+
+    LSMR r = new LSMR();
+    Vector x1 = r.solve(m, b);
+
+//    assertEquals(0, m.times(x1).minus(b).norm(2), 1.0e-2);
+    double norm = new 
SingularValueDecomposition(m).getS().viewDiagonal().norm(2);
+    double actual = 
m.transpose().times(m).times(x1).minus(m.transpose().times(b)).norm(2);
+    System.out.printf("%.4f\n", actual / norm * 1e6);
+    assertEquals(0, actual, norm * 1.0e-5);
+
+    // and we need to check that the error estimates are pretty good.
+    assertEquals(m.times(x1).minus(b).norm(2), r.getResidualNorm(), 1.0e-5);
+    assertEquals(actual, r.getNormalEquationResidual(), 1.0e-9);
+  }
+
   private static Matrix hilbert(int n) {
     Matrix r = new DenseMatrix(n, n);
     for (int i = 0; i < n; i++) {


Reply via email to