package aima.learning.statistics;
import java.util.ArrayList;
import java.util.List;
public class Neuron {
private double bias;
private ActivationFunction activationFuncton;
private List inLinks, outLinks;
private boolean inputAccepted;
private double activation;
public Neuron() {
this.activationFuncton = new TanhActivationFunction();
this.bias = 1.0;
inLinks = new ArrayList();
outLinks = new ArrayList();
inputAccepted = false;
}
public Neuron(double bias) {
this();
this.bias = bias;
}
public Neuron(double bias, ActivationFunction activationFunction) {
this(bias);
this.activationFuncton = activationFunction;
}
public double bias() {
return bias;
}
public double error(double value) {
return value - activation;
}
public double netInput() {
double sum = 0;
for (Link link : inLinks) {
sum += link.source().activation() * link.weight();
}
sum += bias;
return sum;
}
public double activation() {
return activation;
}
public void update() {
if (!inputAccepted) {
double netInput = netInput();
activation = activationFuncton.activation(netInput);
}
}
public List inLinks() {
return inLinks;
}
public List outLinks() {
return outLinks;
}
public void connectTo(Neuron n, double d) {
Link link = new Link(this, n, d);
this.outLinks.add(link);
n.inLinks.add(link);
}
public List weights() {
List weights = new ArrayList();
for (Link link : inLinks) {
weights.add(link.weight());
}
return weights;
}
public void acceptAsInput(double d) {
inputAccepted = true;
activation = d;
}
/**
* @return Returns the activationFuncton.
*/
public ActivationFunction getActivationFuncton() {
return activationFuncton;
}
public void setBias(double bias) {
this.bias = bias;
}
}