1 package net.sf.openrocket.utils;
3 import java.util.ArrayList;
5 import java.util.concurrent.ArrayBlockingQueue;
6 import java.util.concurrent.ExecutorService;
7 import java.util.concurrent.ThreadPoolExecutor;
8 import java.util.concurrent.TimeUnit;
10 import net.sf.openrocket.optimization.general.Function;
11 import net.sf.openrocket.optimization.general.FunctionOptimizer;
12 import net.sf.openrocket.optimization.general.OptimizationController;
13 import net.sf.openrocket.optimization.general.OptimizationException;
14 import net.sf.openrocket.optimization.general.ParallelExecutorCache;
15 import net.sf.openrocket.optimization.general.Point;
16 import net.sf.openrocket.optimization.general.multidim.MultidirectionalSearchOptimizer;
17 import net.sf.openrocket.util.MathUtil;
20 public class TestFunctionOptimizerLoop {
22 private static final double PRECISION = 0.01;
24 private Point optimum;
25 private int stepCount = 0;
26 private int evaluations = 0;
30 private void go(final FunctionOptimizer optimizer, final Point optimum, final int maxSteps, ExecutorService executor) throws OptimizationException {
32 Function function = new Function() {
34 public double evaluate(Point p) throws InterruptedException {
36 return p.sub(optimum).length2();
40 OptimizationController control = new OptimizationController() {
43 public boolean stepTaken(Point oldPoint, double oldValue, Point newPoint, double newValue, double stepSize) {
45 if (stepCount % 1000 == 0) {
46 System.err.println("WARNING: Over " + stepCount + " steps required for optimum=" + optimum +
47 " position=" + newPoint);
49 double distance = newPoint.sub(optimum).length();
50 return distance >= PRECISION;
55 ParallelExecutorCache cache = new ParallelExecutorCache(executor);
56 cache.setFunction(function);
57 optimizer.setFunctionCache(cache);
58 optimizer.optimize(new Point(optimum.dim(), 0.5), control);
62 public static void main(String[] args) throws OptimizationException {
64 System.err.println("PRECISION = " + PRECISION);
66 ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 2, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100));
68 for (int dim = 1; dim <= 10; dim++) {
70 List<Integer> stepCount = new ArrayList<Integer>();
71 List<Integer> functionCount = new ArrayList<Integer>();
73 MultidirectionalSearchOptimizer optimizer = new MultidirectionalSearchOptimizer();
74 for (int count = 0; count < 200; count++) {
75 TestFunctionOptimizerLoop test = new TestFunctionOptimizerLoop();
76 double[] point = new double[dim];
77 for (int i = 0; i < dim; i++) {
78 point[i] = Math.random();
81 test.go(optimizer, new Point(point), 20, executor);
82 stepCount.add(test.stepCount);
83 functionCount.add(test.evaluations);
86 // System.err.println("StepCount = " + stepCount);
88 System.out.printf("dim=%d Steps avg=%5.2f dev=%5.2f median=%.1f " +
89 "Evaluations avg=%5.2f dev=%5.2f median=%.1f\n",
90 dim, MathUtil.average(stepCount), MathUtil.stddev(stepCount), MathUtil.median(stepCount),
91 MathUtil.average(functionCount), MathUtil.stddev(functionCount), MathUtil.median(functionCount));
92 System.out.println("stat: " + optimizer.getStatistics());
96 executor.shutdownNow();