public void ApplyWeightAdjustments_PropogatesThroughNetwork() { //// SETUP const double ErrorSignal = -2.3d; const float Momentum = 0.9f; const float LearningRate = 0.1f; // Create 2 inbound and 2 outbound mock connections. var mockInbound1 = new Mock<ISupervisedLearnerConnection>(); var mockInbound2 = new Mock<ISupervisedLearnerConnection>(); var mockOutbound1 = new Mock<ISupervisedLearnerConnection>(); var mockOutbound2 = new Mock<ISupervisedLearnerConnection>(); // program the mock outbounds such that both are reporting error signals mockOutbound1.SetupGet(mock => mock.IsReportingError).Returns(true); mockOutbound2.SetupGet(mock => mock.IsReportingError).Returns(true); // Create 2 input nodes and 2 output nodes. var mockInputNode1 = new Mock<ISupervisedLearnerNode>(); var mockInputNode2 = new Mock<ISupervisedLearnerNode>(); var mockOutputNode1 = new Mock<ISupervisedLearnerNode>(); var mockOutputNode2 = new Mock<ISupervisedLearnerNode>(); // Program nodes to report input/output sizes. mockInputNode1.SetupGet(mock => mock.InputSize).Returns(1); mockInputNode2.SetupGet(mock => mock.InputSize).Returns(1); mockOutputNode1.SetupGet(mock => mock.OutputSize).Returns(1); mockOutputNode2.SetupGet(mock => mock.OutputSize).Returns(1); // Program nodes to provide values. mockInputNode1.SetupGet(mock => mock.CachedErrors).Returns(new[] { ErrorSignal }); mockInputNode2.SetupGet(mock => mock.CachedErrors).Returns(new[] { ErrorSignal }); mockOutputNode1.SetupGet(mock => mock.CachedOutputs).Returns(new[] { 0.0d }); mockOutputNode2.SetupGet(mock => mock.CachedOutputs).Returns(new[] { 0.0d }); // Create the test object. var network = new BackpropagationNetwork(new Mock<IErrorCalculator>().Object); network.AddInboundConnection(mockInbound1.Object); network.AddInboundConnection(mockInbound2.Object); network.AddOutboundConnection(mockOutbound1.Object); network.AddOutboundConnection(mockOutbound2.Object); network.AddInputNode(mockInputNode1.Object); network.AddInputNode(mockInputNode2.Object); network.AddOutputNode(mockOutputNode1.Object); network.AddOutputNode(mockOutputNode2.Object); network.Fire(new[] { 0.0d }); network.CalculateError(ErrorSignal); // EXECUTION network.ApplyWeightAdjustments(LearningRate, Momentum); // VERIFICATION mockInputNode1.Verify(mock => mock.ApplyWeightAdjustments(LearningRate, Momentum), Times.Once()); mockInputNode2.Verify(mock => mock.ApplyWeightAdjustments(LearningRate, Momentum), Times.Once()); mockOutbound1.Verify(mock => mock.ApplyWeightAdjustments(LearningRate, Momentum), Times.Once()); mockOutbound2.Verify(mock => mock.ApplyWeightAdjustments(LearningRate, Momentum), Times.Once()); }