ArrayIndexOutOfBoundException in EigenDecompositionImpl
-------------------------------------------------------
Key: MATH-308
URL: https://issues.apache.org/jira/browse/MATH-308
Project: Commons Math
Issue Type: Bug
Affects Versions: 2.0
Environment: linux
Reporter: Luc Maisonobe
Assignee: Luc Maisonobe
The following test triggers an ArrayIndexOutOfBoundException:
{code:java}
public void testMath308() {
double[] mainTridiagonal = {
22.330154644539597, 46.65485522478641, 17.393672330044705,
54.46687435351116, 80.17800767709437
};
double[] secondaryTridiagonal = {
13.04450406501361, -5.977590941539671, 2.9040909856707517,
7.1570352792841225
};
// the reference values have been computed using routine DSTEMR
// from the fortran library LAPACK version 3.2.1
double[] refEigenValues = {
14.138204224043099, 18.847969733754262, 52.536278520113882,
53.456697699894512, 82.044413207204002
};
RealVector[] refEigenVectors = {
new ArrayRealVector(new double[] { 0.584677060845929,
-0.367177264979103, -0.721453187784497, 0.052971054621812, -0.005740715188257
}),
new ArrayRealVector(new double[] { 0.713933751051495,
-0.190582113553930, 0.671410443368332, -0.056056055955050, 0.006541576993581
}),
new ArrayRealVector(new double[] { 0.222368839324646,
0.514921891363332, -0.021377019336614, 0.801196801016305, -0.207446991247740
}),
new ArrayRealVector(new double[] { 0.314647769490148,
0.750806415553905, -0.167700312025760, -0.537092972407375, 0.143854968127780
}),
new ArrayRealVector(new double[] { -0.000462690386766,
-0.002118073109055, 0.011530080757413, 0.252322434584915, 0.967572088232592
})
};
// the following line triggers the exception
EigenDecomposition decomposition =
new EigenDecompositionImpl(mainTridiagonal, secondaryTridiagonal,
MathUtils.SAFE_MIN);
double[] eigenValues = decomposition.getRealEigenvalues();
for (int i = 0; i < refEigenValues.length; ++i) {
assertEquals(refEigenValues[i], eigenValues[i], 1.0e-6);
if (refEigenVectors[i].dotProduct(decomposition.getEigenvector(i))
< 0) {
assertEquals(0,
refEigenVectors[i].add(decomposition.getEigenvector(i)).getNorm(), 1.0e-6);
} else {
assertEquals(0,
refEigenVectors[i].subtract(decomposition.getEigenvector(i)).getNorm(), 1.0e-6);
}
}
}
{code}
Running the previous method as a Junit test triggers the exception when the
EigenDecompositionImpl instance is built. The first few lines of the stack
trace are:
{noformat}
java.lang.ArrayIndexOutOfBoundsException: -1
at
org.apache.commons.math.linear.EigenDecompositionImpl.computeShiftIncrement(EigenDecompositionImpl.java:1545)
at
org.apache.commons.math.linear.EigenDecompositionImpl.goodStep(EigenDecompositionImpl.java:1072)
at
org.apache.commons.math.linear.EigenDecompositionImpl.processGeneralBlock(EigenDecompositionImpl.java:894)
at
org.apache.commons.math.linear.EigenDecompositionImpl.findEigenvalues(EigenDecompositionImpl.java:658)
at
org.apache.commons.math.linear.EigenDecompositionImpl.decompose(EigenDecompositionImpl.java:246)
at
org.apache.commons.math.linear.EigenDecompositionImpl.<init>(EigenDecompositionImpl.java:205)
at
org.apache.commons.math.linear.EigenDecompositionImplTest.testMath308(EigenDecompositionImplTest.java:136)
{noformat}
I'm currently investigating this bug. It is not a simple index translation
error between the original fortran (Lapack) and commons-math implementation.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.