commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gilles Sadowski <gil...@harfang.homelinux.org>
Subject Re: [math] A bug in OpenMathRealVector
Date Sat, 13 Aug 2011 14:59:50 GMT
Hello.

> while testing the implementation of UnmodifiableRealVector which has
> previously been discussed on Commons Developers, I came across the
> following problem. The simple code below
> 
> =====
> import org.apache.commons.math.linear.OpenMapRealVector;
> import org.apache.commons.math.linear.RealVector;
> 
> public class DemoBugOpenMapRealVector {
>     public static void main(String[] args) {
>         final RealVector u = new OpenMapRealVector(3, 1E-6);
>         u.setEntry(0, 1.);
>         u.setEntry(1, 0.);
>         u.setEntry(2, 2.);
>         final RealVector v = new OpenMapRealVector(3, 1E-6);
>         v.setEntry(0, 0.);
>         v.setEntry(1, 3.);
>         v.setEntry(2, 0.);
>         System.out.println(u);
>         System.out.println(v);
>         System.out.println(u.ebeMultiply(v));
>     }
> }
> 
> =====
> 
> Raises an exception
> Exception in thread "main"
> org.apache.commons.math.MathRuntimeException$6: map has been modified
> while iterating
> 	at org.apache.commons.math.MathRuntimeException.createConcurrentModificationException(MathRuntimeException.java:373)
> 	at org.apache.commons.math.util.OpenIntToDoubleHashMap$Iterator.advance(OpenIntToDoubleHashMap.java:564)
> 	at org.apache.commons.math.linear.OpenMapRealVector.ebeMultiply(OpenMapRealVector.java:372)
> 	at DemoBugOpenMapRealVector.main(DemoBugOpenMapRealVector.java:16)
> 
> I think I misunderstood the use of OpenMapRealVector.

:-)
I rather think that you discovered a bug!

In the code (at lines 369-374 in "OpenMapRealVector"):
---CUT---
OpenMapRealVector res = new OpenMapRealVector(this);
Iterator iter = res.entries.iterator();
  while (iter.hasNext()) {
    iter.advance();
    res.setEntry(iter.key(), iter.value() * v.getEntry(iter.key()));
}
---CUT---

No exception occurs if the second line in the above excerpt is changed to
---CUT---
Iterator iter = entries.iterator();
---CUT---
(thus not iterating on the "res" vector which is modified concurrently)

I still don't understand why the problem does not show up in the unit tests.

> Could you help me?

Could you open a JIRA ticket?


Thanks for *your* help,
Gilles

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


Mime
View raw message