annotate examples/maths/Optimizer.java @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents 5df24c91468d
children
rev   line source
samer@1 1 package eg.maths;
samer@1 2 import samer.core.*;
samer@1 3 import samer.core.types.*;
samer@1 4 import samer.maths.*;
samer@1 5 import samer.maths.opt.*;
samer@1 6 import samer.nn.nonlin.*;
samer@1 7
samer@1 8 public class Optimizer implements Agent
samer@1 9 {
samer@1 10 Node node=Node.push(new Node("optimizer"));
samer@1 11 Function fn;
samer@1 12 VDouble a = new VDouble("a",-1);
samer@1 13 VDouble b = new VDouble("b",0);
samer@1 14 VDouble c = new VDouble("c",1);
samer@1 15
samer@1 16 MinimumBracket br = new MinimumBracket();
samer@1 17 BrentMinimiser min = new BrentMinimiser();
samer@1 18
samer@1 19 public Optimizer()
samer@1 20 {
samer@1 21 Object obj = (Function)Space.get("function");
samer@1 22 if (obj==null) {
samer@1 23 fn = new CompoundFunction( new Square(), new Quadratic(1,0,-1));
samer@1 24 } else {
samer@1 25 if (obj instanceof Function) fn=(Function)obj;
samer@1 26 else if (obj instanceof FunctionOfVector) {
samer@1 27 FunctionOfVector vfn=(FunctionOfVector)obj;
samer@1 28 VVector x = (VVector)Space.get("vector");
samer@1 29 VVector d = new VVector("d",x.size());
samer@1 30 LineFunction linefn = new LineFunction(vfn,x.size());
samer@1 31 linefn.setBase(x.array());
samer@1 32 linefn.setDirection(d.array());
samer@1 33 fn=linefn;
samer@1 34 }
samer@1 35 }
samer@1 36
samer@1 37 br.setFunction(fn);
samer@1 38 min.setFunction(fn);
samer@1 39 min.setFractionalTolerance(0.0001);
samer@1 40 min.setAbsoluteTolerance(0.0001);
samer@1 41 min.setBracket(br);
samer@1 42
samer@1 43 Shell.showViewer(new FunctionPlotter( node, fn), "Function");
samer@1 44 Shell.showViewer(new FunctionPlotter( node, fn.derivative()), "Derivative");
samer@1 45 Shell.exposeCommands(this);
samer@1 46 Shell.exposeViewables();
samer@1 47 }
samer@1 48
samer@1 49 public void getCommands(Agent.Registry r) {
samer@1 50 r.add("bracket").add("minimise");
samer@1 51 }
samer@1 52
samer@1 53 public void execute(String cmd, Environment env)
samer@1 54 {
samer@1 55 if (cmd.equals("bracket")) {
samer@1 56 br.setInitialPoints(a.value,b.value);
samer@1 57 br.run();
samer@1 58 a.value = br.ax; a.changed();
samer@1 59 b.value = br.bx; b.changed();
samer@1 60 c.value = br.cx; c.changed();
samer@1 61 } else if (cmd.equals("minimise")) {
samer@1 62 min.run();
samer@1 63 Shell.print("minimum at x="+min.getArgument());
samer@1 64 Shell.print("function value f(x)="+min.getValue());
samer@1 65 Shell.print("took "+min.getIterations()+" iterations");
samer@1 66 }
samer@1 67 }
samer@1 68 }