/home/ooechs/ECJ_Tutorial/src/ac/essex/ecj/util/ERCAdapter.java
|
package ac.essex.ecj.util;
import ec.gp.*;
import ec.EvolutionState;
import ec.Problem;
import ec.util.Code;
import ec.util.DecodeReturn;
import ac.essex.ecj.data.DoubleData;
/**
* <p/>
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version,
* provided that any use properly credits the author.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details at http://www.gnu.org
* </p>
*
* @author Olly Oechsle, University of Essex, Date: 17-Aug-2006
* @version 1.0
*/
public abstract class ERCAdapter extends ERC {
protected double value;
protected String name;
public abstract double setNumber(final EvolutionState state, final int thread);
public void resetNode(final EvolutionState state, final int thread) {
value = setNumber(state, thread);
}
public int nodeHashCode() {
// a reasonable hash code
return this.getClass().hashCode() + Float.floatToIntBits((float) value);
}
public boolean nodeEquals(final GPNode node) {
// check first to see if we're the same kind of ERC --
// won't work for subclasses; in that case you'll need
// to change this to isAssignableTo(...)
if (this.getClass() != node.getClass()) return false;
// now check to see if the ERCs hold the same value
return (((ERCAdapter) node).value == value);
}
public String encode() {
return Code.encode(value);
}
public boolean decode(DecodeReturn dret) {
// store the position and the string in case they
// get modified by Code.java
int pos = dret.pos;
String data = dret.data;
// decode
Code.decode(dret);
if (dret.type != DecodeReturn.T_DOUBLE) // uh oh!
{
// restore the position and the string; it was an error
dret.data = data;
dret.pos = pos;
return false;
}
// store the data
value = dret.d;
return true;
}
public void eval(final EvolutionState state, final int thread, final GPData input, final ADFStack stack, final GPIndividual individual, final Problem problem) {
DoubleData rd = ((DoubleData) (input));
rd.value = value;
}
}