/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package automenta.spacenet.run.old.graph.neural; import automenta.spacenet.plugin.neural.brainz.AbstractNeuron; import automenta.spacenet.plugin.neural.brainz.Brain; import automenta.spacenet.plugin.neural.brainz.BrainBuilder; import automenta.spacenet.plugin.neural.brainz.BrainGraph; import automenta.spacenet.plugin.neural.brainz.InterNeuron; import automenta.spacenet.plugin.neural.brainz.MotorNeuron; import automenta.spacenet.plugin.neural.brainz.SenseNeuron; import automenta.spacenet.run.ArdorSpacetime; import automenta.spacenet.run.old.DefaultGraphBuilder; import automenta.spacenet.space.Repeat; import automenta.spacenet.space.geom.Box; import automenta.spacenet.space.geom.Box.BoxShape; import automenta.spacenet.space.geom.ProcessBox; import automenta.spacenet.space.geom.Rect; import automenta.spacenet.space.geom.Rect.RectShape; import automenta.spacenet.space.geom.graph.GraphBox; import automenta.spacenet.space.geom.graph.GraphBoxBuilder; import automenta.spacenet.space.geom.graph.GraphBoxModel; import automenta.spacenet.space.geom.graph.arrange.GridListing; import automenta.spacenet.space.geom.layout.ColRect; import automenta.spacenet.var.Maths; import automenta.spacenet.var.graph.MemGraph; import automenta.spacenet.var.physical.Color; import com.ardor3d.scenegraph.Spatial; /** * * @author seh */ public class DemoBrainz extends ProcessBox { final Brain b = new BrainBuilder(16, 8).newBrain(100, 4, 32); double neuronBoxUpdatePeriod = 0.05; double neuronUpdatePeriod = 0.05; private Rect outputRect; private double[] nextOutputs; public MemGraph getGraph() { return new BrainGraph(b); } double neuronScale = 0.7; public GraphBoxBuilder getGraphBuilder() { return new DefaultGraphBuilder() { @Override public Box newNodeSpace(Object node) { Box b = new Box(BoxShape.Empty); if (node instanceof AbstractNeuron) { final AbstractNeuron i = (AbstractNeuron) node; final Rect r = b.add(new Rect(node instanceof InterNeuron ? RectShape.Rect : RectShape.Ellipse)); b.add(new Repeat(neuronBoxUpdatePeriod) { @Override protected void update(double t, double dt, Spatial parent) { double o = i.getOutput(); double p = o; if (i instanceof InterNeuron) p = ((InterNeuron)i).getPotential(); r.color(getNeuronColor(o, p)); r.scale( 0.25 + (Math.abs( o ) + Math.abs(p)) * neuronScale); } }); } return b; } }; } @Override protected void start() { double size = 20.0; //V3 boundsMax = new V3(size, size, size); // ForceDirectedParameters par = new ForceDirectedParameters(boundsMax, 0.01, 0.001, 1.0); // double updatePeriod = 0.05; // double interpSpeed = 0.3; // int substeps = 12; //ForceDirecting arr = new ForceDirecting(par, updatePeriod, substeps, interpSpeed); GraphBoxModel arr = new GridListing(-0.5, -0.5, 0.5, 0.5, null); add(new GraphBox(getGraph(), getGraphBuilder(), arr)); //add(new ForceDirectedParametersEditWindow(par, DemoDefaults.font)).move(-1, 0, 0); System.out.println(b.getTotalNeurons() + " * " + b.getTotalSynapses()); System.out.println("senses: " + b.getSense()); System.out.println("neurons: " + b.getNeuron()); System.out.println("motors: " + b.getMotor()); // final Map<SenseNeuron, Rect> senseRect = new HashMap(); // final Map<InterNeuron, Rect> neuronRect = new HashMap(); // double x = 0; // double s = 0.1; // for (InterNeuron i : b.getNeuron()) { // Rect r = add(new Rect(RectShape.Rect)); // r.scale(0.1, 1); // r.move(x, 0, 0); // neuronRect.put(i, r); // x += s; // } // // x = 0; // s = 0.1; // for (SenseNeuron i : b.getSense()) { // Rect r = add(new Rect(RectShape.Rect)); // r.scale(0.1, 1); // r.move(x, 1, 0); // senseRect.put(i, r); // x += s; // } outputRect = add(new Rect(RectShape.Empty)).move(0.8,0,0).scale(0.5); add(new Repeat(3.0) { @Override protected void update(double t, double dt, Spatial parent) { randomizeInputs(); } }); add(new Repeat(neuronUpdatePeriod) { @Override protected void update(double t, double dt, Spatial parent) { updateInputs(); b.forward(); updateOutputs(); } }); } protected void updateOutputs() { outputRect.removeAll(); Rect[] o = new Rect[b.getMotor().size()]; int j = 0; for (MotorNeuron m : b.getMotor()) { double bo = m.getOutput(); Color c; if (bo < 0.5) c = Color.Blue; else c = Color.Red; Rect re = new Rect(RectShape.Ellipse); re.color(c); o[j++] = re; } outputRect.add(new ColRect(0.01, o)); } public void randomizeInputs() { if (nextOutputs == null) { nextOutputs = new double[b.getSense().size()]; } for (int i = 0; i < b.getSense().size(); i++) { nextOutputs[i] = Maths.random(-1, 1); } } double inputMomentum = 0.98; public void updateInputs() { int i = 0; for (SenseNeuron s : b.getSense()) { s.senseInput = (inputMomentum * s.senseInput) + ((1.0 - inputMomentum) * nextOutputs[i++]); } } public Color getNeuronColor(double a, double b) { a = (a + 1.0) * 0.5; b = (b + 1.0) * 0.5; return new Color(a, 0, b); } public static void main(String[] args) { ArdorSpacetime.newWindow(new DemoBrainz()); } }