@Test
public void testEigenvalueCheck() throws Exception {

  int size = 100;
  Matrix m = randomHierarchicalSymmetricMatrix(size);
  Vector initialVector = new DenseVector(size);
  initialVector.assign(1.0 / Math.sqrt(size));
  LanczosSolver solver = new LanczosSolver();
  int desiredRank = 80;
  LanczosState state = new LanczosState(m, desiredRank, initialVector);
  // set initial vector?
  solver.solve(state, desiredRank, true);
  EigenDecomposition decomposition = new EigenDecomposition(m);
  Vector eigenvalues = decomposition.getRealEigenvalues();
  float fractionOfEigensExpectedGood = 0.6f;
  for (int i = 0; i < fractionOfEigensExpectedGood * desiredRank; i++) {
    double s = state.getSingularValue(desiredRank - i - 1);
    double e = eigenvalues.get(eigenvalues.size() - i - 1);
    log.info("{} : L = {}, E = {}", i, s, e);
    assertTrue("Singular value differs from eigenvalue", Math.abs((s-e)/e) < ERROR_TOLERANCE);
    Vector v = state.getRightSingularVector(i);
    Vector v2 = decomposition.getV().viewColumn(eigenvalues.size() - i - 1);
    double error = 1 - Math.abs(v.dot(v2)/(v.norm(2) * v2.norm(2)));
    log.info("error: {}", error);
    assertTrue(i + ": 1 - cosAngle = " + error, error < ERROR_TOLERANCE);
  }
}