/* TEST NETWORK */
        public double TestNetwork()
        {
            AverageError = 0;
            Console.WriteLine("Start testing");

            for (int i = 0; i < NumberOfExamples; i++)
            {
                //Console.WriteLine("Input number {0}", i + 1);
                /* Add inputs to network and calculate outputs */
                DigitNetwork.ResetAll();
                DigitNetwork.SetInputValues(TestingData[i].ToArray <int>());
                DigitNetwork.FeedResultsForward();

                /*
                 * Console.WriteLine("Network result: {0}; expected result: {1}", DigitNetwork.GetResult(), ExpectedResults[i]);
                 * Console.WriteLine("Output neurons:");
                 * foreach (Neuron n in DigitNetwork.OutputLayer.Neurons)
                 *  Console.Write("{0} ", n.GetOutput());
                 * Console.WriteLine();
                 */
                if (DigitNetwork.GetResult() == ExpectedResults[i])
                {
                    CountCorrect++;
                    //Console.WriteLine("Correct identification, Correct = {0}", CountCorrect);
                }
                else
                {
                    CountIncorrect++;
                    //Console.WriteLine("Wrong identification, Wrong = {0}", CountIncorrect);
                }

                AverageError += DigitNetwork.GetResult() - ExpectedResults[i];
            }
            AverageError /= NumberOfExamples;
            Console.WriteLine("Average error: {0}", AverageError);
            return(AverageError);
        }
        /* TRAIN NETWORK */
        public double TrainNetwork(int numOfEpochs = 10)
        {
            double averageError, globalAverageError = 0;
            int    startingPoint;

            Console.WriteLine("Start training");
            for (int epoch = 0; epoch < numOfEpochs; epoch++)
            {
                averageError  = 0;
                startingPoint = new Random().Next(10);
                for (int i = startingPoint; i < NumerOfExamples; i += 10)
                {
                    //Console.WriteLine("Input number {0}", i+1);
                    /* Add inputs to network and calculate outputs */
                    DigitNetwork.ResetAll();
                    DigitNetwork.SetInputValues(TrainingData[i].ToArray <int>());
                    DigitNetwork.FeedResultsForward();

                    //Console.WriteLine("Network result: {0}; expected result: {1}", DigitNetwork.GetResult(), ExpectedResults[i]);
                    if (DigitNetwork.GetResult() == ExpectedResults[i])
                    {
                        CountCorrect++;
                        //Console.WriteLine("Correct identification, Correct = {0}", CountCorrect);
                    }
                    else
                    {
                        CountIncorrect++;
                        //Console.WriteLine("Wrong identification, Wrong = {0}", CountIncorrect);
                    }

                    averageError += DigitNetwork.GetResult() - ExpectedResults[i];

                    /* Calculate errors and propagate them back through the network, then adjust weights */
                    DigitNetwork.PropagateErrorsBack(LearningCoef, ExpectedResults[i]);

                    /*
                     * Console.WriteLine("Weights for the first hidden layer neurons:");
                     * foreach (Neuron neuron in ((SigmoidNeuronLayer)DigitNetwork.Layers[1]).Neurons)
                     * {
                     *  Console.Write("{0}: ", ((SigmoidNeuron)neuron).ErrorCoef);
                     *  foreach (Node node in neuron.Inputs.Keys)
                     *  {
                     *      Console.Write(neuron.Inputs[node]);
                     *      Console.Write(" ");
                     *  }
                     *  Console.WriteLine();
                     * }
                     * Console.WriteLine("Weights for the second hidden layer neurons:");
                     * foreach (Neuron neuron in ((SigmoidNeuronLayer)DigitNetwork.Layers[2]).Neurons)
                     * {
                     *  Console.Write("{0}: ", ((SigmoidNeuron)neuron).ErrorCoef);
                     *  foreach (Node node in neuron.Inputs.Keys)
                     *  {
                     *      Console.Write(neuron.Inputs[node]);
                     *      Console.Write(" ");
                     *  }
                     *  Console.WriteLine();
                     * }
                     * Console.WriteLine("Weights for the output neurons:");
                     * foreach (Neuron neuron in DigitNetwork.OutputLayer.Neurons)
                     * {
                     *  Console.Write("{0}: ", ((SigmoidNeuron)neuron).ErrorCoef);
                     *  foreach (Node node in neuron.Inputs.Keys)
                     *  {
                     *      Console.Write(neuron.Inputs[node]);
                     *      Console.Write(" ");
                     *  }
                     *  Console.WriteLine();
                     * }
                     * */
                }
                averageError /= NumerOfExamples;
                //Console.WriteLine("Average error: {0}", averageError);
                globalAverageError += averageError;
            }
            globalAverageError /= numOfEpochs;
            Console.WriteLine("Global average error: {0}", globalAverageError);
            return(globalAverageError);
        }