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: [email protected]
For additional commands, e-mail: [email protected]