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(); + } + }; } /**
