public void DrawChart(TrainingResult trainResult)
 {
     if (_xyLineChart == null)
         return;
     //TrainingRate
     ChartPrimitive line0 = _xyLineChart.Primitives[0];
     line0.AddPoint(trainResult.Epoch,trainResult.TrainingRate*1000);
     ChartPrimitive line1 = _xyLineChart.Primitives[1];
     line1.AddPoint(trainResult.Epoch, trainResult.AvgTrainMSE);
     ChartPrimitive line2 = _xyLineChart.Primitives[2];
     line2.AddPoint(trainResult.Epoch, trainResult.AvgTestMSE);
     _xyLineChart.RedrawPlotLines();
 }
        private void TrainingProgress()
        {
            StringBuilder learningProgressText = new StringBuilder();

            ShowElapsedTime(start);

            learningPageViewModel.ProgressImage = null;
            int index = curIndex;

            taskbarManager.SetProgressState(TaskbarProgressBarState.Normal);

            switch (learningPageViewModel.CurrentState)
            {
                case TrainingStates.PreparingData:
                    if (TaskbarManager.IsPlatformSupported)
                        taskbarManager.SetProgressValue(curIndex, pageViewModel.DataProvider.TrainingPatternsCount);
                    MainView.ProgressBar.Maximum = pageViewModel.DataProvider.TrainingPatternsCount;
                    MainView.ProgressBar.Value = index;
                    learningProgressText.Length = 0;
                    learningProgressText.Append("Preparing Training Data...");
                    learningPageViewModel.ProgressText = learningProgressText.ToString();
                    learningPageViewModel.ProgressImageNumber = String.Empty;
                    break;

                case TrainingStates.CalculatingHessian:
                    if (TaskbarManager.IsPlatformSupported)
                        taskbarManager.SetProgressValue(index, 500);
                    MainView.ProgressBar.Maximum = 500;
                    MainView.ProgressBar.Value = index;
                    learningProgressText.Length = 0;
                    learningProgressText.Append("Calculating Pseudo-Hessian...");
                    learningPageViewModel.ProgressText = learningProgressText.ToString();
                    learningPageViewModel.ProgressImageNumber = String.Empty;
                    break;

                case TrainingStates.Training:
                    if (TaskbarManager.IsPlatformSupported)
                        taskbarManager.SetProgressValue(curIndex, pageViewModel.DataProvider.TrainingPatternsCount);
                    MainView.ProgressBar.Maximum = pageViewModel.DataProvider.TrainingPatternsCount;
                    MainView.ProgressBar.Value = index;
                    learningProgressText.Length = 0;
                    learningProgressText.AppendFormat(((pageViewModel.NeuralNetwork.TrainingRates[learningRateIndex].Distorted) ? ("Distorted") : ("Not distorted")) + "\nEpoch:\t\t{0}\nPattern index:\t{1}\nTraining rate:\t{2:N10}\nAverage MSE:\t{3:N10}\nError percentage:\t{4:N10}\nMisrecognitions:\t{5}", curEpoch, index, pageViewModel.NeuralNetwork.TrainingRate.Rate, avgMSE, ((double)misrecognitions / ((double)index / 100D)), misrecognitions);
                    learningPageViewModel.ProgressText = learningProgressText.ToString();
                    learningPageViewModel.ProgressImage = ShowInputPattern(pageViewModel.DataProvider.RandomTrainingPattern[index], true, pageViewModel.NeuralNetwork.TrainingRates[learningRateIndex].Distorted);
                    learningPageViewModel.ProgressImage.Freeze();
                    learningPageViewModel.ProgressImageNumber = pageViewModel.DataProvider.PreparedTrainingPatterns[pageViewModel.DataProvider.RandomTrainingPattern[index]].Label.ToString();
                    break;

                case TrainingStates.CalculatingTestError:
                    if (TaskbarManager.IsPlatformSupported)
                        taskbarManager.SetProgressValue(curIndex, pageViewModel.DataProvider.TestingPatternsCount);
                    MainView.ProgressBar.Maximum = pageViewModel.DataProvider.TestingPatternsCount;
                    MainView.ProgressBar.Value = index;
                    learningProgressText.Length = 0;
                    learningProgressText.Append("Calculating Test Error...");
                    learningProgressText.AppendFormat("\n\nPattern index:\t{0}\nAverage MSE:\t{1:N10}\nError percentage:\t{2:N10}\nMisrecognitions:\t{3}", index, avgTestMSE, ((double)misrecognitionsTest / ((double)index / 100D)), misrecognitionsTest);
                    learningPageViewModel.ProgressText = learningProgressText.ToString();
                    learningPageViewModel.ProgressImageNumber = String.Empty;
                    break;

                case TrainingStates.SavingWaits:
                    if (TaskbarManager.IsPlatformSupported)
                        taskbarManager.SetProgressState(TaskbarProgressBarState.NoProgress);
                    MainView.ProgressBar.Value = 0;
                    learningProgressText.Length = 0;
                    learningProgressText.Append("Saving weights...");
                    learningPageViewModel.ProgressText = learningProgressText.ToString();
                    learningPageViewModel.ProgressImageNumber = String.Empty;
                    break;

                case TrainingStates.NewEpoch:
                    learningPageViewModel.ProgressImageNumber = String.Empty;
                    TimeSpan span = DateTime.Now.Subtract(startSpan);
                    //Swordfish.WPF.Charts.ChartUtilities.AddTestLines(learningPageViewModel.Chart);
                    TrainingResult trainingResult = new TrainingResult(curEpoch, pageViewModel.NeuralNetwork.TrainingRate.Rate, pageViewModel.NeuralNetwork.TrainingRate.Distorted, avgMSE, misrecognitions, ((double)misrecognitions / ((double)600)), avgTestMSE, misrecognitionsTest, ((double)misrecognitionsTest / ((double)100)), new TimeSpan(span.Hours, span.Minutes, span.Seconds));
                    learningPageViewModel.DrawChart(trainingResult);//绘出误差曲线等
                    learningPageViewModel.TrainingResultCollection.Add(trainingResult);
                    learningPageViewModel.CurrentState = TrainingStates.Idle;
                    startSpan = DateTime.Now;
                    break;
            }

            if (trainingStopped)
            {
                learningPageViewModel.ProgressImageNumber = String.Empty;
                if (TaskbarManager.IsPlatformSupported)
                    taskbarManager.SetProgressState(TaskbarProgressBarState.NoProgress);
                trainingStopped = false;
                StopTraining();
            }
        }