package com.aelitis.azureus.core.neuronal; public class NeuralNetwork { NeuralNetworkLayer inputLayer; NeuralNetworkLayer hiddenLayer; NeuralNetworkLayer outputLayer; public NeuralNetwork(int nbInputNodes, int nbHiddenNodes, int nbOutputNodes) { inputLayer = new NeuralNetworkLayer(nbInputNodes); hiddenLayer = new NeuralNetworkLayer(nbHiddenNodes); outputLayer = new NeuralNetworkLayer(nbOutputNodes); inputLayer.initialize(null, hiddenLayer); inputLayer.randomizeWeights(); hiddenLayer.initialize(inputLayer, outputLayer); hiddenLayer.randomizeWeights(); outputLayer.initialize(hiddenLayer, null); } public void setActivationFunction(ActivationFunction activationFunction) { inputLayer.setActivationFunction(activationFunction); hiddenLayer.setActivationFunction(activationFunction); outputLayer.setActivationFunction(activationFunction); } public void setInput(int i, double value) { if(i >= 0 && i < inputLayer.getNumberOfNodes()) { inputLayer.neuronValues[i] = value; } } public double getOutput(int i) { if(i >= 0 && i < outputLayer.getNumberOfNodes()) { return outputLayer.neuronValues[i]; } return Double.NaN; } public void setDesiredOutput(int i, double value) { if(i >= 0 && i < outputLayer.getNumberOfNodes()) { outputLayer.desiredValues[i] = value; } } public void setMomentum(boolean useMomentum, double factor) { inputLayer.setMomentum(useMomentum,factor); hiddenLayer.setMomentum(useMomentum,factor); outputLayer.setMomentum(useMomentum,factor); } public void setLearningRate(double rate) { inputLayer.setLearningRate(rate); hiddenLayer.setLearningRate(rate); outputLayer.setLearningRate(rate); } public void feedForward() { inputLayer.calculateNeuronValues(); hiddenLayer.calculateNeuronValues(); outputLayer.calculateNeuronValues(); } public void backPropagate() { outputLayer.calculateErrors(); hiddenLayer.calculateErrors(); hiddenLayer.adjustWeights(); inputLayer.adjustWeights(); } public double calculateError() { double error = 0.0; for(int i = 0 ; i < outputLayer.numberOfNodes ; i++) { error += Math.pow(outputLayer.neuronValues[i] - outputLayer.desiredValues[i], 2.0); } error /= outputLayer.numberOfNodes; return error; } public String toString() { StringBuffer sb = new StringBuffer(); sb.append("Input Layer :\n"); sb.append(inputLayer.toString()); sb.append("\n\n"); sb.append("Hidden Layer :\n"); sb.append(hiddenLayer.toString()); sb.append("\n\n"); return sb.toString(); } }