/*

  Neuron class

*/


import java.awt.*;

public class Neuron {

  private Net net;
  private Graphics g;
  private int layer, node, x, y, size;
  private float[] weight;
  private float value = 0;

  public Neuron () {
  }

  public Neuron (Net nt, int my_layer, int my_node, Graphics gr) {
    net = nt;
    layer = my_layer;
    node = my_node;
    weight = new float[net.max_nodes+1];
    g = gr;
  }

  public float getWeight (int w) {
    return weight[w];
  }

  public void setWeight (int index, float val) {
    weight[index] = val;
  }

  public void clearWeights () {
    int i;
    
    if (layer > 1)
      for (i = 0; i <= net.num_nodes[layer-1]; i ++)
        weight[i] = (float) (0.2 * Math.random() - 0.1);
        // initialize weights between -.1 and .1
    paint(g);
  }

  public float getValue () {
    return value;
  }

  public float getRndValue () {
    float rnd = Math.round (value * 10000);
    rnd = rnd / 10000;
    return (rnd);
  }

  public void setValue (float amt) {
    value = amt;
    paint(g);
  }

  public void setCoord (int new_x, int new_y, int new_size) {
    x = new_x;
    y = new_y;
    size = new_size;
  }

  public void paint (Graphics g) {
    int i, clr;
    Neuron nghbr_neuron;
    Color c;

    if (node != 0) {
    // if (node > 99999) {   // use this line to prevent net from drawing

      // draw neurons  [range mostly between -1 and 1]

      clr = (int) (value * 127) + 127;
      c = new Color (15, 0, clr);                    // blue
      if (value > 1) c = new Color (150, 150, 150);  // light gray
      if (value < -1) c = new Color (30, 30, 30);    // dark gray
      g.setColor (c);
      g.fillOval (x, y, size, size);

      // draw connections (weights)  [range between -1 and 1]

      if (layer > 1)
        for (i = 1; i <= net.num_nodes[layer-1]; i ++) {
          nghbr_neuron = net.neuron[layer-1][i];
          clr = (int) (weight[i] * 127 + 127);
          g.setColor(new Color (clr, 0, 50));        // light purple
          g.drawLine(x + size/2, y-1, nghbr_neuron.x + nghbr_neuron.size/2,
                                      nghbr_neuron.y + nghbr_neuron.size);
        }
    }
  }

}
