Example #1
0
        public double[] Execute(double[] inputs)
        {
            if (inputs.Length != inputNeurons.Length)
            {
                throw new ArgumentOutOfRangeException("The number of inputs must match the number of input neurons.");
            }

            foreach (Neuron neuron in GetAllNeurons())
            {
                neuron.Value = 0;
            }

            for (int i = 0; i < inputs.Length; i++)
            {
                inputNeurons[i].Value = inputs[i];
            }

            List <int> layersToGoThrough = new List <int>();

            layersToGoThrough.AddRange(GetHiddenLayers());
            layersToGoThrough.Add((int)Neuron.IONeuronType.Output);

            foreach (int layer in layersToGoThrough)
            {
                foreach (Neuron neuron in GetNeuronsForLayer(layer))
                {
                    Synapse[] synapsesToNeuron = synapses.Where(x => x.ToLayer == layer && x.ToNeuron == neuron.NeuronPosition).ToArray();
                    double    value            = 0;

                    foreach (Synapse synapseFromneuron in synapsesToNeuron)
                    {
                        Neuron[] connectedNeurons = GetAllNeurons().Where(y => y.Layer == synapseFromneuron.FromLayer && y.NeuronPosition == synapseFromneuron.FromNeuron).ToArray();
                        foreach (Neuron connectedNeuron in connectedNeurons)
                        {
                            value += connectedNeuron.Value * synapseFromneuron.Weight;
                        }
                    }

                    neuron.Value = activationMethod.Invoke(value + neuron.Bias);
                }
            }

            double[] outputs = new double[outputNeurons.Length];
            for (int i = 0; i < outputNeurons.Length; i++)
            {
                outputs[i] = outputNeurons[i].Value;
            }
            return(outputs);
        }