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++) {