You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mahout.apache.org by td...@apache.org on 2010/08/12 04:51:28 UTC

svn commit: r984634 - in /mahout/trunk/math/src: main/java/org/apache/mahout/math/AbstractVector.java test/java/org/apache/mahout/math/VectorTest.java

Author: tdunning
Date: Thu Aug 12 02:51:28 2010
New Revision: 984634

URL: http://svn.apache.org/viewvc?rev=984634&view=rev
Log:
Fixed initialization error in vector aggregation.  Also test for empty vectors.

Modified:
    mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractVector.java
    mahout/trunk/math/src/test/java/org/apache/mahout/math/VectorTest.java

Modified: mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractVector.java
URL: http://svn.apache.org/viewvc/mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractVector.java?rev=984634&r1=984633&r2=984634&view=diff
==============================================================================
--- mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractVector.java (original)
+++ mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractVector.java Thu Aug 12 02:51:28 2010
@@ -36,16 +36,22 @@ public abstract class AbstractVector imp
   }
 
   public double aggregate(BinaryFunction aggregator, UnaryFunction map) {
-    double result = 0.0;
-    for (int i=0; i < size; i++) {
-      result = aggregator.apply(result, map.apply(getQuick(i)) );
+    if (size < 1) {
+      throw new IllegalArgumentException("Cannot aggregate empty vector");
+    }
+    double result = map.apply(getQuick(0));
+    for (int i = 1; i < size; i++) {
+      result = aggregator.apply(result, map.apply(getQuick(i)));
     }
     return result;
   }
 
   public double aggregate(Vector other, BinaryFunction aggregator, BinaryFunction combiner) {
-    double result = 0.0;
-    for (int i=0; i < size; i++) {
+    if (size < 1) {
+      throw new IllegalArgumentException("Cannot aggregate empty vector");
+    }
+    double result = combiner.apply(getQuick(0), other.getQuick(0));
+    for (int i = 1; i < size; i++) {
       result = aggregator.apply(result, combiner.apply(getQuick(i), other.getQuick(i)));
     }
     return result;

Modified: mahout/trunk/math/src/test/java/org/apache/mahout/math/VectorTest.java
URL: http://svn.apache.org/viewvc/mahout/trunk/math/src/test/java/org/apache/mahout/math/VectorTest.java?rev=984634&r1=984633&r2=984634&view=diff
==============================================================================
--- mahout/trunk/math/src/test/java/org/apache/mahout/math/VectorTest.java (original)
+++ mahout/trunk/math/src/test/java/org/apache/mahout/math/VectorTest.java Thu Aug 12 02:51:28 2010
@@ -637,6 +637,33 @@ public class VectorTest extends MahoutTe
         v.aggregate(w, Functions.plus, Functions.chain(Functions.pow(2), Functions.minus)));
   }
 
+  public static void testEmptyAggregate() {
+    assertEquals(1.0, new DenseVector(new double[]{1}).aggregate(Functions.min, Functions.identity));
+    assertEquals(1.0, new DenseVector(new double[]{2, 1}).aggregate(Functions.min, Functions.identity));
+
+    try {
+      new DenseVector(new double[]{}).aggregate(Functions.min, Functions.identity);
+      fail("Should have thrown exception with empty vector");
+    } catch (IllegalArgumentException e) {
+      // as it should be
+    }
+
+    assertEquals(3.0,
+            new DenseVector(new double[]{1}).aggregate(
+                    new DenseVector(new double[]{2}),
+                    Functions.min, Functions.plus));
+
+    try {
+      new DenseVector(new double[]{}).aggregate(
+              new DenseVector(new double[]{}),
+              Functions.min, Functions.plus);
+      
+      fail("Should have thrown exception with empty vector");
+    } catch (IllegalArgumentException e) {
+      // as it should be
+    }
+  }
+
   private static void setUpFirstVector(Vector v) {
     v.setQuick(1, 2);
     v.setQuick(2, 0.5);