//TODO
        private void btnTrain_Click(object sender, EventArgs e)
        {
            if (trainingData == null)
            {
                MessageBox.Show("No TrainingData loaded!");
                return;
            }
            // Check if NN is null. "first use"
            if (NN == null)
            {
                NN = new NeuralNetwork(3, (int)numericHidden.Value, 1, (double)numericLearnrate.Value, (double)numericMomentum.Value);
                NN.FireMaxAccuracyReached += NN_RecieveMaxAccuracyReached;
                NN.FireMaxIterationsReached += NN_RecieveMaxIterationsReached;
                NN.FirePerformanceInfo += NN_RecievePerformanceInfo;
                NN.FireTrainingComplete += NN_RecieveTrainingComplete;
                NN.FireOutputComparison += NN_RecieveOutputComparison;
                NN.FireTestingComplete += NN_RecieveTestingComplete;
                NN.FireTestingResultInfo += NN_RecieveTestingResultInfo;
            }
            // Alerts configuration change
            if (numericHidden.Value != NN.NumberOfHidden)
            {
                if (MessageBox.Show("Do you want to reset neural-network with new cofiguration?", "Configuration of hidden node has changed!", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    NN = new NeuralNetwork(3, (int)numericHidden.Value, 1, (double)numericLearnrate.Value, (double)numericMomentum.Value); // TODO: (FIX)Slightly hardcoded for assignment
                    NN.FireMaxAccuracyReached += NN_RecieveMaxAccuracyReached;
                    NN.FireMaxIterationsReached += NN_RecieveMaxIterationsReached;
                    NN.FirePerformanceInfo += NN_RecievePerformanceInfo;
                    NN.FireTrainingComplete += NN_RecieveTrainingComplete;
                    NN.FireOutputComparison += NN_RecieveOutputComparison;
                    NN.FireTestingComplete += NN_RecieveTestingComplete;
                    NN.FireTestingResultInfo += NN_RecieveTestingResultInfo;
                }
                else
                {
                    numericHidden.Value = NN.NumberOfHidden;
                    return;
                }
            }
        
            Action action = () =>
            {
                NN.LearningRate = (double)numericLearnrate.Value;
                NN.Momentum = (double)numericMomentum.Value;
                NN.Train(trainingData, (int)numericIterations.Value, (double)(numericPercentage.Value/100), 10, (int)numericAccuracyFilter.Value);
                //MessageBox.Show("Traning Done!","Traning ");
            };

            SetupPerformanceChart(true);
            btnTrain.Enabled = false;
            btnTest.Enabled = false;
            btnReset.Enabled = false;
            btnStop.Enabled = true;
            Thread TrainingAction = new Thread(() => action());
            TrainingAction.Start();
        }
 private void btReset_Click(object sender, EventArgs e)
 {
     if (NN != null)
     {
         NN = new NeuralNetwork(3, (int)numericHidden.Value, 1, (double)numericLearnrate.Value, (double)numericMomentum.Value);
         NN.FireMaxAccuracyReached += NN_RecieveMaxAccuracyReached;
         NN.FireMaxIterationsReached += NN_RecieveMaxIterationsReached;
         NN.FirePerformanceInfo += NN_RecievePerformanceInfo;
         NN.FireTrainingComplete += NN_RecieveTrainingComplete;
         NN.FireOutputComparison += NN_RecieveOutputComparison;
         NN.FireTestingComplete += NN_RecieveTestingComplete;
         NN.FireTestingResultInfo += NN_RecieveTestingResultInfo;
     }
 }
        private void loadNeuralNetworkToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (NN != null)
            {
                if (MessageBox.Show("Do you want to overwrite it?", "Neural-Network allready exist!", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    return;
                }
            }
            // open dialog
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "Txt files|*.txt|XML files|*.xml";
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                if (NN != null)
                {
                    NN.LoadNN(dialog.FileName);
                }
                else
                {
                    NN = new NeuralNetwork(3, (int)numericHidden.Value, 1, (double)numericLearnrate.Value, (double)numericMomentum.Value);
                    NN.FireMaxAccuracyReached += NN_RecieveMaxAccuracyReached;
                    NN.FireMaxIterationsReached += NN_RecieveMaxIterationsReached;
                    NN.FirePerformanceInfo += NN_RecievePerformanceInfo;
                    NN.FireTrainingComplete += NN_RecieveTrainingComplete;
                    NN.FireOutputComparison += NN_RecieveOutputComparison;
                    NN.FireTestingComplete += NN_RecieveTestingComplete;
                    NN.FireTestingResultInfo += NN_RecieveTestingResultInfo;

                    NN.LoadNN(dialog.FileName);

                    numericHidden.Value = NN.NumberOfHidden;
                    numericLearnrate.Value = (decimal)NN.LearningRate;
                    numericMomentum.Value = (decimal)NN.Momentum;
                }
            }
        }