public double[] FeedForward(double[] input) { if (input.Length != NumberOfInputNodes) { throw new InvalidOperationException($"Number of inputs expected to be {NumberOfInputNodes} but was {input.Length}"); } var startNodes = nodes.Where(n => n.Layer == firstLayer).ToArray(); // Bias Node is always 1 NumberOfBiasNodes.Times(i => startNodes[i].OutputValue = 1); NumberOfInputNodes.Times(i => startNodes[i + NumberOfBiasNodes].OutputValue = input[i]); EngageNodes(); var outputs = GetOutputs().ToArray(); ResetNodes(); return(outputs); }
public Genome(int numberOfInputNodes, int numberOfOutputNodes, InnovationHistory innovationHistory, bool isBaby = false) { NumberOfBiasNodes = 1; NumberOfInputNodes = numberOfInputNodes; NumberOfOutputNodes = numberOfOutputNodes; this.innovationHistory = innovationHistory; Guard.GreaterThanZero(() => numberOfInputNodes); Guard.GreaterThanZero(() => numberOfOutputNodes); Layers = 2; if (isBaby) { return; } NumberOfBiasNodes.Times(_ => AddNode(firstLayer)); numberOfInputNodes.Times(_ => AddNode(firstLayer)); numberOfOutputNodes.Times(_ => AddNode(firstLayer + 1)); }