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();