public static OptimisationReport runNewton(MatrixChains chains, double[] angles) { System.out.println("f: " + Newton.f(chains, angles)); System.out.println(); DenseMatrix64F dby1 = Newton.get1d(chains, angles); System.out.println("dby1: " + dby1); System.out.println("numDiff: " + Newton.numDiff1d(chains, angles, 1e-6)); System.out.println(); DenseMatrix64F dby11 = Newton.get2d(chains, angles); System.out.println("dby11: " + dby11); System.out.println("numDiff: " + Newton.numDiff2d(chains, angles, 1e-5)); OptimisationReport report = runNewtonRun(chains, angles, 25); if (report.gradn >= chains.tolerance) { report.status = "FAILED"; } else { int minIndex = diagnoseEigenvalues(report.eigenvalues); if (minIndex == -1) { report.status = "RIGID"; } else { report.status = "LOOSE"; chains.regularise = 1e-1; chains.initialPoint = angles; System.out.println("Beginning 2nd run with regularisation " + chains.regularise); report = runNewtonRun(chains, angles, 30); report.status = (report.gradn >= chains.tolerance) ? "LOOSE-FAILED" : "LOOSE"; System.out.println("Original vector was " + printVec(angles)); chains.regularise = 1e-4; chains.initialPoint = report.angles; System.out.println("Beginning 3nd run with regularisation " + chains.regularise); report = runNewtonRun(chains, report.angles, 30); report.status = (report.gradn >= chains.tolerance) ? "LOOSE-FAILED" : "LOOSE"; System.out.println("Original vector was " + printVec(angles)); } } System.out.println("Optimisation concluded - the configuration is " + report.status); return report; }