/** * Copyright 2010 Neuroph Project http://neuroph.sourceforge.net * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.neuroph.core; import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Random; import org.neuroph.util.NeuronFactory; import org.neuroph.util.NeuronProperties; /** *<pre> * Layer of neurons in a neural network. The Layer is basic neuron container (a collection of neurons), * and it provides methods for manipulating neurons (add, remove, get, set, calculate, randomize). * </pre> * * @see Neuron * @author Zoran Sevarac <sevarac@gmail.com> */ public class Layer implements Serializable { /** * The class fingerprint that is set to indicate serialization * compatibility with a previous version of the class */ private static final long serialVersionUID = 2L; /** * Reference to parent neural network */ private NeuralNetwork parentNetwork; /** * Neurons collection */ protected List<Neuron> neurons; /** * Creates an instance of empty Layer */ public Layer() { this.neurons = new ArrayList<Neuron>(); } /** * Creates an instance of Layer with the specified number of neurons with * specified neuron properties * * @param neuronsCount * number of neurons in layer * @param neuronProperties * properties of neurons in layer */ public Layer(int neuronsCount, NeuronProperties neuronProperties) { this(); for (int i = 0; i < neuronsCount; i++) { Neuron neuron = NeuronFactory.createNeuron(neuronProperties); this.addNeuron(neuron); } } /** * Sets reference on parent network * * @param parent * parent network */ public void setParentNetwork(NeuralNetwork parent) { this.parentNetwork = parent; } /** * Returns reference to parent network * * @return reference on parent neural network */ public NeuralNetwork getParentNetwork() { return this.parentNetwork; } /** * Returns interface for iterating neurons in this layer * * @return interface for iterating neurons in this layer */ public Iterator<Neuron> getNeuronsIterator() { return this.neurons.iterator(); } /** * Returns collection of neurons in this layer * * @return collection of neurons in this layer */ public List<Neuron> getNeurons() { return this.neurons; } /** * Adds specified neuron to this layer * * @param neuron * neuron to add */ public void addNeuron(Neuron neuron) { neuron.setParentLayer(this); this.neurons.add(neuron); } /** * Adds specified neuron to this layer,at specified index position * * @param neuron * neuron to add * @param idx * index position at which neuron should be added */ public void addNeuron(int idx, Neuron neuron) { neuron.setParentLayer(this); this.neurons.add(idx, neuron); } /** * Sets (replace) the neuron at specified position in layer * * @param idx * index position to set/replace * @param neuron * new Neuron object to set */ public void setNeuron(int idx, Neuron neuron) { neuron.setParentLayer(this); this.neurons.set(idx, neuron); } /** * Removes neuron from layer * * @param neuron * neuron to remove */ public void removeNeuron(Neuron neuron) { this.neurons.remove(neuron); } /** * Removes neuron at specified index position in this layer * * @param idx * index position of neuron to remove */ public void removeNeuronAt(int idx) { this.neurons.remove(idx); } /** * Returns neuron at specified index position in this layer * * @param idx * neuron index position * @return neuron at specified index position */ public Neuron getNeuronAt(int idx) { return this.neurons.get(idx); } /** * Returns the index position in layer for the specified neuron * * @param neuron * neuron object * @return index position of specified neuron */ public int indexOf(Neuron neuron) { return this.neurons.indexOf(neuron); } /** * Returns number of neurons in this layer * * @return number of neurons in this layer */ public int getNeuronsCount() { return this.neurons.size(); } /** * Performs calculaton for all neurons in this layer */ public void calculate() { for(Neuron neuron : this.neurons) { neuron.calculate(); } } /** * Resets the activation and input levels for all neurons in this layer */ public void reset() { for(Neuron neuron : this.neurons) { neuron.reset(); } } /** * Randomize input connection weights for all neurons in this layer */ public void randomizeWeights() { for(Neuron neuron : this.neurons) { neuron.randomizeInputWeights(); } } /** * Randomize input connection weights for all neurons in this layer * within specified value range */ public void randomizeWeights(double minWeight, double maxWeight) { for(Neuron neuron : this.neurons) { neuron.randomizeInputWeights(minWeight, maxWeight); } } /** * Initialize connection weights for the whole layer to to specified value * * @param value the weight value */ public void initializeWeights(double value) { for(Neuron neuron : this.neurons) { neuron.initializeWeights(value); } } /** * Initialize connection weights for the whole layer using a * random number generator * * @param generator the random number generator */ public void initializeWeights(Random generator) { for(Neuron neuron : this.neurons) { neuron.initializeWeights(generator); } } public void initializeWeights(double min, double max) { for(Neuron neuron : this.neurons) { neuron.initializeWeights(min, max); } } }