private static void DrawNeuron(this Network network, Neuron neuron, Graphics graphic)
        {
            Pen pen = new Pen(Color.Black);
            Point point = Translate(network, neuron);
            Size size = new Size(10, 10);
            Rectangle r = new Rectangle(point, size);

            Color color = Blend(Color.Gray, Color.Red, (neuron.Signal - 0.5));

            Brush brush = new SolidBrush(color);
            graphic.FillEllipse(brush, r);
            graphic.DrawEllipse(pen, r);

            // Draw signal text
            Font font = new Font(FontFamily.GenericSerif, 8);
            Brush fontbrush = new SolidBrush(Color.DarkBlue);
            point = point.Shift(0, 10);

            graphic.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit;
            graphic.DrawString(neuron.Signal.ToString("f2"), font, fontbrush, point);

            // Draw Error:
            point = point.Shift(0, 10);
            fontbrush = new SolidBrush(Color.Red);
            graphic.DrawString(neuron.ErrorGradient.ToString("f2"), font, fontbrush, point);
        }
 public static void Link(this Neuron a, Neuron b)
 {
     Axon axon = new Axon();
     axon.Source = a;
     axon.Target = b;
     a.Axons.Add(axon);
     b.Dendrites.Add(axon);
 }
 public Layer(int size)
 {
     for (int i = 0; i < size; i++)
     {
         Neuron neuron = new Neuron();
         Neurons.Add(neuron);
     }
 }
 public static double CalcOutputErrorGradient(Neuron neuron) // for an output neuron
 {
     double signal = neuron.Signal;
     double desired = neuron.Desired;
     double delta = (desired - signal);
     double gradient = signal * (1 - signal);
     double result = gradient * delta;
     return result;
 }
 public Layer LayerOf(Neuron neuron)
 {
     foreach(Layer layer in Layers)
     {
         layer.Neurons.Contains(neuron);
         return layer;
     }
     return null;
 }
        public static Point Translate(Network network, Neuron neuron)
        {
            // translate a network coordinate to a screen coordinate

            Layer layer = network.LayerOf(neuron);

            Point p = neuron.Coordinate.Multiply(100, 25).Add(50);
            return p;            
        }
        public static double CalcErrorGradient(Neuron neuron) // for a non-output neuron
        {
            // this function needs to be called through the network from output towards input!!! (backpropagated)

            double signal = neuron.Signal;
            double deltasum = 0;
            foreach (Axon axon in neuron.Axons)
            {
                deltasum += axon.Weight * axon.Target.ErrorGradient;
            }
            double gradient = signal * (1 - signal);
            double result = gradient * deltasum;
            return result;
        }