You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Luc Maisonobe (JIRA)" <ji...@apache.org> on 2011/03/23 21:05:05 UTC

[jira] [Closed] (MATH-367) AbstractRealVector.sparseIterator fails when vector has exactly one non-zero entry

     [ https://issues.apache.org/jira/browse/MATH-367?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Luc Maisonobe closed MATH-367.
------------------------------


Closing issue as it was included in version 2.2, which has been released

> AbstractRealVector.sparseIterator fails when vector has exactly one non-zero entry
> ----------------------------------------------------------------------------------
>
>                 Key: MATH-367
>                 URL: https://issues.apache.org/jira/browse/MATH-367
>             Project: Commons Math
>          Issue Type: Bug
>    Affects Versions: 2.1, 2.2
>            Reporter: Albert Huang
>            Assignee: Bill Barker
>            Priority: Minor
>             Fix For: 2.2
>
>         Attachments: AbstractRealVector_sparseIterator_patch.txt
>
>
> The following program:
> ===
> import java.util.Iterator;
> import org.apache.commons.math.linear.*;
> public class SparseIteratorTester
> {
>     public static void main(String[] args) {
>         double vdata[] = { 0.0, 1.0, 0.0 };
>         RealVector v = new ArrayRealVector(vdata);
>         Iterator<RealVector.Entry> iter = v.sparseIterator();
>         while(iter.hasNext()) {
>             RealVector.Entry entry = iter.next();
>             System.out.printf("%d: %f\n", entry.getIndex(), entry.getValue());
>         }   
>     }       
> } 
> ===
> generates this output:
> 1: 1.000000
> Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
> 	at org.apache.commons.math.linear.ArrayRealVector.getEntry(ArrayRealVector.java:995)
> 	at org.apache.commons.math.linear.AbstractRealVector$EntryImpl.getValue(AbstractRealVector.java:850)
> 	at test.SparseIteratorTester.main(SparseIteratorTester.java:13)
> ===
> This patch fixes it, and simplifies AbstractRealVector.SparseEntryIterator  (sorry, i don't see any form entry for attaching a file)
> ===
> Index: src/main/java/org/apache/commons/math/linear/AbstractRealVector.java
> ===================================================================
> --- src/main/java/org/apache/commons/math/linear/AbstractRealVector.java	(revision 936985)
> +++ src/main/java/org/apache/commons/math/linear/AbstractRealVector.java	(working copy)
> @@ -18,6 +18,7 @@
>  package org.apache.commons.math.linear;
>  
>  import java.util.Iterator;
> +import java.util.NoSuchElementException;
>  
>  import org.apache.commons.math.FunctionEvaluationException;
>  import org.apache.commons.math.MathRuntimeException;
> @@ -875,40 +876,25 @@
>          /** Dimension of the vector. */
>          private final int dim;
>  
> -        /** Temporary entry (reused on each call to {@link #next()}. */
> -        private EntryImpl tmp = new EntryImpl();
> -
> -        /** Current entry. */
> +        /** Last entry returned by #next(). */
>          private EntryImpl current;
>  
> -        /** Next entry. */
> +        /** Next entry for #next() to return. */
>          private EntryImpl next;
>  
>          /** Simple constructor. */
>          protected SparseEntryIterator() {
>              dim = getDimension();
>              current = new EntryImpl();
> -            if (current.getValue() == 0) {
> -                advance(current);
> -            }
> -            if(current.getIndex() >= 0){
> -                // There is at least one non-zero entry
> -                next = new EntryImpl();
> -                next.setIndex(current.getIndex());
> +            next = new EntryImpl();
> +            if(next.getValue() == 0)
>                  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.
> +        /** Advance an entry up to the next nonzero value.
>           * @param e entry to advance
>           */
>          protected void advance(EntryImpl e) {
> -            if (e == null) {
> -                return;
> -            }
>              do {
>                  e.setIndex(e.getIndex() + 1);
>              } while (e.getIndex() < dim && e.getValue() == 0);
> @@ -919,22 +905,17 @@
>  
>          /** {@inheritDoc} */
>          public boolean hasNext() {
> -            return current != null;
> +            return next.getIndex() >= 0;
>          }
>  
>          /** {@inheritDoc} */
>          public Entry next() {
> -            tmp.setIndex(current.getIndex());
> -            if (next != null) {
> -                current.setIndex(next.getIndex());
> -                advance(next);
> -                if (next.getIndex() < 0) {
> -                    next = null;
> -                }
> -            } else {
> -                current = null;
> -            }
> -            return tmp;
> +            int index = next.getIndex();
> +            if(index < 0)
> +                throw new NoSuchElementException();
> +            current.setIndex(index);
> +            advance(next);
> +            return current;
>          }
>  
>          /** {@inheritDoc} */

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira