Author: tdunning
Date: Tue Sep  4 02:18:51 2012
New Revision: 1380430

URL: http://svn.apache.org/viewvc?rev=1380430&view=rev
Log:
MAHOUT-1059 - Add generic vector test.

Added:
    
mahout/trunk/math/src/test/java/org/apache/mahout/math/AbstractVectorTest.java
Modified:
    mahout/trunk/math/src/main/java/org/apache/mahout/math/DelegatingVector.java
    mahout/trunk/math/src/test/java/org/apache/mahout/math/CentroidTest.java
    
mahout/trunk/math/src/test/java/org/apache/mahout/math/WeightedVectorTest.java

Modified: 
mahout/trunk/math/src/main/java/org/apache/mahout/math/DelegatingVector.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/math/src/main/java/org/apache/mahout/math/DelegatingVector.java?rev=1380430&r1=1380429&r2=1380430&view=diff
==============================================================================
--- 
mahout/trunk/math/src/main/java/org/apache/mahout/math/DelegatingVector.java 
(original)
+++ 
mahout/trunk/math/src/main/java/org/apache/mahout/math/DelegatingVector.java 
Tue Sep  4 02:18:51 2012
@@ -180,33 +180,39 @@ public class DelegatingVector implements
 
     @Override
     public Vector assign(double value) {
-        return delegate.assign(value);
-    }
-
-    @Override
-    public Vector assign(double[] values) {
-        return delegate.assign(values);
-    }
-
-    @Override
-    public Vector assign(Vector other) {
-        return delegate.assign(other);
-    }
-
-    @Override
-    public Vector assign(DoubleDoubleFunction f, double y) {
-        return delegate.assign(f, y);
-    }
-
-    @Override
-    public Vector assign(DoubleFunction function) {
-        return delegate.assign(function);
-    }
-
-    @Override
-    public Vector assign(Vector other, DoubleDoubleFunction function) {
-        return delegate.assign(other, function);
-    }
+    delegate.assign(value);
+    return this;
+  }
+
+  @Override
+  public Vector assign(double[] values) {
+    delegate.assign(values);
+    return this;
+  }
+
+  @Override
+  public Vector assign(Vector other) {
+    delegate.assign(other);
+    return this;
+  }
+
+  @Override
+  public Vector assign(DoubleDoubleFunction f, double y) {
+    delegate.assign(f, y);
+    return this;
+  }
+
+  @Override
+  public Vector assign(DoubleFunction function) {
+    delegate.assign(function);
+    return this;
+  }
+
+  @Override
+  public Vector assign(Vector other, DoubleDoubleFunction function) {
+    delegate.assign(other, function);
+    return this;
+  }
 
     @Override
     public Matrix cross(Vector other) {

Added: 
mahout/trunk/math/src/test/java/org/apache/mahout/math/AbstractVectorTest.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/math/src/test/java/org/apache/mahout/math/AbstractVectorTest.java?rev=1380430&view=auto
==============================================================================
--- 
mahout/trunk/math/src/test/java/org/apache/mahout/math/AbstractVectorTest.java 
(added)
+++ 
mahout/trunk/math/src/test/java/org/apache/mahout/math/AbstractVectorTest.java 
Tue Sep  4 02:18:51 2012
@@ -0,0 +1,103 @@
+package org.apache.mahout.math;
+
+import org.apache.mahout.common.RandomUtils;
+import org.apache.mahout.math.jet.random.Normal;
+import org.junit.Test;
+
+import java.util.Random;
+
+/**
+ * Makes sure that a vector under test acts the same as a DenseVector or 
RandomAccessSparseVector
+ * (according to whether it is dense or sparse).  Most operations need to be 
done within a reasonable
+ * tolerance.
+ *
+ * The idea is that a new vector implementation can extend AbstractVectorTest 
to get pretty high
+ * confidence that it is working correctly.
+ */
+public abstract class AbstractVectorTest<T extends Vector> extends 
MahoutTestCase {
+  public abstract T vectorToTest(int size);
+
+  @Test
+  public void testSimpleOps() {
+
+    final T v0 = vectorToTest(20);
+    final Random gen = RandomUtils.getRandom();
+    Vector v1 = v0.assign(new Normal(0, 1, gen));
+    Vector v2 = vectorToTest(20).assign(new Normal(0, 1, gen));
+
+    assertEquals(v0.get(12), v1.get(12), 0);
+    v0.set(12, gen.nextDouble());
+    assertEquals(v0.get(12), v1.get(12), 0);
+    assertTrue(v0 == v1);
+
+    Vector dv1 = new DenseVector(v1);
+    Vector dv2 = new DenseVector(v2);
+    Vector sv1 = new RandomAccessSparseVector(v1);
+    Vector sv2 = new RandomAccessSparseVector(v2);
+
+    assertEquals(0, dv1.plus(dv2).getDistanceSquared(v1.plus(v2)), 1e-13);
+    assertEquals(0, dv1.plus(dv2).getDistanceSquared(v1.plus(dv2)), 1e-13);
+    assertEquals(0, dv1.plus(dv2).getDistanceSquared(v1.plus(sv2)), 1e-13);
+    assertEquals(0, dv1.plus(dv2).getDistanceSquared(sv1.plus(v2)), 1e-13);
+
+    assertEquals(0, dv1.minus(dv2).getDistanceSquared(v1.minus(v2)), 1e-13);
+    assertEquals(0, dv1.minus(dv2).getDistanceSquared(v1.minus(dv2)), 1e-13);
+    assertEquals(0, dv1.minus(dv2).getDistanceSquared(v1.minus(sv2)), 1e-13);
+    assertEquals(0, dv1.minus(dv2).getDistanceSquared(sv1.minus(v2)), 1e-13);
+
+    double z = gen.nextDouble();
+    assertEquals(0, dv1.divide(z).getDistanceSquared(v1.divide(z)), 1e-12);
+    assertEquals(0, dv1.times(z).getDistanceSquared(v1.times(z)), 1e-12);
+    assertEquals(0, dv1.plus(z).getDistanceSquared(v1.plus(z)), 1e-12);
+
+    assertEquals(dv1.dot(dv2), v1.dot(v2), 1e-13);
+    assertEquals(dv1.dot(dv2), v1.dot(dv2), 1e-13);
+    assertEquals(dv1.dot(dv2), v1.dot(sv2), 1e-13);
+    assertEquals(dv1.dot(dv2), sv1.dot(v2), 1e-13);
+    assertEquals(dv1.dot(dv2), dv1.dot(v2), 1e-13);
+
+    assertEquals(dv1.getLengthSquared(), v1.getLengthSquared(), 1e-13);
+    assertEquals(dv1.getDistanceSquared(dv2), v1.getDistanceSquared(v2), 
1e-13);
+    assertEquals(dv1.getDistanceSquared(dv2), dv1.getDistanceSquared(v2), 
1e-13);
+    assertEquals(dv1.getDistanceSquared(dv2), sv1.getDistanceSquared(v2), 
1e-13);
+    assertEquals(dv1.getDistanceSquared(dv2), v1.getDistanceSquared(dv2), 
1e-13);
+    assertEquals(dv1.getDistanceSquared(dv2), v1.getDistanceSquared(sv2), 
1e-13);
+
+    assertEquals(dv1.minValue(), v1.minValue(), 1e-13);
+    assertEquals(dv1.minValueIndex(), v1.minValueIndex());
+
+    assertEquals(dv1.maxValue(), v1.maxValue(), 1e-13);
+    assertEquals(dv1.maxValueIndex(), v1.maxValueIndex());
+
+    Vector nv1 = v1.normalize();
+
+    assertEquals(0, dv1.getDistanceSquared(v1), 1e-13);
+    assertEquals(1, nv1.norm(2), 1e-13);
+    assertEquals(0, dv1.normalize().getDistanceSquared(nv1), 1e-13);
+
+    nv1 = v1.normalize(1);
+    assertEquals(0, dv1.getDistanceSquared(v1), 1e-13);
+    assertEquals(1, nv1.norm(1), 1e-13);
+    assertEquals(0, dv1.normalize(1).getDistanceSquared(nv1), 1e-13);
+
+    assertEquals(dv1.norm(0), v1.norm(0), 1e-13);
+    assertEquals(dv1.norm(1), v1.norm(1), 1e-13);
+    assertEquals(dv1.norm(1.5), v1.norm(1.5), 1e-13);
+    assertEquals(dv1.norm(2), v1.norm(2), 1e-13);
+
+    // assign double, function, vector x function
+
+
+    // aggregate
+
+    // cross,
+
+    // getNumNondefaultElements
+
+    for (Vector.Element element : v1) {
+      assertEquals(dv1.get(element.index()), element.get(), 0);
+      assertEquals(dv1.get(element.index()), v1.get(element.index()), 0);
+      assertEquals(dv1.get(element.index()), v1.getQuick(element.index()), 0);
+    }
+  }
+}

Modified: 
mahout/trunk/math/src/test/java/org/apache/mahout/math/CentroidTest.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/math/src/test/java/org/apache/mahout/math/CentroidTest.java?rev=1380430&r1=1380429&r2=1380430&view=diff
==============================================================================
--- mahout/trunk/math/src/test/java/org/apache/mahout/math/CentroidTest.java 
(original)
+++ mahout/trunk/math/src/test/java/org/apache/mahout/math/CentroidTest.java 
Tue Sep  4 02:18:51 2012
@@ -21,9 +21,7 @@ import org.apache.mahout.math.function.F
 import org.apache.mahout.math.random.MultiNormal;
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
-
-public class CentroidTest {
+public class CentroidTest extends AbstractVectorTest {
   @Test
   public void testUpdate() {
     MultiNormal f = new MultiNormal(20);
@@ -56,4 +54,9 @@ public class CentroidTest {
     assertEquals(3, x1.getWeight(), 1e-8);
     assertEquals(1, x1.getIndex());
   }
+
+  @Override
+  public Vector vectorToTest(int size) {
+    return new Centroid(new WeightedVector(new DenseVector(size), 3.15, 51));
+  }
 }

Modified: 
mahout/trunk/math/src/test/java/org/apache/mahout/math/WeightedVectorTest.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/math/src/test/java/org/apache/mahout/math/WeightedVectorTest.java?rev=1380430&r1=1380429&r2=1380430&view=diff
==============================================================================
--- 
mahout/trunk/math/src/test/java/org/apache/mahout/math/WeightedVectorTest.java 
(original)
+++ 
mahout/trunk/math/src/test/java/org/apache/mahout/math/WeightedVectorTest.java 
Tue Sep  4 02:18:51 2012
@@ -19,10 +19,8 @@ package org.apache.mahout.math;
 
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
 
-
-public class WeightedVectorTest {
+public class WeightedVectorTest extends AbstractVectorTest {
   @Test
   public void testLength() {
     Vector v = new DenseVector(new double[]{0.9921337470551008, 
1.0031004325833064, 0.9963963182745947});
@@ -33,4 +31,9 @@ public class WeightedVectorTest {
     System.out.printf("c = %.9f\nv = %.9f\n", c.getLengthSquared(), 
c.getVector().getLengthSquared());
     assertEquals(c.getVector().getLengthSquared(), c.getLengthSquared(), 
1e-17);
   }
+
+  @Override
+  public Vector vectorToTest(int size) {
+    return new WeightedVector(new DenseVector(size), 4.52, 345);
+  }
 }


Reply via email to