public void NotifyProgress_NotificationEpochs_is_zero()
        {
            Perceptron.interfaces.IBackPropagationAlgo trainer    = new Perceptron.core.BGDTrainer();
            Perceptron.entity.MultilayerPerceptron     networkXOR = util.Helper.CreateXORNetwork();
            trainer.Vectors            = util.Helper.GenerateTrainingPointsForXor();
            trainer.Perceptron         = networkXOR;
            trainer.LearningRate       = 0.3;
            trainer.MaxEpochs          = 5000;
            trainer.NotificationEpochs = 0;
            int countOfEventsFired = 0;
            Action <object, Perceptron.interfaces.NotifyProgressArgs> fnNotifyHandler = delegate(object sender, Perceptron.interfaces.NotifyProgressArgs args)
            {
                countOfEventsFired++;
            };

            trainer.OnNotifyProgressArgs += new EventHandler <Perceptron.interfaces.NotifyProgressArgs>(fnNotifyHandler);
            trainer.Train();
            var vectorsTest = util.Helper.GenerateTrainingPointsForXor();

            Perceptron.entity.Vector[] vectorsWhichFailed = util.Helper.EvaluateVectors(trainer.Perceptron, vectorsTest);
            Trace.WriteLine($"TEST DATA - The network generated {vectorsWhichFailed.Count()} errors after training.");
            ///
            /// No events should have been fired
            ///
            Assert.True(countOfEventsFired == 0);
            Assert.True(vectorsWhichFailed.Count() == 0);
            Assert.True(trainer.EpochsElapsed == trainer.MaxEpochs);
        }
        public void BasicXOR()
        {
            Perceptron.interfaces.IBackPropagationAlgo trainer    = new Perceptron.core.BGDTrainer();
            Perceptron.entity.MultilayerPerceptron     networkXOR = util.Helper.CreateXORNetwork();
            trainer.Vectors    = util.Helper.GenerateTrainingPointsForXor();
            trainer.Perceptron = networkXOR;
            ///
            /// Randomize the network wts, ensure that the network produces atleast 1 error
            /// so that we can test for success of training
            ///
            while (true)
            {
                int errors = 0;
                Perceptron.entity.Vector[] vectorsWhichFailed = util.Helper.EvaluateVectors(trainer.Perceptron, trainer.Vectors);
                errors = vectorsWhichFailed.Count();
                Trace.WriteLine($"TRAIN DATA - The network generated {errors} errors before training.");
                if (errors > 0)
                {
                    break;
                }
                Perceptron.core.Utils.RandomizeNetworkWeights(networkXOR);
            }
            string jsonUntrained = Perceptron.core.Utils.SaveNetworkToJson(networkXOR);

            System.IO.File.WriteAllText("XOR.untrained.json", jsonUntrained);
            trainer.NotificationEpochs = 10;
            trainer.LearningRate       = 0.3;
            trainer.MaxEpochs          = 5000;
            trainer.Train();
            ///
            /// Training complete - evaluate the results
            ///
            {
                int errors = 0;
                Perceptron.entity.Vector[] vectorsWhichFailed = util.Helper.EvaluateVectors(trainer.Perceptron, trainer.Vectors);
                errors = vectorsWhichFailed.Count();
                Trace.WriteLine($"TRAIN DATA - The network generated {errors} errors after training.");
                Assert.True(errors == 0);
            }
            ///
            /// Evaluate against test data
            ///
            {
                int errors      = 0;
                var vectorsTest = util.Helper.GenerateTrainingPointsForXor();
                Perceptron.entity.Vector[] vectorsWhichFailed = util.Helper.EvaluateVectors(trainer.Perceptron, vectorsTest);
                errors = vectorsWhichFailed.Count();
                Trace.WriteLine($"TEST DATA - The network generated {errors} errors after training.");
                Assert.True(errors == 0);
            }
            string jsonTrained = Perceptron.core.Utils.SaveNetworkToJson(networkXOR);

            System.IO.File.WriteAllText("XOR.trained.json", jsonTrained);
        }