/** * 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.util; import org.neuroph.core.Connection; import org.neuroph.core.Layer; import org.neuroph.core.Neuron; import org.neuroph.core.Weight; import org.neuroph.nnet.comp.BiasNeuron; import org.neuroph.nnet.comp.DelayedConnection; /** * Provides methods to connect neurons by creating Connection objects. */ public class ConnectionFactory { /** * Creates connection between two specified neurons * * @param from * output neuron * @param to * input neuron */ public static void createConnection(Neuron fromNeuron, Neuron toNeuron) { Connection connection = new Connection(fromNeuron, toNeuron); toNeuron.addInputConnection(connection); } /** * Creates connection between two specified neurons * * @param from * output neuron * @param to * input neuron * @param weightVal * connection weight value */ public static void createConnection(Neuron fromNeuron, Neuron toNeuron, double weightVal) { Connection connection = new Connection(fromNeuron, toNeuron, weightVal); toNeuron.addInputConnection(connection); } public static void createConnection(Neuron fromNeuron, Neuron toNeuron, double weightVal, int delay) { DelayedConnection connection = new DelayedConnection(fromNeuron, toNeuron, weightVal, delay); toNeuron.addInputConnection(connection); } /** * Creates connection between two specified neurons * * @param from * output neuron * @param to * input neuron * @param weight * connection weight */ public static void createConnection(Neuron fromNeuron, Neuron toNeuron, Weight weight) { Connection connection = new Connection(fromNeuron, toNeuron, weight); toNeuron.addInputConnection(connection); } /** * Creates full connectivity between the two specified layers * * @param fromLayer * layer to connect * @param toLayer * layer to connect to */ public static void fullConnect(Layer fromLayer, Layer toLayer) { for(Neuron fromNeuron : fromLayer.getNeurons()) { for (Neuron toNeuron : toLayer.getNeurons()) { createConnection(fromNeuron, toNeuron); } } } /** * Creates full connectivity between the two specified layers * * @param fromLayer * layer to connect * @param toLayer * layer to connect to */ public static void fullConnect(Layer fromLayer, Layer toLayer, boolean connectBiasNeuron) { for(Neuron fromNeuron : fromLayer.getNeurons()) { if (fromNeuron instanceof BiasNeuron) continue; for (Neuron toNeuron : toLayer.getNeurons()) { createConnection(fromNeuron, toNeuron); } } } /** * Creates full connectivity between two specified layers with specified * weight for all connections * * @param fromLayer * output layer * @param toLayer * input layer * @param weightVal * connection weight value */ public static void fullConnect(Layer fromLayer, Layer toLayer, double weightVal) { for(Neuron fromNeuron : fromLayer.getNeurons()) { for (Neuron toNeuron : toLayer.getNeurons()) { createConnection(fromNeuron, toNeuron, weightVal); } } } /** * Creates full connectivity within layer - each neuron with all other * within the same layer */ public static void fullConnect(Layer layer) { int neuronNum = layer.getNeuronsCount(); for (int i = 0; i < neuronNum; i++) { for (int j = 0; j < neuronNum; j++) { if (j == i) continue; Neuron from = layer.getNeuronAt(i); Neuron to = layer.getNeuronAt(j); createConnection(from, to); } // j } // i } /** * Creates full connectivity within layer - each neuron with all other * within the same layer with the specified weight values for all * conections. */ public static void fullConnect(Layer layer, double weightVal) { int neuronNum = layer.getNeuronsCount(); for (int i = 0; i < neuronNum; i++) { for (int j = 0; j < neuronNum; j++) { if (j == i) continue; Neuron from = layer.getNeuronAt(i); Neuron to = layer.getNeuronAt(j); createConnection(from, to, weightVal); } // j } // i } /** * Creates full connectivity within layer - each neuron with all other * within the same layer with the specified weight and delay values for all * conections. */ public static void fullConnect(Layer layer, double weightVal, int delay) { int neuronNum = layer.getNeuronsCount(); for (int i = 0; i < neuronNum; i++) { for (int j = 0; j < neuronNum; j++) { if (j == i) continue; Neuron from = layer.getNeuronAt(i); Neuron to = layer.getNeuronAt(j); createConnection(from, to, weightVal, delay); } // j } // i } /** * Creates forward connectivity pattern between the specified layers * * @param fromLayer * layer to connect * @param toLayer * layer to connect to */ public static void forwardConnect(Layer fromLayer, Layer toLayer, double weightVal) { for(int i=0; i<fromLayer.getNeuronsCount(); i++) { Neuron fromNeuron = fromLayer.getNeuronAt(i); Neuron toNeuron = toLayer.getNeuronAt(i); createConnection(fromNeuron, toNeuron, weightVal); } } /** * Creates forward connection pattern between specified layers * * @param fromLayer * layer to connect * @param toLayer * layer to connect to */ public static void forwardConnect(Layer fromLayer, Layer toLayer) { for(int i=0; i<fromLayer.getNeuronsCount(); i++) { Neuron fromNeuron = fromLayer.getNeuronAt(i); Neuron toNeuron = toLayer.getNeuronAt(i); createConnection(fromNeuron, toNeuron, 1); } } }