You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by lu...@apache.org on 2009/07/19 22:05:34 UTC
svn commit: r795608 - in
/commons/proper/math/trunk/src/test/org/apache/commons/math/optimization:
MultiStartDifferentiableMultivariateRealOptimizerTest.java
MultiStartUnivariateRealOptimizerTest.java
Author: luc
Date: Sun Jul 19 20:05:34 2009
New Revision: 795608
URL: http://svn.apache.org/viewvc?rev=795608&view=rev
Log:
added new tests for multistart optimizers
Added:
commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/MultiStartDifferentiableMultivariateRealOptimizerTest.java (with props)
commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/MultiStartUnivariateRealOptimizerTest.java (with props)
Added: commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/MultiStartDifferentiableMultivariateRealOptimizerTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/MultiStartDifferentiableMultivariateRealOptimizerTest.java?rev=795608&view=auto
==============================================================================
--- commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/MultiStartDifferentiableMultivariateRealOptimizerTest.java (added)
+++ commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/MultiStartDifferentiableMultivariateRealOptimizerTest.java Sun Jul 19 20:05:34 2009
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.math.optimization;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.awt.geom.Point2D;
+import java.util.ArrayList;
+
+import org.apache.commons.math.FunctionEvaluationException;
+import org.apache.commons.math.analysis.DifferentiableMultivariateRealFunction;
+import org.apache.commons.math.analysis.MultivariateRealFunction;
+import org.apache.commons.math.analysis.MultivariateVectorialFunction;
+import org.apache.commons.math.analysis.solvers.BrentSolver;
+import org.apache.commons.math.optimization.general.ConjugateGradientFormula;
+import org.apache.commons.math.optimization.general.NonLinearConjugateGradientOptimizer;
+import org.apache.commons.math.random.GaussianRandomGenerator;
+import org.apache.commons.math.random.JDKRandomGenerator;
+import org.apache.commons.math.random.RandomVectorGenerator;
+import org.apache.commons.math.random.UncorrelatedRandomVectorGenerator;
+import org.junit.Test;
+
+public class MultiStartDifferentiableMultivariateRealOptimizerTest {
+
+ @Test
+ public void testCircleFitting() throws FunctionEvaluationException, OptimizationException {
+ Circle circle = new Circle();
+ circle.addPoint( 30.0, 68.0);
+ circle.addPoint( 50.0, -6.0);
+ circle.addPoint(110.0, -20.0);
+ circle.addPoint( 35.0, 15.0);
+ circle.addPoint( 45.0, 97.0);
+ NonLinearConjugateGradientOptimizer underlying =
+ new NonLinearConjugateGradientOptimizer(ConjugateGradientFormula.POLAK_RIBIERE);
+ JDKRandomGenerator g = new JDKRandomGenerator();
+ g.setSeed(753289573253l);
+ RandomVectorGenerator generator =
+ new UncorrelatedRandomVectorGenerator(new double[] { 50.0, 50.0 }, new double[] { 10.0, 10.0 },
+ new GaussianRandomGenerator(g));
+ MultiStartDifferentiableMultivariateRealOptimizer optimizer =
+ new MultiStartDifferentiableMultivariateRealOptimizer(underlying, 10, generator);
+ optimizer.setMaxIterations(100);
+ optimizer.setConvergenceChecker(new SimpleScalarValueChecker(1.0e-10, 1.0e-10));
+ BrentSolver solver = new BrentSolver();
+ solver.setAbsoluteAccuracy(1.0e-13);
+ solver.setRelativeAccuracy(1.0e-15);
+ RealPointValuePair optimum =
+ optimizer.optimize(circle, GoalType.MINIMIZE, new double[] { 98.680, 47.345 });
+ RealPointValuePair[] optima = optimizer.getOptima();
+ for (RealPointValuePair o : optima) {
+ Point2D.Double center = new Point2D.Double(o.getPointRef()[0], o.getPointRef()[1]);
+ assertEquals(69.960161753, circle.getRadius(center), 1.0e-8);
+ assertEquals(96.075902096, center.x, 1.0e-8);
+ assertEquals(48.135167894, center.y, 1.0e-8);
+ }
+ assertTrue(optimizer.getEvaluations() > 70);
+ assertTrue(optimizer.getEvaluations() < 90);
+ assertEquals(3.1267527, optimum.getValue(), 1.0e-8);
+ }
+
+ private static class Circle implements DifferentiableMultivariateRealFunction {
+
+ private ArrayList<Point2D.Double> points;
+
+ public Circle() {
+ points = new ArrayList<Point2D.Double>();
+ }
+
+ public void addPoint(double px, double py) {
+ points.add(new Point2D.Double(px, py));
+ }
+
+ public double getRadius(Point2D.Double center) {
+ double r = 0;
+ for (Point2D.Double point : points) {
+ r += point.distance(center);
+ }
+ return r / points.size();
+ }
+
+ private double[] gradient(double[] point) {
+
+ // optimal radius
+ Point2D.Double center = new Point2D.Double(point[0], point[1]);
+ double radius = getRadius(center);
+
+ // gradient of the sum of squared residuals
+ double dJdX = 0;
+ double dJdY = 0;
+ for (Point2D.Double pk : points) {
+ double dk = pk.distance(center);
+ dJdX += (center.x - pk.x) * (dk - radius) / dk;
+ dJdY += (center.y - pk.y) * (dk - radius) / dk;
+ }
+ dJdX *= 2;
+ dJdY *= 2;
+
+ return new double[] { dJdX, dJdY };
+
+ }
+
+ public double value(double[] variables)
+ throws IllegalArgumentException, FunctionEvaluationException {
+
+ Point2D.Double center = new Point2D.Double(variables[0], variables[1]);
+ double radius = getRadius(center);
+
+ double sum = 0;
+ for (Point2D.Double point : points) {
+ double di = point.distance(center) - radius;
+ sum += di * di;
+ }
+
+ return sum;
+
+ }
+
+ public MultivariateVectorialFunction gradient() {
+ return new MultivariateVectorialFunction() {
+ public double[] value(double[] point) {
+ return gradient(point);
+ }
+ };
+ }
+
+ public MultivariateRealFunction partialDerivative(final int k) {
+ return new MultivariateRealFunction() {
+ public double value(double[] point) {
+ return gradient(point)[k];
+ }
+ };
+ }
+
+ }
+
+}
Propchange: commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/MultiStartDifferentiableMultivariateRealOptimizerTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/MultiStartDifferentiableMultivariateRealOptimizerTest.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/MultiStartUnivariateRealOptimizerTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/MultiStartUnivariateRealOptimizerTest.java?rev=795608&view=auto
==============================================================================
--- commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/MultiStartUnivariateRealOptimizerTest.java (added)
+++ commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/MultiStartUnivariateRealOptimizerTest.java Sun Jul 19 20:05:34 2009
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.math.optimization;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.commons.math.MathException;
+import org.apache.commons.math.analysis.SinFunction;
+import org.apache.commons.math.analysis.UnivariateRealFunction;
+import org.apache.commons.math.optimization.univariate.BrentOptimizer;
+import org.apache.commons.math.random.JDKRandomGenerator;
+import org.junit.Test;
+
+public class MultiStartUnivariateRealOptimizerTest {
+
+ @Test
+ public void testSinMin() throws MathException {
+ UnivariateRealFunction f = new SinFunction();
+ UnivariateRealOptimizer underlying = new BrentOptimizer();
+ JDKRandomGenerator g = new JDKRandomGenerator();
+ g.setSeed(44428400075l);
+ MultiStartUnivariateRealOptimizer minimizer =
+ new MultiStartUnivariateRealOptimizer(underlying, 10, g);
+ minimizer.optimize(f, GoalType.MINIMIZE, -100.0, 100.0);
+ double[] optima = minimizer.getOptima();
+ for (int i = 1; i < optima.length; ++i) {
+ double d = (optima[i] - optima[i-1]) / (2 * Math.PI);
+ assertTrue (Math.abs(d - Math.rint(d)) < 1.0e-8);
+ assertEquals(-1.0, f.value(optima[i]), 1.0e-10);
+ }
+ assertTrue(minimizer.getEvaluations() > 2900);
+ assertTrue(minimizer.getEvaluations() < 3100);
+
+ }
+
+}
Propchange: commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/MultiStartUnivariateRealOptimizerTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/proper/math/trunk/src/test/org/apache/commons/math/optimization/MultiStartUnivariateRealOptimizerTest.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision