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 = {}", new Object[] {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);
}
}