public static void ShowOutputs(Network network)
        {
            Console.WriteLine(":::::::::::OUTPUTS START::::::::::::::::::::::");

            for (int i = 0; i < network.Layers.Count; i++)
            {
                if (network.Layers[i].Neurons.Count > 0)
                {
                    foreach (Neuron neuron in network.Layers[i].Neurons)
                    {
                        Console.Write(neuron.Output + " ");
                    }

                    Console.WriteLine();
                }
            }
            Console.WriteLine(":::::::::::OUTPUTS END::::::::::::::::::::::");
        }
        public static void ShowError(Network network)
        {
            Console.WriteLine(":::::::::::ERROR::::::::::::::::::::::");

            Console.WriteLine(network.Layers.Last().Neurons.First().Error);

            Console.WriteLine(":::::::::::ERROR end::::::::::::::::::::::");

        }
        public static void Calculate(Network network, double[] inputs)
        {
            for (int i = 0; i < network.Layers.Count; i++)
            {
                if (i == 0)
                {
                    for (int k = 0; k < network.Layers[i].Neurons.Count; k++)
                    {
                        network.Layers[i].Neurons[k].Accept(inputs[k]);
                    }
                }
                else
                {
                    foreach (Neuron neuron in network.Layers[i].Neurons)
                    {
                        neuron.Reflex();
                    }
                }
            }

            //for (int i = 0; i < network.Layers.Count; i++)
            //{
            //    if (network.Layers[i].Neurons.Count > 0)
            //    {
            //        foreach (Neuron neuron in network.Layers[i].Neurons)
            //        {
            //            Console.Write(neuron.Output + " ");
            //        }

            //        Console.WriteLine();
            //    }
            //}
            //Console.WriteLine(":::::::::::::::::::::::::::::::::");
        }
        public static void TrainNetwork(Network network, double rightAnswer)
        {
            double h = 0.1;

            double tempError = rightAnswer - network.Layers.Last().Neurons.FirstOrDefault().Output;
            double error = tempError * tempError * 0.5;

            //Console.WriteLine(" Error : " + tempError);

            network.Layers.Last().Neurons.FirstOrDefault().Error = tempError;

            for (int i = network.Layers.Count - 2; i >= 0; i--)
            {
                foreach (Neuron neuron in network.Layers[i].Neurons)
                {
                    double err = 0;
                    foreach (Link link in neuron.OutgoingLinks)
                    {
                        err += link.Neuron.Error * link.Weight;
                    }
                    neuron.Error = err * (1 - Math.Tanh(neuron.Output) * Math.Tanh(neuron.Output));

                    //Console.Write(neuron.Error);
                }
                //Console.WriteLine("EndLayer : ");
            }

            //Console.WriteLine("EndERROR COUNTING ||||||||||||||||||||||||||| : ");

            for (int i = 0; i < network.Layers.Count; i++)
            {
                foreach (Neuron neuron in network.Layers[i].Neurons)
                {
                    foreach (Link link in neuron.OutgoingLinks)
                    {
                        link.Weight = link.Weight + h * link.Neuron.Error * neuron.Output;
                        if (link.Neuron.IncomingLinks.Count > 0)
                        {
                            link.Neuron.IncomingLinks.First(f => f.Neuron.Id == neuron.Id).Weight = link.Weight;
                        }
                    }
                }
            }

            //for (int i = 0; i < network.Layers.Count - 1; i++)
            //{
            //    foreach (Neuron neuron in network.Layers[i].Neurons)
            //    {
            //        foreach (Link link in neuron.OutgoingLinks)
            //        {
            //            Console.Write(link.Weight + " ");
            //        }
            //        Console.WriteLine();
            //    }

            //    Console.WriteLine();
            //}
            //Console.WriteLine("|||||||||||||||||||||||||||||||||||||||||||||||||||");

        }
 public static void RelaxNetwork(Network network)
 {
     for (int i = 0; i < network.Layers.Count; i++)
     {
         foreach (Neuron neuron in network.Layers[i].Neurons)
         {
             neuron.Relax();
         }
     }
 }
        static void Main(string[] args)
        {
            Random random = new Random();

            Network network = new Network();
            network.Layers.Add(new Layer());
            network.Layers.Add(new Layer());
            network.Layers.Add(new Layer());
            network.Layers.Add(new Layer());
            network.Layers.Add(new Layer());

            for (int i = 0; i < network.Layers.Count; i++)
            {
                if (i == 0)
                {
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                }
                if (i == 1)
                {
                    network.Layers[i].Neurons.Add(new Neuron());
                }
                if (i == 2)
                {
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                }
                if (i == 3)
                {
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                }
                if (i == 4)
                {
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                    network.Layers[i].Neurons.Add(new Neuron());
                }
                if (i == 5)
                {
                    network.Layers[i].Neurons.Add(new Neuron());
                }
            }

            #region Initialization

            for (int i = 0; i < network.Layers.Count - 1; i++)
            {
                foreach (Neuron neuron in network.Layers[i].Neurons)
                {
                    foreach (Neuron attachingNeuron in network.Layers[i + 1].Neurons)
                    {
                        neuron.Attach(attachingNeuron, random.NextDouble());
                    }
                }
            }

            for (int i = 0; i < network.Layers.Count - 1; i++)
            {
                foreach (Neuron neuron in network.Layers[i].Neurons)
                {
                    foreach (Link link in neuron.OutgoingLinks)
                    {
                        Console.Write(link.Weight + " ");
                    }
                    Console.WriteLine();
                }

                Console.WriteLine();
            }
            Console.WriteLine("|||||||||||||||||||||||||||||||||||||||||||||||||||");

            #endregion

            double[] inputs1 = new double[2];
            inputs1[0] = 1;
            inputs1[1] = 0;
            double answer1 = 0;

            double[] inputs2 = new double[2];
            inputs2[0] = 0;
            inputs2[1] = 0;
            double answer2 = 0;


            double[] inputs3 = new double[2];
            inputs3[0] = 1;
            inputs3[1] = 1;
            double answer3 = 1;

            double[] inputs4 = new double[2];
            inputs4[0] = 0;
            inputs4[1] = 1;
            double answer4 = 0;


            Calculate(network, inputs1);
            TrainNetwork(network, answer1);
            ShowError(network);
            //ShowOutputs(network);
            RelaxNetwork(network);


            //Calculate(network, inputs2);
            //TrainNetwork(network, answer2);
            //ShowError(network);
            //ShowOutputs(network);
            //RelaxNetwork(network);

            Calculate(network, inputs3);
            TrainNetwork(network, answer3);
            ShowError(network);
            //ShowOutputs(network);
            RelaxNetwork(network);

            Calculate(network, inputs4);
            TrainNetwork(network, answer4);
            ShowError(network);
            //ShowOutputs(network);
            RelaxNetwork(network);


            for (int i = 0; i < 300000; i++)
            {
                Calculate(network, inputs1);
                TrainNetwork(network, answer1);
                RelaxNetwork(network);

                //Calculate(network, inputs2);
                //TrainNetwork(network, answer2);
                //RelaxNetwork(network);

                Calculate(network, inputs3);
                TrainNetwork(network, answer3);
                RelaxNetwork(network);

                Calculate(network, inputs4);
                TrainNetwork(network, answer4);
                RelaxNetwork(network);
            }
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("AFTER : ");
            Console.WriteLine();

            Calculate(network, inputs1);
            TrainNetwork(network, answer1);
            ShowError(network);
            //ShowOutputs(network);
            RelaxNetwork(network);


            //Calculate(network, inputs2);
            //TrainNetwork(network, answer2);
            //ShowError(network);
            //ShowOutputs(network);
            //RelaxNetwork(network);

            Calculate(network, inputs3);
            TrainNetwork(network, answer3);
            ShowError(network);
            //ShowOutputs(network);
            RelaxNetwork(network);

            Calculate(network, inputs4);
            TrainNetwork(network, answer4);
            ShowError(network);
            //ShowOutputs(network);
            RelaxNetwork(network);

            Console.ReadLine();
        }