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 } |