Print

Print


Hi to all,

I am trying to use ECJ's strongly-typed GP implementation, but I am
having some issues with it. Currently, I
am trying to evolve trees that look like this:

                                                              Par
                                                                |

-------------------------------------------------------
                                     |
                     |
                                   Seq
             Weight
                                     |
                     |
              --------------------------------------------------
             ---------------------
              |                                                |
             |                   |
           Weight                                    Weight
  0.32            0.54
              |                                                |
          -----------                                    -------------
         |          |                                    |           |
        0.1      0.93                              0.5       0.2


Basically, there are 4 types of nodes: "Par", "Seq", "Weight", and
Ephemeral Random Constants (represented by the numbers
in the leaves). In this representation, the top node must always be an
instance of either "Par", "Seq", or "Weight"; the leaves must
always be ERCs. "Par" and "Seq" children must always be instances of
either "Par", "Seq", or "Weight"; only "Weight" has ERCs (and
can only have ERCs) as children. (In case you are familiar with it,
this is just a simplified version of Gruau's cellular encoding model.)

To model this, I have tried to define my parameter file like this.
First I defined two atomic types, "edge" for the regular type
(returned by "Par","Seq", and "Weight"), and "real" for the ERCs:

---------------------------------------------------------------
gp.type.a.size = 2
gp.type.s.size = 0
gp.type.a.0.name = edge
gp.type.a.1.name = real
---------------------------------------------------------------

I defined my GP individuals with only one tree, returning the "edge"
datatype at the topmost node:

------------------------------------------------------------------------------------
pop.subpop.0.species.ind.numtrees = 1
pop.subpop.0.species.ind.tree.0 = ec.gp.GPTree
pop.subpop.0.species.ind.tree.0.tc = tc0


gp.tc.size = 1
gp.tc.0 = ec.gp.GPTreeConstraints
gp.tc.0.name = tc0
gp.tc.0.fset = f0
gp.tc.0.returns = edge
-------------------------------------------------------------------------------------

And defined 3 node constraints. nc0 is used for the ERCs, nc1 for
"Par" and "Seq"; nc2 for "Weight":

--------------------------------------------------------------------------------------
gp.nc.0 = ec.gp.GPNodeConstraints
gp.nc.0.name = nc0
gp.nc.0.returns = real
gp.nc.0.size = 0

gp.nc.1 = ec.gp.GPNodeConstraints
gp.nc.1.name = nc1
gp.nc.1.returns = edge
gp.nc.1.size = 2
gp.nc.1.child.0 = edge
gp.nc.1.child.1 = edge

gp.nc.2 = ec.gp.GPNodeConstraints
gp.nc.2.name = nc2
gp.nc.2.returns = edge
gp.nc.2.size = 2
gp.nc.2.child.0 = real
gp.nc.2.child.1 = real
--------------------------------------------------------------------------------------------

Therefore my function set is like this:

--------------------------------------------------------------------------------------------
gp.fs.0.size = 4
gp.fs.0.func.0 = org.amatos.evodevo.growthmodels.cellularencoder.Par
gp.fs.0.func.0.nc = nc1
gp.fs.0.func.1 = org.amatos.evodevo.growthmodels.cellularencoder.Seq
gp.fs.0.func.1.nc = nc1
gp.fs.0.func.2 = org.amatos.evodevo.growthmodels.cellularencoder.Weight
gp.fs.0.func.2.nc = nc2
gp.fs.0.func.3 =
org.amatos.evodevo.growthmodels.cellularencoder.WeightERC
gp.fs.0.func.3.nc = nc0
---------------------------------------------------------------------------------------------


Now, when I try to run ECJ with these params, I get the following
error message:

-----------------------------------------------------------------------------------------------------------------
ERROR:
In function set f0 for the GPTreeConstraints tc0, no terminals are
given with the return type edge which is required by other functions
in the function set.
PARAMETER: gp.tc.0
WARNING:
In function set f0 for the GPTreeConstraints tc0, no *nonterminals*
are given with the return type real which is required by other
functions in the function set.  This may or may not be a problem for
you.
PARAMETER: gp.tc.0
SYSTEM EXITING FROM ERRORS
-----------------------------------------------------------------------------------------------------------------

I really don't understand why in this case ECJ requires terminals
returning edges (and conversely non-terminals returning reals).
Shouldn't ECJ
be able to generate trees even without these nodes defined? Is this
related to the GPNodeBuilder used? or do I need to separate my
functions into
2 different function sets?

Best regards,

Artur Matos.