private boolean isConverged(DataBundle data) { DoubleArray deltaX = data.getDeltaX(); DoubleArray x = data.getX(); int n = deltaX.size(); double diff, scale; for (int i = 0; i < n; i++) { diff = Math.abs(deltaX.get(i)); scale = Math.abs(x.get(i)); if (diff > _absoluteTol + scale * _relativeTol) { return false; } } return (Math.sqrt(data.getG0()) < _absoluteTol); }
private void cubicBacktrack(DoubleArray p, Function<DoubleArray, DoubleArray> function, DataBundle data) { double temp1, temp2, temp3, temp4, temp5; double lambda0 = data.getLambda0(); double lambda1 = data.getLambda1(); double g0 = data.getG0(); temp1 = 1.0 / lambda0 / lambda0; temp2 = 1.0 / lambda1 / lambda1; temp3 = data.getG1() + g0 * (2 * lambda0 - 1.0); temp4 = data.getG2() + g0 * (2 * lambda1 - 1.0); temp5 = 1.0 / (lambda0 - lambda1); double a = temp5 * (temp1 * temp3 - temp2 * temp4); double b = temp5 * (-lambda1 * temp1 * temp3 + lambda0 * temp2 * temp4); double lambda = (-b + Math.sqrt(b * b + 6 * a * g0)) / 3 / a; lambda = Math.min(Math.max(lambda, 0.01 * lambda0), 0.75 * lambda1); // make sure new lambda is between 1% & 75% of old value data.swapLambdaAndReplace(lambda); updatePosition(p, function, data); }
private void quadraticBacktrack( DoubleArray p, Function<DoubleArray, DoubleArray> function, DataBundle data) { double lambda0 = data.getLambda0(); double g0 = data.getG0(); double lambda = Math.max(0.01 * lambda0, g0 * lambda0 * lambda0 / (data.getG1() + g0 * (2 * lambda0 - 1))); data.swapLambdaAndReplace(lambda); updatePosition(p, function, data); }