ec.vector
Class VectorGene

java.lang.Object
  |
  +--ec.vector.VectorGene
All Implemented Interfaces:
java.lang.Cloneable, Prototype, java.io.Serializable, Setup

public abstract class VectorGene
extends java.lang.Object
implements Prototype

VectorGene is an abstract superclass of objects which may be used in the genome array of GeneVectorIndividuals.

Default Base
vector.vect-gene

See Also:
Serialized Form

Field Summary
static java.lang.String P_VECTORGENE
           
 
Constructor Summary
VectorGene()
           
 
Method Summary
 Parameter defaultBase()
          Returns the default base for this prototype.
abstract  boolean equals(java.lang.Object other)
          Unlike the standard form for Java, this function should return true if this gene is "genetically identical" to the other gene.
abstract  int hashCode()
          Generates a hash code for this gene -- the rule for this is that the hash code must be the same for two genes that are equal to each other genetically.
 void mutate(EvolutionState state, int thread)
          Mutate the gene.
 void printGene(EvolutionState state, int verbosity, int log)
          Prints the gene in a way that can be read by readGene().
 void printGene(EvolutionState state, java.io.PrintWriter writer)
          Prints the gene in a way that can be read by readGene().
 void printGeneForHumans(EvolutionState state, int verbosity, int log)
          Nice printing.
 java.lang.String printGeneToString(EvolutionState state)
          Prints the gene to a string in a fashion readable by readGeneFromString.
 java.lang.Object protoClone()
          Creates a new individual cloned from a prototype, and suitable to begin use in its own evolutionary context.
 java.lang.Object protoCloneSimple()
          This should be implemented in a the top-level Prototype ONLY; in fact, it should probably be declared final.
 void readGene(EvolutionState state, java.io.LineNumberReader reader)
          Reads a gene printed by printGene(...).
 void readGeneFromString(java.lang.String string, EvolutionState state)
          Reads a gene from a string, which may contain a final '\n'.
abstract  void reset(EvolutionState state, int thread)
          The reset method randomly reinitializes the gene.
 void setup(EvolutionState state, Parameter base)
          Sets up the object by reading it from the parameters stored in state, built off of the parameter base base.
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

P_VECTORGENE

public static final java.lang.String P_VECTORGENE
Constructor Detail

VectorGene

public VectorGene()
Method Detail

setup

public void setup(EvolutionState state,
                  Parameter base)
Description copied from interface: Prototype
Sets up the object by reading it from the parameters stored in state, built off of the parameter base base. If an ancestor implements this method, be sure to call super.setup(state,base); before you do anything else.

For prototypes, setup(...) is typically called once for the prototype instance; cloned instances do not receive the setup(...) call. setup(...) may be called more than once; the only guarantee is that it will get called at least once on an instance or some "parent" object from which it was ultimately cloned.

Specified by:
setup in interface Prototype

defaultBase

public Parameter defaultBase()
Description copied from interface: Prototype
Returns the default base for this prototype. This should generally be implemented by building off of the static base() method on the DefaultsForm object for the prototype's package. This should be callable during setup(...).
Specified by:
defaultBase in interface Prototype

protoClone

public java.lang.Object protoClone()
                            throws java.lang.CloneNotSupportedException
Description copied from interface: Prototype
Creates a new individual cloned from a prototype, and suitable to begin use in its own evolutionary context.

The question here is whether or not this means to perform a "deep" or "light" ("shallow") clone, or something in-between. You may need to deep-clone parts of your object rather than simply copying their references, depending on the situation:

Implementations.

If you know that your superclasses will never change their protoClone() implementations, you might try inlining them in your overridden protoClone() method. But this is dangerous (though it yields a small net increase).

In general, you want to keep your deep cloning to an absolute minimum, so that you don't have to call protoClone() but one time.

The approach taken here is the fastest that I am aware of while still permitting objects to be specified at runtime from a parameter file. It would be faster to use the "new" operator; but that would require hard-coding that we can't do. Although using java.lang.Object.clone() entails an extra layer that deals with stripping away the "protected" keyword and also wrapping the exception handling (which is a BIG hit, about three times as slow as using "new"), it's still MUCH faster than using java.lang.Class.newInstance(), and also much faster than rolling our own Clone() method.

Specified by:
protoClone in interface Prototype

protoCloneSimple

public final java.lang.Object protoCloneSimple()
Description copied from interface: Prototype
This should be implemented in a the top-level Prototype ONLY; in fact, it should probably be declared final. It should be implemented as follows:

public final Object protoCloneSimple()
{
try { return protoClone(); }
catch (CloneNotSupportedException e) 
{ throw new InternalError(); } // never happens
} 
Specified by:
protoCloneSimple in interface Prototype

hashCode

public abstract int hashCode()
Generates a hash code for this gene -- the rule for this is that the hash code must be the same for two genes that are equal to each other genetically.
Overrides:
hashCode in class java.lang.Object

equals

public abstract boolean equals(java.lang.Object other)
Unlike the standard form for Java, this function should return true if this gene is "genetically identical" to the other gene.
Overrides:
equals in class java.lang.Object

reset

public abstract void reset(EvolutionState state,
                           int thread)
The reset method randomly reinitializes the gene.

mutate

public void mutate(EvolutionState state,
                   int thread)
Mutate the gene. The default form just resets the gene.

printGeneForHumans

public void printGeneForHumans(EvolutionState state,
                               int verbosity,
                               int log)
Nice printing. The default form simply calls printGene, but you might want to override this.

printGeneToString

public java.lang.String printGeneToString(EvolutionState state)
Prints the gene to a string in a fashion readable by readGeneFromString. Override this. The default form does nothing.

readGeneFromString

public void readGeneFromString(java.lang.String string,
                               EvolutionState state)
Reads a gene from a string, which may contain a final '\n'. Override this method. The default form does nothing.

printGene

public void printGene(EvolutionState state,
                      int verbosity,
                      int log)
Prints the gene in a way that can be read by readGene(). The default form simply calls printGeneToString(state). Override this gene to do custom writing to the log, or just override printGeneToString(...), which is probably easier to do.

printGene

public void printGene(EvolutionState state,
                      java.io.PrintWriter writer)
Prints the gene in a way that can be read by readGene(). The default form simply calls printGeneToString(state). Override this gene to do custom writing, or just override printGeneToString(...), which is probably easier to do.

readGene

public void readGene(EvolutionState state,
                     java.io.LineNumberReader reader)
              throws java.io.IOException,
                     java.lang.CloneNotSupportedException
Reads a gene printed by printGene(...). The default form simply reads a line into a string, and then calls readGeneFromString() on that line. Override this gene to do custom reading, or just override readGeneFromString(...), which is probably easier to do.