valueAtNextPoint = function.valueAt(nextPoint); System.arraycopy(function.gradientAt(nextPoint), 0, gradAtNextPoint, 0, gradAtNextPoint.length);
@Override public int getDimension() { return f.getDimension(); }
this.dimension = l2RegFunction.getDimension(); this.updateInfo = new UpdateInfo(this.m, this.dimension); double currValue = l2RegFunction.valueAt(currPoint); System.arraycopy(l2RegFunction.gradientAt(currPoint), 0, currGrad, 0, dimension);
@Override public double valueAt(double[] x) { checkDimension(x); double value = f.valueAt(x); if (l2Cost > 0) { value += l2Cost * ArrayMath.innerProduct(x, x); } return value; }
@Override public double[] gradientAt(double[] x) { checkDimension(x); double[] gradient = f.gradientAt(x); if (l2Cost > 0) { for (int i = 0; i < x.length; i++) { gradient[i] += 2 * l2Cost * x[i]; } } return gradient; }
this.dimension = l2RegFunction.getDimension(); this.updateInfo = new UpdateInfo(this.m, this.dimension); double currValue = l2RegFunction.valueAt(currPoint); System.arraycopy(l2RegFunction.gradientAt(currPoint), 0, currGrad, 0, dimension);
@Test public void testQuadraticFunction() { QNMinimizer minimizer = new QNMinimizer(); Function f = new QuadraticFunction(); double[] x = minimizer.minimize(f); double minValue = f.valueAt(x); Assert.assertEquals(x[0], 1.0, 1e-5); Assert.assertEquals(x[1], 5.0, 1e-5); Assert.assertEquals(minValue, 10.0, 1e-10); }
@Override public double[] gradientAt(double[] x) { checkDimension(x); double[] gradient = f.gradientAt(x); if (l2Cost > 0) { for (int i = 0; i < x.length; i++) { gradient[i] += 2 * l2Cost * x[i]; } } return gradient; }
@Test public void testLineSearchDeterminesSaneStepLength1() { Function objectiveFunction = new QuadraticFunction1(); // given double[] testX = new double[] { 0 }; double testValueX = objectiveFunction.valueAt(testX); double[] testGradX = objectiveFunction.gradientAt(testX); double[] testDirection = new double[] { 1 }; // when LineSearchResult lsr = LineSearchResult.getInitialObject(testValueX, testGradX, testX); LineSearch.doLineSearch(objectiveFunction, testDirection, lsr, 1.0); double stepSize = lsr.getStepSize(); // then boolean succCond = TOLERANCE < stepSize && stepSize <= 1; Assert.assertTrue(succCond); }
this.dimension = l2RegFunction.getDimension(); this.updateInfo = new UpdateInfo(this.m, this.dimension); double currValue = l2RegFunction.valueAt(currPoint); System.arraycopy(l2RegFunction.gradientAt(currPoint), 0, currGrad, 0, dimension);
@Test public void testRosenbrockFunction() { QNMinimizer minimizer = new QNMinimizer(); Function f = new Rosenbrock(); double[] x = minimizer.minimize(f); double minValue = f.valueAt(x); Assert.assertEquals(x[0], 1.0, 1e-5); Assert.assertEquals(x[1], 1.0, 1e-5); Assert.assertEquals(minValue, 0, 1e-10); }
@Override public double[] gradientAt(double[] x) { checkDimension(x); double[] gradient = f.gradientAt(x); if (l2Cost > 0) { for (int i = 0; i < x.length; i++) { gradient[i] += 2 * l2Cost * x[i]; } } return gradient; }
@Override public int getDimension() { return f.getDimension(); }
valueAtNextPoint = function.valueAt(nextPoint) + l1Cost * ArrayMath.l1norm(nextPoint); System.arraycopy(function.gradientAt(nextPoint), 0, gradAtNextPoint, 0, gradAtNextPoint.length);
@Override public double valueAt(double[] x) { checkDimension(x); double value = f.valueAt(x); if (l2Cost > 0) { value += l2Cost * ArrayMath.innerProduct(x, x); } return value; }
@Override public int getDimension() { return f.getDimension(); }
@Test public void testLineSearchDeterminesSaneStepLength2() { Function objectiveFunction = new QuadraticFunction2(); // given double[] testX = new double[] { -2 }; double testValueX = objectiveFunction.valueAt(testX); double[] testGradX = objectiveFunction.gradientAt(testX); double[] testDirection = new double[] { 1 }; // when LineSearchResult lsr = LineSearchResult.getInitialObject(testValueX, testGradX, testX); LineSearch.doLineSearch(objectiveFunction, testDirection, lsr, 1.0); double stepSize = lsr.getStepSize(); // then boolean succCond = TOLERANCE < stepSize && stepSize <= 1; Assert.assertTrue(succCond); }
@Override public double valueAt(double[] x) { checkDimension(x); double value = f.valueAt(x); if (l2Cost > 0) { value += l2Cost * ArrayMath.innerProduct(x, x); } return value; }
@Test public void testLineSearchFailsWithWrongDirection1() { Function objectiveFunction = new QuadraticFunction1(); // given double[] testX = new double[] { 0 }; double testValueX = objectiveFunction.valueAt(testX); double[] testGradX = objectiveFunction.gradientAt(testX); double[] testDirection = new double[] { -1 }; // when LineSearchResult lsr = LineSearchResult.getInitialObject(testValueX, testGradX, testX); LineSearch.doLineSearch(objectiveFunction, testDirection, lsr, 1.0); double stepSize = lsr.getStepSize(); // then boolean succCond = TOLERANCE < stepSize && stepSize <= 1; Assert.assertFalse(succCond); Assert.assertEquals(0.0, stepSize, TOLERANCE); }
@Test public void testLineSearchFailsWithWrongDirection3() { Function objectiveFunction = new QuadraticFunction1(); // given double[] testX = new double[] { 4 }; double testValueX = objectiveFunction.valueAt(testX); double[] testGradX = objectiveFunction.gradientAt(testX); double[] testDirection = new double[] { 1 }; // when LineSearchResult lsr = LineSearchResult.getInitialObject(testValueX, testGradX, testX); LineSearch.doLineSearch(objectiveFunction, testDirection, lsr, 1.0); double stepSize = lsr.getStepSize(); // then boolean succCond = TOLERANCE < stepSize && stepSize <= 1; Assert.assertFalse(succCond); Assert.assertEquals(0.0, stepSize, TOLERANCE); }