private void StartTrainButton_Click(object sender, RoutedEventArgs eventArgs)
        {
            if (Network == null || TrainingData == null)
            {
                MessageBox.Show("You didn't create network or get data points!\n");
            }
            else
            {
                try
                {
                    TrainingParameters       p   = GetParameters();
                    StandardTrainingObserver sno = Network.Dimensions == 2 ? new StandardTrainingObserver() : null;
                    Network.Observer = sno;

                    Network.Train(p);
                    IErrorCalculator err = new QuantizationErrorCalculator()
                    {
                        DistanceCalculator = Network.DistanceCalculator
                    };
                    SomInformation.Text += $"\nSom trained. Quantization error: {err.CalculateError(Network.Neurons, TrainingData):F} ";
                    if (sno != null)
                    {
                        DisplayIfTwoDimensional(sno);
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }
        }
        private void DisplayIfTwoDimensional(StandardTrainingObserver sno)
        {
            if (Network.Dimensions == 2)
            {
                if (SingleSeriesCheckBox.IsChecked == true)
                {
                    List <OxyPlot.Wpf.Series> moving =
                        View.Utility.Converter.ConvertToScatterSeries(sno.HistoryOfNeurons);

                    var scattersData = new List <ScatterPoint>();
                    foreach (var train in TrainingData)
                    {
                        var x = train.At(0);
                        var y = train.At(1);
                        scattersData.Add(new ScatterPoint(x, y));
                    }
                    var stat = new OxyPlot.Wpf.ScatterSeries
                    {
                        ItemsSource = scattersData,
                        Title       = $"Training points",
                        MarkerSize  = 2,
                        MarkerFill  = Color.FromRgb(140, 131, 130)
                    };

                    ChartWindow chw1 = new ChartWindow(stat, moving);
                    chw1.Show();
                }
                if (MultipleSeriesCheckbox.IsChecked == true)
                {
                    List <List <OxyPlot.Wpf.Series> > series  = new List <List <Series> >();
                    List <List <Vector <double> > >   history = Network.Observer.HistoryOfNeurons;

                    for (int j = 0; j < history.Count; j++)
                    {
                        var epoch = history[j];
                        if (j % 4 == 0)
                        {
                            List <OxyPlot.Wpf.Series> group = new List <Series>();
                            Dictionary <Neuron, List <Vector <double> > > neuronZones =
                                new Dictionary <Neuron, List <Vector <double> > >();
                            int i = 0;
                            foreach (var neuron in Network.Neurons)
                            {
                                neuronZones.Add(neuron, new List <Vector <double> >());
                                neuron.CurrentWeights = epoch[i];
                                i++;
                            }


                            foreach (var data in TrainingData)
                            {
                                neuronZones[Network.GetWinner(data)].Add(data);
                            }


                            foreach (var neuronZone in neuronZones)
                            {
                                var scatterSet = new List <ScatterPoint>();
                                scatterSet.Add(
                                    Converter.ConvertVectorToScatterPoint(neuronZone.Key.CurrentWeights, true));
                                var points = neuronZone.Value;
                                foreach (var point in points)
                                {
                                    scatterSet.Add(Converter.ConvertVectorToScatterPoint(point));
                                }

                                group.Add(new OxyPlot.Wpf.ScatterSeries
                                {
                                    ItemsSource = scatterSet,
                                    Title       = $"Class",
                                    MarkerSize  = 3
                                });
                            }

                            series.Add(group);
                        }
                    }

                    ChartWindow chw2 = new ChartWindow(series);

                    chw2.Show();
                }
            }
        }