You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bi...@apache.org on 2009/12/11 07:38:21 UTC

svn commit: r889516 - in /commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear: AbstractRealVector.java OpenMapRealVector.java

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



Re: svn commit: r889516 - in /commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear: AbstractRealVector.java OpenMapRealVector.java

Posted by Luc Maisonobe <Lu...@free.fr>.
billbarker@apache.org a écrit :
> 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.

Thanks a lot for your help, Bill.

Luc

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


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org