public NeuralOutput Think(SensoryInput input)
        {
            for (var layer = 0; layer < Network.Layers.Length; ++layer)
            {
                for (var neuron = 0; neuron < Network.Layers[layer].Neurons.Length; neuron++)
                {
                    if (layer == 0)
                    {
                        Network.Layers[layer].Neurons[neuron].Value = input.Values[neuron];
                    }
                    else
                    {
                        Network.Layers[layer].Neurons[neuron].Value = 0;
                        for (var dentrite = 0; dentrite < Network.Layers[layer - 1].Neurons.Length; ++dentrite)
                        {
                            Network.Layers[layer].Neurons[neuron].Value = Network.Layers[layer].Neurons[neuron].Value +
                                                                          Network.Layers[layer - 1].Neurons[dentrite]
                                                                          .Value *
                                                                          Network.Layers[layer].Neurons[neuron].Dendrite
                                                                          [dentrite].Weight;
                        }
                        Network.Layers[layer].Neurons[neuron].Value =
                            MathUtilityHelper.HyperbolicTangent(Network.Layers[layer].Neurons[neuron].Value);
                    }
                }
            }

            NeuralOutput output;

            output.Values = new double[Network.Layers[Network.Layers.Length - 1].Neurons.Length];
            for (var neuron = 0; neuron < output.Values.Length; ++neuron)
            {
                output.Values[neuron] = Network.Layers[Network.Layers.Length - 1].Neurons[neuron].Value;
//                    Mathf.Clamp((float) Network.Layers[Network.Layers.Length - 1].Neurons[neuron].Value, -1, 1);
            }

            return(output);
        }
        public NeuralOutput Think(SensoryInput input)
        {
            for (var layer = 0; layer < Network.Layers.Length; ++layer)
            {
                for (var neuron = 0; neuron < Network.Layers[layer].Neurons.Length; neuron++)
                {
                    if (layer == 0)
                        Network.Layers[layer].Neurons[neuron].Value = input.Values[neuron];
                    else
                    {
                        Network.Layers[layer].Neurons[neuron].Value = 0;
                        for (var dentrite = 0; dentrite < Network.Layers[layer - 1].Neurons.Length; ++dentrite)
                        {
                            Network.Layers[layer].Neurons[neuron].Value = Network.Layers[layer].Neurons[neuron].Value +
                                                                          Network.Layers[layer - 1].Neurons[dentrite]
                                                                              .Value*
                                                                          Network.Layers[layer].Neurons[neuron].Dendrite
                                                                              [dentrite].Weight;
                        }
                        Network.Layers[layer].Neurons[neuron].Value =
                            MathUtilityHelper.HyperbolicTangent(Network.Layers[layer].Neurons[neuron].Value);
                    }
                }
            }

            NeuralOutput output;
            output.Values = new double[Network.Layers[Network.Layers.Length - 1].Neurons.Length];
            for (var neuron = 0; neuron < output.Values.Length; ++neuron)
            {
                output.Values[neuron] = Network.Layers[Network.Layers.Length - 1].Neurons[neuron].Value;
            //                    Mathf.Clamp((float) Network.Layers[Network.Layers.Length - 1].Neurons[neuron].Value, -1, 1);
            }

            return output;
        }