/*
  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 int expectedChildren() { return 0; } 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(); 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); } }

Ads help maintain this website.