/* Copyright 2006 by Sean Luke Licensed under the Academic Free License version 3.0 See the file "LICENSE" for more information */ package ec.gp; import ec.*; import ec.util.*; import java.io.*; /* * ADFArgument.java * * Created: Tue Oct 26 16:14:09 1999 * By: Sean Luke */ /** * An ADFArgument is a GPNode which represents an ADF's * argument terminal, its counterpart which returns argument * values in its associated function tree. In lil-gp this is called an * ARG node. * *

Obviously, if you have Argument Terminals in a tree, that tree must * be only callable by ADFs and ADMs, otherwise the Argument Terminals * won't have anything to return. Furthermore, you must make sure that * you don't have an Argument Terminal in a tree whose number is higher * than the smallest arity (number of arguments) of a calling ADF or ADM. *

Parameters
base.arg
int >= 0
(The related argument position for the ADF Argument Node in the associated ADF)

Default Base
gp.adf-argument * @see ec.gp.ADF * @author Sean Luke * @version 1.0 */ public class ADFArgument extends GPNode { public static final String P_ADFARGUMENT = "adf-argument"; public final static String P_ARGUMENT = "arg"; public static final String P_FUNCTIONNAME = "name"; public int argument; /** The "function name" of the ADFArgument, to distinguish it from other GP functions you might provide. */ public String name; public String name() { return name; } public Parameter defaultBase() { return GPDefaults.base().push(P_ADFARGUMENT); } public String toString() { return name(); } public void setup(final EvolutionState state, final Parameter base) { super.setup(state,base); Parameter def = defaultBase(); // make sure we don't have any children... if (children.length!= 0) state.output.error("Incorrect number of children for ADF Argument terminal -- should be 0. Check the constraints.",base,def); argument = state.parameters.getInt(base.push(P_ARGUMENT),def.push(P_ARGUMENT),0); if (argument < 0) state.output.fatal("Argument terminal must have a positive argument number.", base.push(P_ARGUMENT),def.push(P_ARGUMENT)); name = state.parameters.getString(base.push(P_FUNCTIONNAME),def.push(P_FUNCTIONNAME)); if (name == null || name.equals("")) { name = "ARG" + argument; state.output.warning("ADFArgument node for argument " + argument + " has no function name. Using the name " + name(), base.push(P_FUNCTIONNAME),def.push(P_FUNCTIONNAME)); } } public void writeNode(final EvolutionState state, final DataOutput dataOutput) throws IOException { dataOutput.writeInt(argument); } public void readNode(final EvolutionState state, final DataInput dataInput) throws IOException { argument = dataInput.readInt(); } public void eval(final EvolutionState state, final int thread, final GPData input, final ADFStack stack, final GPIndividual individual, final Problem problem) { // get the current context ADFContext c = stack.top(0); if (c==null) // uh oh state.output.fatal("No context with which to evaluate ADFArgument terminal " + toStringForError() + ". This often happens if you evaluate a tree by hand which is supposed to only be an ADF's associated tree."); c.evaluate(state,thread,input,stack,individual,problem,argument); } }