public void testFeedForwardAndBAckLoopWorks()
{
// example 11.14 of Neural Network Design by Hagan, Demuth and Beale
Matrix hiddenLayerWeightMatrix = new Matrix(2, 1);
hiddenLayerWeightMatrix.set(0, 0, -0.27);
hiddenLayerWeightMatrix.set(1, 0, -0.41);
Vector hiddenLayerBiasVector = new Vector(2);
hiddenLayerBiasVector.setValue(0, -0.48);
hiddenLayerBiasVector.setValue(1, -0.13);
Vector input = new Vector(1);
input.setValue(0, 1);
Matrix outputLayerWeightMatrix = new Matrix(1, 2);
outputLayerWeightMatrix.set(0, 0, 0.09);
outputLayerWeightMatrix.set(0, 1, -0.17);
Vector outputLayerBiasVector = new Vector(1);
outputLayerBiasVector.setValue(0, 0.48);
Vector error = new Vector(1);
error.setValue(0, 1.261);
double learningRate = 0.1;
double momentumFactor = 0.0;
FeedForwardNeuralNetwork ffnn = new FeedForwardNeuralNetwork(
hiddenLayerWeightMatrix, hiddenLayerBiasVector,
outputLayerWeightMatrix, outputLayerBiasVector);
ffnn.setTrainingScheme(new BackPropLearning(learningRate,
momentumFactor));
ffnn.processInput(input);
ffnn.processError(error);
Matrix finalHiddenLayerWeights = ffnn.getHiddenLayerWeights();
Assert.AreEqual(-0.265, finalHiddenLayerWeights.get(0, 0), 0.001);
Assert.AreEqual(-0.419, finalHiddenLayerWeights.get(1, 0), 0.001);
Vector hiddenLayerBias = ffnn.getHiddenLayerBias();
Assert.AreEqual(-0.475, hiddenLayerBias.getValue(0), 0.001);
Assert.AreEqual(-0.1399, hiddenLayerBias.getValue(1), 0.001);
Matrix finalOutputLayerWeights = ffnn.getOutputLayerWeights();
Assert.AreEqual(0.171, finalOutputLayerWeights.get(0, 0), 0.001);
Assert.AreEqual(-0.0772, finalOutputLayerWeights.get(0, 1), 0.001);
Vector outputLayerBias = ffnn.getOutputLayerBias();
Assert.AreEqual(0.7322, outputLayerBias.getValue(0), 0.001);
}