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


Reply via email to