samer@1: package eg.maths; samer@1: import samer.core.*; samer@1: import samer.core.types.*; samer@1: import samer.maths.*; samer@1: import samer.maths.opt.*; samer@1: import samer.nn.nonlin.*; samer@1: samer@1: public class Optimizer implements Agent samer@1: { samer@1: Node node=Node.push(new Node("optimizer")); samer@1: Function fn; samer@1: VDouble a = new VDouble("a",-1); samer@1: VDouble b = new VDouble("b",0); samer@1: VDouble c = new VDouble("c",1); samer@1: samer@1: MinimumBracket br = new MinimumBracket(); samer@1: BrentMinimiser min = new BrentMinimiser(); samer@1: samer@1: public Optimizer() samer@1: { samer@1: Object obj = (Function)Space.get("function"); samer@1: if (obj==null) { samer@1: fn = new CompoundFunction( new Square(), new Quadratic(1,0,-1)); samer@1: } else { samer@1: if (obj instanceof Function) fn=(Function)obj; samer@1: else if (obj instanceof FunctionOfVector) { samer@1: FunctionOfVector vfn=(FunctionOfVector)obj; samer@1: VVector x = (VVector)Space.get("vector"); samer@1: VVector d = new VVector("d",x.size()); samer@1: LineFunction linefn = new LineFunction(vfn,x.size()); samer@1: linefn.setBase(x.array()); samer@1: linefn.setDirection(d.array()); samer@1: fn=linefn; samer@1: } samer@1: } samer@1: samer@1: br.setFunction(fn); samer@1: min.setFunction(fn); samer@1: min.setFractionalTolerance(0.0001); samer@1: min.setAbsoluteTolerance(0.0001); samer@1: min.setBracket(br); samer@1: samer@1: Shell.showViewer(new FunctionPlotter( node, fn), "Function"); samer@1: Shell.showViewer(new FunctionPlotter( node, fn.derivative()), "Derivative"); samer@1: Shell.exposeCommands(this); samer@1: Shell.exposeViewables(); samer@1: } samer@1: samer@1: public void getCommands(Agent.Registry r) { samer@1: r.add("bracket").add("minimise"); samer@1: } samer@1: samer@1: public void execute(String cmd, Environment env) samer@1: { samer@1: if (cmd.equals("bracket")) { samer@1: br.setInitialPoints(a.value,b.value); samer@1: br.run(); samer@1: a.value = br.ax; a.changed(); samer@1: b.value = br.bx; b.changed(); samer@1: c.value = br.cx; c.changed(); samer@1: } else if (cmd.equals("minimise")) { samer@1: min.run(); samer@1: Shell.print("minimum at x="+min.getArgument()); samer@1: Shell.print("function value f(x)="+min.getValue()); samer@1: Shell.print("took "+min.getIterations()+" iterations"); samer@1: } samer@1: } samer@1: }