On Dec 9, 2010, at 7:49 AM, Dexter R. Brown wrote:

> Hello,
>   I am new to ECJ and I am trying to use the system as a librarary for
> symbolic regression of data points with multiple independent  
> variables.
> I have followed the tutorial 4 and built the X, Y, DoubleData and
> MultipleRegression classes.  What I am not sure about is whether each
> independent variable needs a class representation or is the X class
> enhanced to include properties for each variable such that
> instanceX.x1...xn?

You could certainly represent your variables as special kinds of  
ERCs.  Here they'd hold the index into the array of current variable  
values your Problem is dishing out (I called that "vars" below).  I  
slapped together code below but didn't compile it and I'm sure it'll  
require some modification.  But I hope it gives you the general idea.


import ec.*;
import ec.util.*;

public class Var extends ERC
     public String name() { return "Var"; } // distinguish from other  
ERCs you might be using

     int index;
     public void resetNode(final EvolutionState state, final int thread)
		// we'll reset our index to reflect a variable in the problem  
		MyProblem prob = (MyProblem)(state.evaluator.p_problem);
		nodeIndex = state.random[thread].nextInt(prob.vars.length);

     public int nodeHashCode() { return this.getClass().hashCode() +  
nodeIndex; }

     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 (((Var)node).index == index);

     public void readNode(final EvolutionState state, final DataInput  
dataInput) throws IOException
         index = dataInput.readInt();

     public void writeNode(final EvolutionState state, final  
DataOutput dataOutput) throws IOException

     public String encode() { return Code.encode(index); }

     public boolean decode(DecodeReturn dret)
         // store the position and the string in case they
         // get modified by
         int pos = dret.pos;
         String data =;

         // decode

         if (dret.type != DecodeReturn.T_INT) // uh oh!
             // restore the position and the string; it was an error
    = data;
             dret.pos = pos;
             return false;

         // store the data
         infrc = dret.l;
         return true;

     public String toStringForHumans() { return "Var[" + index + "]"; }

     public void eval(final EvolutionState state,
         final int thread,
         final GPData input,
         final ADFStack stack,
         final GPIndividual individual,
         final Problem problem)
		MyProblem prob = (MyProblem)(problem);
		return prob.vars[index];