Author: billbarker
Date: Fri Dec 11 06:38:20 2009
New Revision: 889516

URL: http://svn.apache.org/viewvc?rev=889516&view=rev
Log:
Initial fixes to the iterators.

This fixes the default sparseIterator problem where a RealVector only contains 
zero elements, and add a sparseIterator to the OpenMapRealVector.

Still TODO:
1) add unit tests
2) remove *mapTo and *mapToSelf from OpenMapRealVector
3) fix javadocs
4) remove support for non-zero default values in OpenMapRealVector 

Modified:
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/OpenMapRealVector.java

Modified: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java?rev=889516&r1=889515&r2=889516&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java
 (original)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java
 Fri Dec 11 06:38:20 2009
@@ -769,9 +769,15 @@
             if (current.getValue() == 0) {
                 advance(current);
             }
-            next = new EntryImpl();
-            next.setIndex(current.getIndex());
-            advance(next);
+            if(current.getIndex() >= 0){
+                // There is at least one non-zero entry
+                next = new EntryImpl();
+                next.setIndex(current.getIndex());
+                advance(next);
+            } else {
+                // The vector consists of only zero entries, so deny having a 
next
+                current = null;
+            }
         }
 
         /** Advance an entry up to the next non null one.

Modified: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/OpenMapRealVector.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/OpenMapRealVector.java?rev=889516&r1=889515&r2=889516&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/OpenMapRealVector.java
 (original)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/OpenMapRealVector.java
 Fri Dec 11 06:38:20 2009
@@ -1250,4 +1250,70 @@
         return (double)entries.size()/(double)getDimension();
     }
 
+    /** @{InheritDoc} */
+    public java.util.Iterator<Entry> sparseIterator() {
+        return new OpenMapSparseIterator();
+    }
+    
+    /**
+     *  Implementation of <code>Entry</code> optimized for OpenMap.
+     * <p>This implementation does not allow arbitrary calls to 
<code>setIndex</code>
+     * since the order that entries are returned is undefined.
+     */
+    protected class OpenMapEntry extends Entry {
+        private final Iterator iter;
+
+        protected OpenMapEntry(Iterator iter) {
+            this.iter = iter;
+        }
+        /** {...@inheritdoc} */
+        @Override
+        public double getValue() {
+            return iter.value();
+        }
+
+        /** {...@inheritdoc} */
+        @Override
+        public void setValue(double value) {
+            entries.put(iter.key(), value);
+        }
+        
+        /** {...@inheritdoc} */
+        @Override
+        public int getIndex() {
+            return iter.key();
+        }
+    }
+    
+    /**
+     *  Iterator class to do iteration over just the non-zero elements.
+     *  <p>This implementation is fail-fast, so cannot be used to modify any 
zero element. 
+     *
+     */
+    
+    protected class OpenMapSparseIterator implements java.util.Iterator<Entry> 
{
+        private final Iterator iter;
+        private final Entry current;
+        
+        protected OpenMapSparseIterator() {
+            iter = entries.iterator();
+            current = new OpenMapEntry(iter);
+        }
+
+        /** {...@inheritdoc} */
+        public boolean hasNext() {
+            return iter.hasNext();
+        }
+
+        /** {...@inheritdoc} */
+        public Entry next() {
+            iter.advance();
+            return current;
+        }
+
+        public void remove() {
+            throw new UnsupportedOperationException("Not supported");
+       }
+        
+    }
 }


Reply via email to