Author: srowen
Date: Fri Sep 24 16:48:08 2010
New Revision: 1000954
URL: http://svn.apache.org/viewvc?rev=1000954&view=rev
Log:
MAHOUT-489
Modified:
mahout/trunk/math/src/main/java/org/apache/mahout/math/SequentialAccessSparseVector.java
mahout/trunk/math/src/test/java/org/apache/mahout/math/VectorTest.java
Modified:
mahout/trunk/math/src/main/java/org/apache/mahout/math/SequentialAccessSparseVector.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/math/src/main/java/org/apache/mahout/math/SequentialAccessSparseVector.java?rev=1000954&r1=1000953&r2=1000954&view=diff
==============================================================================
---
mahout/trunk/math/src/main/java/org/apache/mahout/math/SequentialAccessSparseVector.java
(original)
+++
mahout/trunk/math/src/main/java/org/apache/mahout/math/SequentialAccessSparseVector.java
Fri Sep 24 16:48:08 2010
@@ -246,16 +246,16 @@ public class SequentialAccessSparseVecto
private final NonDefaultElement element = new NonDefaultElement();
public boolean hasNext() {
- return element.getNextOffset() < values.getNumMappings();
+ int numMappings = values.getNumMappings();
+ return numMappings > 0 && element.getNextOffset() < numMappings;
}
public Element next() {
- if (element.getNextOffset() >= values.getNumMappings()) {
+ if (!hasNext()) {
throw new NoSuchElementException();
- } else {
- element.advanceOffset();
- return element;
}
+ element.advanceOffset();
+ return element;
}
public void remove() {
@@ -268,16 +268,16 @@ public class SequentialAccessSparseVecto
private final AllElement element = new AllElement();
public boolean hasNext() {
- return element.getNextIndex() <
values.getIndices()[values.getNumMappings() - 1];
+ int numMappings = values.getNumMappings();
+ return numMappings > 0 && element.getNextIndex() <=
values.getIndices()[numMappings - 1];
}
public Element next() {
- if (element.getNextIndex() >=
values.getIndices()[values.getNumMappings() - 1]) {
+ if (!hasNext()) {
throw new NoSuchElementException();
- } else {
- element.advanceIndex();
- return element;
}
+ element.advanceIndex();
+ return element;
}
public void remove() {
@@ -339,6 +339,7 @@ public class SequentialAccessSparseVecto
}
public void set(double value) {
+ lengthSquared = -1;
if (index == values.getIndices()[nextOffset]) {
values.getValues()[nextOffset] = value;
} else {
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=1000954&r1=1000953&r2=1000954&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 Fri
Sep 24 16:48:08 2010
@@ -34,6 +34,64 @@ public final class VectorTest extends Ma
}
@Test
+ public void testSparseVectorFullIteration() {
+ int[] index = {0, 1, 2, 3, 4, 5};
+ double[] values = {1, 2, 3, 4, 5, 6};
+
+ assertEquals(index.length, values.length);
+
+ int n = index.length;
+
+ Vector vector = new SequentialAccessSparseVector(n);
+ for (int i = 0; i < n; i++) {
+ vector.set(index[i], values[i]);
+ }
+
+ for (int i = 0; i < n; i++) {
+ assertEquals(vector.get(i), values[i], EPSILON);
+ }
+
+ int elements = 0;
+ for (Vector.Element e : vector) {
+ elements++;
+ }
+ assertEquals(n, elements);
+
+ Vector empty = new SequentialAccessSparseVector(0);
+ assertFalse(empty.iterator().hasNext());
+ }
+
+ @Test
+ public void testSparseVectorSparseIteration() {
+ int[] index = {0, 1, 2, 3, 4, 5};
+ double[] values = {1, 2, 3, 4, 5, 6};
+
+ assertEquals(index.length, values.length);
+
+ int n = index.length;
+
+ Vector vector = new SequentialAccessSparseVector(n);
+ for (int i = 0; i < n; i++) {
+ vector.set(index[i], values[i]);
+ }
+
+ for (int i = 0; i < n; i++) {
+ assertEquals(vector.get(i), values[i], EPSILON);
+ }
+
+ int elements = 0;
+ Iterator<Vector.Element> it = vector.iterateNonZero();
+ while (it.hasNext()) {
+ it.next();
+ elements++;
+ }
+ assertEquals(n, elements);
+
+ Vector empty = new SequentialAccessSparseVector(0);
+ assertFalse(empty.iterateNonZero().hasNext());
+ }
+
+ @Test
public void testEquivalent() {
//names are not used for equivalent
RandomAccessSparseVector randomAccessLeft = new
RandomAccessSparseVector(3);
@@ -200,9 +258,9 @@ public final class VectorTest extends Ma
assertEquals("mutation via setQuick() fails to change lengthSquared",
expected, v.getLengthSquared(), EPSILON);
Iterator<Vector.Element> it = v.iterator();
- while(it.hasNext()) {
+ while (it.hasNext()) {
Vector.Element e = it.next();
- if(e.index() == v.size() - 2) {
+ if (e.index() == v.size() - 2) {
e.set(e.get() - 5.0);
}
}