Repository: mahout
Updated Branches:
  refs/heads/master dec441fb8 -> c9d978a46


MAHOUT-1595: MatrixVectorView - implement a proper iterateNonZero() (Anand 
Avati via dlyubimov)
this closes apache/mahout#25

Squashed commit of the following:

commit eb2aa35da282b8955907fcd1ef358e825a100e95
Author: Anand Avati <[email protected]>
Date:   Wed Jul 9 14:29:13 2014 -0700

    MAHOUT-1595: MatrixVectorView - implement a proper iterateNonZero()

    Previous implementation was broken as it was just calling iterator()

    Signed-off-by: Anand Avati <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/mahout/repo
Commit: http://git-wip-us.apache.org/repos/asf/mahout/commit/c9d978a4
Tree: http://git-wip-us.apache.org/repos/asf/mahout/tree/c9d978a4
Diff: http://git-wip-us.apache.org/repos/asf/mahout/diff/c9d978a4

Branch: refs/heads/master
Commit: c9d978a460203736732af546f8b88120795c5d33
Parents: dec441f
Author: Dmitriy Lyubimov <[email protected]>
Authored: Mon Jul 21 16:06:20 2014 -0700
Committer: Dmitriy Lyubimov <[email protected]>
Committed: Mon Jul 21 16:06:20 2014 -0700

----------------------------------------------------------------------
 CHANGELOG                                       |  2 +
 .../apache/mahout/math/MatrixVectorView.java    | 63 +++++++++++++++++++-
 2 files changed, 64 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mahout/blob/c9d978a4/CHANGELOG
----------------------------------------------------------------------
diff --git a/CHANGELOG b/CHANGELOG
index f34ee13..78b17b5 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,8 @@ Mahout Change Log
 
 Release 1.0 - unreleased
 
+  MAHOUT-1595: MatrixVectorView - implement a proper iterateNonZero() (Anand 
Avati via dlyubimov)
+
   MAHOUT-1529(e): Move dense/sparse matrix test in mapBlock into spark (Anand 
Avati via dlyubimov)
 
   MAHOUT-1583: cbind() operator for Scala DRMs (dlyubimov)

http://git-wip-us.apache.org/repos/asf/mahout/blob/c9d978a4/math/src/main/java/org/apache/mahout/math/MatrixVectorView.java
----------------------------------------------------------------------
diff --git a/math/src/main/java/org/apache/mahout/math/MatrixVectorView.java 
b/math/src/main/java/org/apache/mahout/math/MatrixVectorView.java
index 2aa1c09..074d7a6 100644
--- a/math/src/main/java/org/apache/mahout/math/MatrixVectorView.java
+++ b/math/src/main/java/org/apache/mahout/math/MatrixVectorView.java
@@ -126,7 +126,68 @@ public class MatrixVectorView extends AbstractVector {
    */
   @Override
   public Iterator<Element> iterateNonZero() {
-    return iterator();
+
+    return new Iterator<Element>() {
+      class NonZeroElement implements Element {
+        int index;
+
+        @Override
+        public double get() {
+          return getQuick(index);
+        }
+
+        @Override
+        public int index() {
+          return index;
+        }
+
+        @Override
+        public void set(double value) {
+          invalidateCachedLength();
+          setQuick(index, value);
+        }
+      }
+
+      private final NonZeroElement element = new NonZeroElement();
+      private int index = -1;
+      private int lookAheadIndex = -1;
+
+      @Override
+      public boolean hasNext() {
+        if (lookAheadIndex == index) {  // User calls hasNext() after a next()
+          lookAhead();
+        } // else user called hasNext() repeatedly.
+        return lookAheadIndex < size();
+      }
+
+      private void lookAhead() {
+        lookAheadIndex++;
+        while (lookAheadIndex < size() && getQuick(lookAheadIndex) == 0.0) {
+          lookAheadIndex++;
+        }
+      }
+
+      @Override
+      public Element next() {
+        if (lookAheadIndex == index) { // If user called next() without 
checking hasNext().
+          lookAhead();
+        }
+
+        index = lookAheadIndex;
+
+        if (index >= size()) { // If the end is reached.
+          throw new NoSuchElementException();
+        }
+
+        element.index = index;
+        return element;
+      }
+
+      @Override
+      public void remove() {
+        throw new UnsupportedOperationException();
+      }
+    };
   }
 
   /**

Reply via email to