/*
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.*;
/*
* ADFContext.java
*
* Created: Tue Oct 26 13:36:46 1999
* By: Sean Luke
*/
/**
* ADFContext is the object pushed onto an ADF stack which represents
* the current context of an ADM or ADF function call, that is, how to
* get the argument values that argument_terminals need to return.
*
* adf contains the relevant ADF/ADM node.
* If it's an ADF
* function call, then arguments[] contains the evaluated arguments
* to the ADF. If it's an ADM function call,
* then arguments[] is set to false.
*
*
You set up the ADFContext object for a given ADF or ADM node with
* the prepareADF(...) and prepareADM(...) functions.
*
*
To evaluate an argument number from an ADFContext, call evaluate(...),
* and the results are evaluated and copied into input.
*
* @author Sean Luke
* @version 1.0
*/
public class ADFContext implements Prototype
{
public final static String P_ADFCONTEXT = "adf-context"; // deprecated
/** The ADF/ADM node proper */
public ADF adf;
/** An array of GPData nodes (none of the null, when it's used)
holding an ADF's arguments' return results */
public GPData[] arguments = new GPData[0];
public Parameter defaultBase()
{
return GPDefaults.base().push(P_ADFCONTEXT);
}
public Object clone()
{
try
{
ADFContext myobj = (ADFContext) (super.clone());
// deep-clone the contexts
myobj.arguments = new GPData[arguments.length];
for(int x=0;x= adf.children.length || argument < 0) // uh oh
{
individual.printIndividual(state,0);
state.output.fatal("Invalid argument number for " + adf.errorInfo());
}
// Am I an ADM or an ADF?
//if (adf==null)
// state.output.fatal("ADF is null for " + adf.errorInfo());
// else
if (!(adf instanceof ADM)) // it's an ADF
arguments[argument].copyTo(input);
else // it's an ADM
{
// get rid of my context temporarily
if (stack.moveOntoSubstack(1)!=1)
state.output.fatal("Substack prematurely empty for " + adf.errorInfo());
// Call the GPNode
adf.children[argument].eval(state,thread,input,stack,individual,problem);
// restore my context
if (stack.moveFromSubstack(1)!=1)
state.output.fatal("Stack prematurely empty for " + adf.errorInfo());
}
}
/** Increases arguments to accommodate space if necessary.
Sets adf to a.
You need to then fill out the arguments yourself. */
public final void prepareADF(ADF a, GPProblem problem)
{
// set to the length requested or longer
if (a.children.length > arguments.length) // the first time this will nearly always be true
{
GPData[] newarguments = new GPData[a.children.length];
System.arraycopy(arguments,0,newarguments,0,arguments.length);
// fill gap -- ugh, luckily this doesn't happen but a few times
for(int x=arguments.length;x
Ads help maintain this website.