HebbianSolver { public HebbianSolver(EigenUpdater updater, SingularVectorVerifier verifier, double convergenceTarget, int maxPassesPerEigen) { this.updater = updater; this.verifier = verifier; this.convergenceTarget = convergenceTarget; this.maxPassesPerEigen = maxPassesPerEigen; } HebbianSolver(EigenUpdater updater,
                       SingularVectorVerifier verifier,
                       double convergenceTarget,
                       int maxPassesPerEigen);  HebbianSolver(EigenUpdater updater,
                       SingularVectorVerifier verifier,
                       double convergenceTarget);  HebbianSolver(double convergenceTarget, int maxPassesPerEigen);  HebbianSolver(double convergenceTarget);  HebbianSolver(int numPassesPerEigen); TrainingState solve(Matrix corpus,
                             int desiredRank); static void main(String[] args);  }
@Test public void testHebbianSolver() { int numColumns = 800; Matrix corpus = randomSequentialAccessSparseMatrix(1000, 900, numColumns, 30, 1.0); int rank = 50; Matrix eigens = new DenseMatrix(rank, numColumns); TrainingState state = new TrainingState(eigens, null); long optimizedTime = timeSolver(corpus, 0.00001, 5, rank, state); eigens = state.getCurrentEigens(); assertEigen(eigens, corpus, 0.05, false); assertOrthonormal(eigens, 1.0e-6); System.out.println("Avg solving (Hebbian) time in ms: " + optimizedTime); }