Uploaded image for project: 'Commons Math'
  1. Commons Math
  2. MATH-308

ArrayIndexOutOfBoundException in EigenDecompositionImpl

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.0
    • Fix Version/s: 2.1
    • Labels:
      None
    • Environment:

      linux

      Description

      The following test triggers an ArrayIndexOutOfBoundException:

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

      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:

      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)
      

      I'm currently investigating this bug. It is not a simple index translation error between the original fortran (Lapack) and commons-math implementation.

        Attachments

          Activity

            People

            • Assignee:
              luc Luc Maisonobe
              Reporter:
              luc Luc Maisonobe
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: