package net.sf.openrocket.utils; import net.sf.openrocket.optimization.general.Function; import net.sf.openrocket.optimization.general.FunctionOptimizer; import net.sf.openrocket.optimization.general.OptimizationController; import net.sf.openrocket.optimization.general.OptimizationException; import net.sf.openrocket.optimization.general.ParallelExecutorCache; import net.sf.openrocket.optimization.general.ParallelFunctionCache; import net.sf.openrocket.optimization.general.Point; import net.sf.openrocket.optimization.general.multidim.MultidirectionalSearchOptimizer; public class TestFunctionOptimizer { private static final int LOOP_COUNT = 1000000; private volatile int evaluations = 0; private volatile int aborted = 0; private volatile int stepCount = 0; private void go(final ParallelFunctionCache functionCache, final FunctionOptimizer optimizer, final Point optimum, final int maxSteps) throws OptimizationException { Function function = new Function() { @Override public double evaluate(Point p) throws InterruptedException { if (loop(LOOP_COUNT)) { evaluations++; return p.sub(optimum).length2(); } else { aborted++; return Double.NaN; } } }; OptimizationController control = new OptimizationController() { @Override public boolean stepTaken(Point oldPoint, double oldValue, Point newPoint, double newValue, double stepSize) { stepCount++; // System.out.println("CSV " + count + ", " + evaluations + ", " + newPoint.sub(optimum).length()); // System.out.println("Steps: " + count + " Function evaluations: " + evaluations); // System.out.println("Distance: " + newPoint.sub(optimum).length() + " " + newPoint + " value=" + newValue); return stepCount < maxSteps; } }; ; functionCache.setFunction(function); optimizer.setFunctionCache(functionCache); optimizer.optimize(new Point(optimum.dim(), 0.5), control); System.err.println("Result: " + optimizer.getOptimumPoint() + " value=" + optimizer.getOptimumValue()); System.err.println("Steps: " + stepCount + " Evaluations: " + evaluations); } public static double counter; private static boolean loop(int count) { counter = 1.0; for (int i = 0; i < count; i++) { counter += Math.sin(counter); if (i % 1024 == 0) { if (Thread.interrupted()) { return false; } } } return true; } public static void main(String[] args) throws InterruptedException, OptimizationException { System.err.println("Number of processors: " + Runtime.getRuntime().availableProcessors()); for (int i = 0; i < 20; i++) { long t0 = System.currentTimeMillis(); loop(LOOP_COUNT); long t1 = System.currentTimeMillis(); System.err.println("Loop delay at startup: " + (t1 - t0) + "ms"); } System.err.println(); for (int threadCount = 1; threadCount <= 10; threadCount++) { System.err.println("THREAD COUNT: " + threadCount); TestFunctionOptimizer test = new TestFunctionOptimizer(); ParallelExecutorCache executor = new ParallelExecutorCache(threadCount); MultidirectionalSearchOptimizer optimizer = new MultidirectionalSearchOptimizer(); long t0 = System.currentTimeMillis(); test.go(executor, optimizer, new Point(0.2, 0.3, 0.85), 30); long t1 = System.currentTimeMillis(); System.err.println("Optimization took " + (t1 - t0) + "ms"); System.err.println("" + test.stepCount + " steps, " + test.evaluations + " function evaluations, " + test.aborted + " aborted evaluations"); System.err.println("Statistics: " + optimizer.getStatistics()); executor.getExecutor().shutdownNow(); Thread.sleep(1000); t0 = System.currentTimeMillis(); loop(LOOP_COUNT); t1 = System.currentTimeMillis(); System.err.println("Loop delay afterwards: " + (t1 - t0) + "ms"); System.err.println(); } } }