On Jul 9, 2013, at 4:14 AM, Bojan Janisch wrote: > what do I have to do, to build a complete GPTree and use it for evaluation? > > Background is that I have now successfully created my first rules from a GPTree. > But I want to know if the results would be better if I use a rule that I manually > wrote, as a GPIndividuum in my population. If you just want to build a GPTree manually, you just need to allocate various GPNodes and hang them together. I'll presume you don't care about making a new GPIndividual, just constructing a GPTree and evaluating it. To allocate GPNodes you might need your function set. Let's say that your GPTree was intended to fit into tree slot s of your GPIndividual (in most cases you just have one tree per individual, so s=0). You might do: final EvolutionState state = ... final Subpopulation subpop = ... final GPInitializer init = (GPInitializer)(state.initializer); final GPSpecies gps = (GPSpecies)(subpop.species); final GPIndividual indproto = ((GPIndividual)(gps.i_prototype)); final GPTree gptproto = indproto.trees[0]; final GPTreeConstraints gptc = gptproto.constraints(init); final GPFunctionSet gpfs = gptc.functionset; Okay, now you have your function set. See GPFunctionSet to extract specific GPNodes. For example, you can make a node whose name is "+" like this: GPNode plus = (GPNode)(gpfs.nodesByName.get("+").clone()); // ALWAYS clone A GPNode has three critical variables that you will need to set. public GPNodeParent parent; public GPNode children[]; public byte argposition; Parent points to the parent GPNode of the node, or to a GPTree if the node is the root. You probably don't need to attach to a tree if you're just evaluating the tree, just let that value be null. children[] is an array of the children nodes to the node. children[] can be null, or can be zero length, if the node is a leaf. argposition is the index in the parent's children array in which this node is found. It says "I'm child number 4 of my parent", for example. Let's say we're trying to create the tree: (+ (cos x) x) I'd do this: GPNode plus = (GPNode)(gpfs.nodesByName.get("+").clone()); GPNode cos = (GPNode)(gpfs.nodesByName.get("cos").clone()); GPNode x_one = (GPNode)(gpfs.nodesByName.get("+").clone()); GPNode x_two = (GPNode)(gpfs.nodesByName.get("+").clone()); plus.parent = null; // no GPTree :-( plus.argposition = 0; plus.children[0] = cos; plus.children[1] = x_one; cos.parent = plus; cos.argposition = 0; cos.children[0] = x_two; x_one.parent = plus; x_one.argposition = 1; x_one.children = null; // it's probably already null anyway x_two.parent = cos; x_two.argposition = 0; x_two.children = null; // it's probably null already Now you're ready to evaluate the node. GPProblem prob = ... GPData gpd = ... int threadnum = ... GPIndividual ind = null; // our GPNodes don't need the individual to evaluate plus.eval(state, threadnum, gpd, new ADFStack(), ind, prob); If you need the GPTree or the GPIndividual constructed as well, then there's a bit more to that. Sean