/*
* Encog(tm) Core v2.5 - Java Version
* http://www.heatonresearch.com/encog/
* http://code.google.com/p/encog-java/
* Copyright 2008-2010 Heaton Research, Inc.
*
* 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.
*
* For more information on Heaton Research copyrights, licenses
* and trademarks visit:
* http://www.heatonresearch.com/copyright
*/
package org.encog.neural.networks.training.neat;
import org.encog.neural.networks.synapse.neat.NEATNeuronType;
import org.encog.persist.annotations.EGAttribute;
import org.encog.solve.genetic.innovation.BasicInnovation;
/**
* Implements a NEAT innovation. This lets NEAT track what changes it has
* previously tried with a neural network.
*
* NeuroEvolution of Augmenting Topologies (NEAT) is a genetic algorithm for the
* generation of evolving artificial neural networks. It was developed by Ken
* Stanley while at The University of Texas at Austin.
*
* http://www.cs.ucf.edu/~kstanley/
*
*/
public class NEATInnovation extends BasicInnovation {
/**
* The from neuron id.
*/
@EGAttribute
private long fromNeuronID;
/**
* The type of innovation.
*/
@EGAttribute
private NEATInnovationType innovationType;
/**
* The neuron id.
*/
@EGAttribute
private long neuronID;
/**
* The type of neuron, or none, if this is a link innovation.
*/
@EGAttribute
private NEATNeuronType neuronType;
/**
* The split x property.
*/
@EGAttribute
private double splitX;
/**
* The split y property.
*/
@EGAttribute
private double splitY;
/**
* The to neuron's id.
*/
@EGAttribute
private long toNeuronID;
/**
* Default constructor, used mainly for persistence.
*/
public NEATInnovation() {
}
/**
* Construct an innovation.
*
* @param fromNeuronID
* The from neuron.
* @param toNeuronID
* The two neuron.
* @param innovationType
* The innovation type.
* @param innovationID
* The innovation id.
*/
public NEATInnovation(final long fromNeuronID, final long toNeuronID,
final NEATInnovationType innovationType, final long innovationID) {
this.fromNeuronID = fromNeuronID;
this.toNeuronID = toNeuronID;
this.innovationType = innovationType;
setInnovationID(innovationID);
this.neuronID = -1;
this.splitX = 0;
this.splitY = 0;
this.neuronType = NEATNeuronType.None;
}
/**
* Construct an innovation.
*
* @param fromNeuronID
* The from neuron.
* @param toNeuronID
* The to neuron.
* @param innovationType
* The innovation type.
* @param innovationID
* The innovation id.
* @param neuronType
* The neuron type.
* @param x
* The x coordinate.
* @param y
* THe y coordinate.
*/
public NEATInnovation(final long fromNeuronID, final long toNeuronID,
final NEATInnovationType innovationType, final long innovationID,
final NEATNeuronType neuronType, final double x, final double y) {
this.fromNeuronID = fromNeuronID;
this.toNeuronID = toNeuronID;
this.innovationType = innovationType;
setInnovationID(innovationID);
this.neuronType = neuronType;
this.splitX = x;
this.splitY = y;
this.neuronID = 0;
}
/**
* Construct an innovation.
*
* @param neuronGene
* The neuron gene.
* @param innovationID
* The innovation id.
* @param neuronID
* The neuron id.
*/
public NEATInnovation(final NEATNeuronGene neuronGene,
final long innovationID, final long neuronID) {
this.neuronID = neuronID;
setInnovationID(innovationID);
this.splitX = neuronGene.getSplitX();
this.splitY = neuronGene.getSplitY();
this.neuronType = neuronGene.getNeuronType();
this.innovationType = NEATInnovationType.NewNeuron;
this.fromNeuronID = -1;
this.toNeuronID = -1;
}
/**
* @return The from neuron id.
*/
public long getFromNeuronID() {
return this.fromNeuronID;
}
/**
* @return The innovation type.
*/
public NEATInnovationType getInnovationType() {
return this.innovationType;
}
/**
* @return The neuron ID.
*/
public long getNeuronID() {
return this.neuronID;
}
/**
* @return The neuron type.
*/
public NEATNeuronType getNeuronType() {
return this.neuronType;
}
/**
* @return The split x.
*/
public double getSplitX() {
return this.splitX;
}
/**
* @return The split y.
*/
public double getSplitY() {
return this.splitY;
}
/**
* @return The to neuron id.
*/
public long getToNeuronID() {
return this.toNeuronID;
}
/**
* Set the neuron id.
*
* @param neuronID
* The neuron id.
*/
public void setNeuronID(final long neuronID) {
this.neuronID = neuronID;
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
final StringBuilder result = new StringBuilder();
result.append("[NeatInnovation:type=");
switch (this.innovationType) {
case NewLink:
result.append("link");
break;
case NewNeuron:
result.append("neuron");
break;
}
result.append(",from=");
result.append(this.fromNeuronID);
result.append(",to=");
result.append(this.toNeuronID);
result.append(",splitX=");
result.append(this.splitX);
result.append(",splitY=");
result.append(this.splitY);
result.append("]");
return result.toString();
}
}