public void ApplyWeightAdjustments_PropogatesThroughNetwork()
        {
            //// SETUP
            const double InitialWeight = 0.25d;
            const float Momentum = 0.9f;
            const float LearningRate = 0.1f;

            var mockTarget = new Mock<ISupervisedLearnerNode>();
            var mockSource = new Mock<ISupervisedLearnerNode>();

            // Create the test object.
            var connection = new BackpropagationConnection(InitialWeight, mockSource.Object, mockTarget.Object);

            // EXECUTION
            connection.ApplyWeightAdjustments(LearningRate, Momentum);

            // VERIFICATION
            mockTarget.Verify(mock => mock.ApplyWeightAdjustments(LearningRate, Momentum), Times.Once());
        }
        public void ApplyWeightAdjustments_UpdatesWeight()
        {
            //// SETUP
            const double InitialWeight = 0.25d;
            const double FireInput = 1.234d;
            const double ErrorSignal1A = -2.3d;
            const double ErrorSignal1B = -9.87d;
            const double AccumulatedError1 = ErrorSignal1A + ErrorSignal1B;
            const double ErrorSignal2 = 3.2345d;
            const float Momentum = 0.9f;
            const float LearningRate = 0.1f;

            const double ExpectedWeight1 = (AccumulatedError1 * FireInput * LearningRate) + InitialWeight;
            const double ExpectedWeight2 = ExpectedWeight1 + (ErrorSignal2 * FireInput * LearningRate) + (Momentum * (AccumulatedError1 * FireInput * LearningRate));

            var mockTarget = new Mock<ISupervisedLearnerNode>();
            var mockSource = new Mock<ISupervisedLearnerNode>();

            // Create the test object.
            var connection = new BackpropagationConnection(InitialWeight, mockSource.Object, mockTarget.Object);
            connection.Fire(FireInput);

            // EXECUTION
            connection.ReportError(ErrorSignal1A);
            connection.ReportError(ErrorSignal1B);
            connection.ApplyWeightAdjustments(LearningRate, Momentum);
            var actual1 = connection.Weight;

            connection.ClearCachedErrors();
            connection.ReportError(ErrorSignal2);
            connection.ApplyWeightAdjustments(LearningRate, Momentum);
            var actual2 = connection.Weight;

            // VERIFICATION
            Assert.AreEqual(ExpectedWeight1, actual1, Epsilon);
            Assert.AreEqual(ExpectedWeight2, actual2, Epsilon);
        }
        public void ReportError_ModifiesErrorSignal()
        {
            // Setup test values
            var mockTarget = new Mock<ISupervisedLearnerNode>();
            var mockSource = new Mock<ISupervisedLearnerNode>();
            const double Weight = 0.25d;
            const double OriginalError = 12.34d;
            const double ExpectedError = OriginalError * Weight;

            var connection = new BackpropagationConnection(Weight, mockSource.Object, mockTarget.Object);

            // Execute
            var originalFlag = connection.IsReportingError;
            connection.ReportError(OriginalError);
            var finalFlag = connection.IsReportingError;
            var actualError = connection.ErrorSignal;

            // Verify
            Assert.IsFalse(originalFlag);
            Assert.IsTrue(finalFlag);
            Assert.AreEqual(ExpectedError, actualError, Epsilon);
            mockSource.Verify(mock => mock.CalculateError(actualError), Times.Once());
        }
        public void Ctor_InitializesClass()
        {
            // Setup test values
            var mockTarget = new Mock<ISupervisedLearnerNode>();
            var mockSource = new Mock<ISupervisedLearnerNode>();
            const double ExpectedWeight = 0.11d;

            // Execute
            var actual = new BackpropagationConnection(ExpectedWeight, mockSource.Object, mockTarget.Object);

            // Verify
            mockSource.Verify(mock => mock.AddOutboundConnection(actual), Times.Once());
            mockTarget.Verify(mock => mock.AddInboundConnection(actual), Times.Once());

            Assert.AreEqual(ExpectedWeight, actual.Weight);
            Assert.AreSame(mockSource.Object, actual.SourceNode);
            Assert.AreSame(mockTarget.Object, actual.TargetNode);
        }
        public void ClearReportingFlag_ClearsReportingFlag()
        {
            //// SETUP
            const double InitialWeight = 0.25d;
            const double ErrorSignal = -2.3d;

            var mockTarget = new Mock<ISupervisedLearnerNode>();
            var mockSource = new Mock<ISupervisedLearnerNode>();

            // Create the test object.
            var connection = new BackpropagationConnection(InitialWeight, mockSource.Object, mockTarget.Object);

            // EXECUTION
            connection.ReportError(ErrorSignal);
            var preClearFlag = connection.IsReportingError;
            connection.ClearReportingFlag();
            var postClearFlag = connection.IsReportingError;

            // VERIFICATION
            Assert.IsTrue(preClearFlag);
            Assert.IsFalse(postClearFlag);
        }
        public void ClearCachedErrors_PropogatesThroughNetwork()
        {
            //// SETUP
            const double InitialWeight = 0.25d;

            var mockTarget = new Mock<ISupervisedLearnerNode>();
            var mockSource = new Mock<ISupervisedLearnerNode>();

            // Create the test object.
            var connection = new BackpropagationConnection(InitialWeight, mockSource.Object, mockTarget.Object);

            // EXECUTION
            connection.ClearCachedErrors();

            // VERIFICATION
            mockTarget.Verify(mock => mock.ClearCachedErrors(), Times.Once());
        }