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/07/11 08:47:55 UTC

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

Author: tdunning
Date: Sun Jul 11 06:47:54 2010
New Revision: 962999

URL: http://svn.apache.org/viewvc?rev=962999&view=rev
Log:
MAHOUT-436 - Added minValue, minValueIndex, implementations in AbstractVector and the sparse vectors and tests.  Also cleaned up some code style issues with some tests

Modified:
    mahout/trunk/math/src/main/java/org/apache/mahout/math/AbstractVector.java
    mahout/trunk/math/src/main/java/org/apache/mahout/math/NamedVector.java
    mahout/trunk/math/src/main/java/org/apache/mahout/math/Vector.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=962999&r1=962998&r2=962999&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 Sun Jul 11 06:47:54 2010
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
@@ -262,7 +262,8 @@ public abstract class AbstractVector imp
       }
     }
     // if the maxElement is negative and the vector is sparse then any
-    // unfilled element(0.0) could be the maxValue hence return -1;
+    // unfilled element(0.0) could be the maxValue hence we need to
+    // find one of those elements
     if (nonZeroElements < size && max < 0.0) {
       for (Element element : this) {
         if (element.get() == 0.0) {
@@ -273,6 +274,48 @@ public abstract class AbstractVector imp
     return result;
   }
 
+  public double minValue() {
+    double result = Double.POSITIVE_INFINITY;
+    int nonZeroElements = 0;
+    Iterator<Element> iter = this.iterateNonZero();
+    while (iter.hasNext()) {
+      nonZeroElements++;
+      Element element = iter.next();
+      result = Math.min(result, element.get());
+    }
+    if (nonZeroElements < size) {
+      return Math.min(result, 0.0);
+    }
+    return result;
+  }
+
+  public int minValueIndex() {
+    int result = -1;
+    double min = Double.POSITIVE_INFINITY;
+    int nonZeroElements = 0;
+    Iterator<Element> iter = this.iterateNonZero();
+    while (iter.hasNext()) {
+      nonZeroElements++;
+      Element element = iter.next();
+      double tmp = element.get();
+      if (tmp < min) {
+        min = tmp;
+        result = element.index();
+      }
+    }
+    // if the maxElement is positive and the vector is sparse then any
+    // unfilled element(0.0) could be the maxValue hence we need to
+    // find one of those elements
+    if (nonZeroElements < size && min > 0.0) {
+      for (Element element : this) {
+        if (element.get() == 0.0) {
+          return element.index();
+        }
+      }
+    }
+    return result;
+  }
+
   public Vector plus(double x) {
     if (x == 0.0) {
       return clone();

Modified: mahout/trunk/math/src/main/java/org/apache/mahout/math/NamedVector.java
URL: http://svn.apache.org/viewvc/mahout/trunk/math/src/main/java/org/apache/mahout/math/NamedVector.java?rev=962999&r1=962998&r2=962999&view=diff
==============================================================================
--- mahout/trunk/math/src/main/java/org/apache/mahout/math/NamedVector.java (original)
+++ mahout/trunk/math/src/main/java/org/apache/mahout/math/NamedVector.java Sun Jul 11 06:47:54 2010
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
@@ -163,6 +163,14 @@ public class NamedVector implements Vect
     return delegate.maxValueIndex();
   }
 
+  public double minValue() {
+    return delegate.minValue();
+  }
+
+  public int minValueIndex() {
+    return delegate.minValueIndex();
+  }
+
   public Vector plus(double x) {
     return delegate.plus(x);
   }

Modified: mahout/trunk/math/src/main/java/org/apache/mahout/math/Vector.java
URL: http://svn.apache.org/viewvc/mahout/trunk/math/src/main/java/org/apache/mahout/math/Vector.java?rev=962999&r1=962998&r2=962999&view=diff
==============================================================================
--- mahout/trunk/math/src/main/java/org/apache/mahout/math/Vector.java (original)
+++ mahout/trunk/math/src/main/java/org/apache/mahout/math/Vector.java Sun Jul 11 06:47:54 2010
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
@@ -234,6 +234,12 @@ public interface Vector extends Cloneabl
    */
   double norm(double power);
 
+  /** @return The minimum value in the Vector */
+  double minValue();
+
+  /** @return The index of the minimum value */
+  int minValueIndex();
+
   /** @return The maximum value in the Vector */
   double maxValue();
 

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=962999&r1=962998&r2=962999&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 Sun Jul 11 06:47:54 2010
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
@@ -25,13 +25,13 @@ import java.util.Iterator;
 
 public class VectorTest extends MahoutTestCase {
 
-  public void testSparseVector() throws Exception {
+  public void testSparseVector()  {
     Vector vec1 = new RandomAccessSparseVector(3);
     Vector vec2 = new RandomAccessSparseVector(3);
     doTestVectors(vec1, vec2);
   }
 
-  public void testEquivalent() throws Exception {
+  public void testEquivalent()  {
     //names are not used for equivalent
     RandomAccessSparseVector randomAccessLeft = new RandomAccessSparseVector(3);
     Vector sequentialAccessLeft = new SequentialAccessSparseVector(3);
@@ -121,7 +121,7 @@ public class VectorTest extends MahoutTe
     assertEquals(vec, left);
   }
 
-  public void testGetDistanceSquared() throws Exception {
+  public void testGetDistanceSquared()  {
     Vector v = new DenseVector(5);
     Vector w = new DenseVector(5);
     setUpV(v);
@@ -161,7 +161,7 @@ public class VectorTest extends MahoutTe
     assertEquals(expected, v.getDistanceSquared(w), 1.0e-6);
   }
 
-  public void testGetLengthSquared() throws Exception {
+  public void testGetLengthSquared()  {
     Vector v = new DenseVector(5);
     setUpV(v);
     doTestGetLengthSquared(v);
@@ -312,7 +312,7 @@ public class VectorTest extends MahoutTe
     assertTrue(expectedIndices.isEmpty());
   }
 
-  public void testNormalize() throws Exception {
+  public void testNormalize()  {
     Vector vec1 = new RandomAccessSparseVector(3);
 
     vec1.setQuick(0, 1);
@@ -395,7 +395,7 @@ public class VectorTest extends MahoutTe
     }
   }
 
-  public void testMax() throws Exception {
+  public void testMax()  {
     Vector vec1 = new RandomAccessSparseVector(3);
 
     vec1.setQuick(0, -1);
@@ -467,13 +467,85 @@ public class VectorTest extends MahoutTe
 
   }
 
-  public void testDenseVector() throws Exception {
+  public void testMin()  {
+    Vector vec1 = new RandomAccessSparseVector(3);
+
+    vec1.setQuick(0, 1);
+    vec1.setQuick(1, 3);
+    vec1.setQuick(2, 2);
+
+    double max = vec1.minValue();
+    assertEquals(max + " does not equal: " + (1.0), 1.0, max, 0.0);
+
+    int idx = vec1.maxValueIndex();
+    assertEquals(idx + " does not equal: " + 1, 1, idx);
+
+    vec1 = new RandomAccessSparseVector(3);
+
+    vec1.setQuick(0, -1);
+    vec1.setQuick(2, -2);
+
+    max = vec1.maxValue();
+    assertEquals(max + " does not equal: " + 0, 0.0, max, 0.0);
+
+    idx = vec1.maxValueIndex();
+    assertEquals(idx + " does not equal: " + 1, 1, idx);
+
+    vec1 = new SequentialAccessSparseVector(3);
+
+    vec1.setQuick(0, -1);
+    vec1.setQuick(2, -2);
+
+    max = vec1.maxValue();
+    assertEquals(max + " does not equal: " + 0, 0.0, max, 0.0);
+
+    idx = vec1.maxValueIndex();
+    assertEquals(idx + " does not equal: " + 1, 1, idx);
+
+    vec1 = new DenseVector(3);
+
+    vec1.setQuick(0, -1);
+    vec1.setQuick(2, -2);
+
+    max = vec1.maxValue();
+    assertEquals(max + " does not equal: " + 0, 0.0, max, 0.0);
+
+    idx = vec1.maxValueIndex();
+    assertEquals(idx + " does not equal: " + 1, 1, idx);
+
+    vec1 = new RandomAccessSparseVector(3);
+    max = vec1.maxValue();
+    assertEquals(max + " does not equal 0", 0.0, max);
+
+    vec1 = new DenseVector(3);
+    max = vec1.maxValue();
+    assertEquals(max + " does not equal 0", 0.0, max);
+
+    vec1 = new SequentialAccessSparseVector(3);
+    max = vec1.maxValue();
+    assertEquals(max + " does not equal 0", 0.0, max);
+
+    vec1 = new RandomAccessSparseVector(0);
+    max = vec1.maxValue();
+    assertEquals(max + " does not equal -inf", Double.NEGATIVE_INFINITY, max);
+
+    vec1 = new DenseVector(0);
+    max = vec1.maxValue();
+    assertEquals(max + " does not equal -inf", Double.NEGATIVE_INFINITY, max);
+
+    vec1 = new SequentialAccessSparseVector(0);
+    max = vec1.maxValue();
+    assertEquals(max + " does not equal -inf", Double.NEGATIVE_INFINITY, max);
+
+  }
+
+  public void testDenseVector()  {
     Vector vec1 = new DenseVector(3);
     Vector vec2 = new DenseVector(3);
     doTestVectors(vec1, vec2);
   }
 
-  public void testVectorView() throws Exception {
+  public void testVectorView()  {
     RandomAccessSparseVector vec1 = new RandomAccessSparseVector(3);
     RandomAccessSparseVector vec2 = new RandomAccessSparseVector(6);
     SequentialAccessSparseVector vec3 = new SequentialAccessSparseVector(3);
@@ -500,7 +572,7 @@ public class VectorTest extends MahoutTe
     }
   }
 
-  public void testEnumeration() throws Exception {
+  public void testEnumeration()  {
     double[] apriori = {0, 1, 2, 3, 4};
 
     doTestEnumeration(apriori, new VectorView(new DenseVector(new double[]{
@@ -526,7 +598,7 @@ public class VectorTest extends MahoutTe
 
   }
 
-  public void testAggregation() throws Exception {
+  public void testAggregation()  {
     Vector v = new DenseVector(5);
     Vector w = new DenseVector(5);
     setUpFirstVector(v);
@@ -578,7 +650,7 @@ public class VectorTest extends MahoutTe
     v.setQuick(3, 2);
   }
 
-  public void testNameSerialization() throws Exception {
+  public void testNameSerialization()  {
     double[] values = {1.1, 2.2, 3.3};
     Vector test = new DenseVector(values);
     String formatString = test.asFormatString();