The EOP file structure

The EOP format aims to be a little more legible (to the human reader)
than the old format, and a lot more flexible.  It is furthermore
designed to be extensible, so that if we want to add a new feature, we
will not have to redesign the format.

Here are two typical entries in an eop file:

  ADDP idl=ga_addp libgenie=ge_addp rp=2 wp=1;
  ADDS idl=ga_adds libgenie=ge_addp rp=1 wp=1
       parm={initval=.2,del=.05};

The first token identifies the primary key, and following that is
a space-delimited list of key=value pairs.  The parameter value is itself
a set of comma-delimited key=value pairs.  Finally, the definition is
terminated with a semicolon.

This format permits defaults and optional parameters.
So we can rewrite those lines as follows:

  ADDP idl=ga_addp rp=2;
  ADDS idl=ga_adds wt=2;
       parm={initval=[.2,.8],del=.05,bound=[0:1]};

Since most functions have rp=1 and wp=1, we take those as defaults,
and they don't have to be specified.  The wt=2 is a new parameter
(corresponding to "weight") which means to choose this function twice
as often. As it turns out, this feature (different weights on
different eop's) is currently implemented, but even if it were not, it
still wouldn't hurt to put it in the eop file.  Note that the initial
value could be .2 or .8 with equal probability and that the mutations
are required to keep the parameter in the range between 0 and 1.

Suppose we modified ga_addp to add a variable number of input planes,
up to say five.  Rather than define ADDP2,...,ADDP5 we can just say
  ADDP idl=ga_addp rp=[2:5];

Note that we used 'parm' to indicate a floating point parameter.  We
can also have integer and symbolic parameters, but floating point is
the default.  We can explicitly identify the parameter as floating
point with the `type' keyword
       parm={type=f,initval=...}
If we want the parameter to be of integer or symbol type, then the
specification is type=i and type=s, respectively.

It is possible to specify different attributes of the same eop's in
different files.  For instance, you can leave the idl=... attributes
out of the main file, and put them in a separate file, eg

in test.eop:
  ADDP rp=2;
  ADDS wt=2;
       fparm={initval=[.2,.8],del=.05,bound=[0:1]};

in test-idl.eop
  ADDP idl=ga_addp
  ADDS idl=ga_adds

Further, you can over-ride existing attributes, eg

in experimental.eop
  ADDP idl=ga_addp_new rp=[2:5]

So you can try out a new implementation without altering existing 
eop files by just including or not including the experimental.eop
in your list of eop files that you specify in the opt file.

[Added 6/11/00 by simes]: You can specify a mathematical expression
involving W as the value for the rp tag. This means that the number of
read planes is calculated, depending upon the number write planes,
W. Note the dependency does not work the other way round (i.e. you
can't give an expression involving R for wp).