You are right. I used the wrong ECJ version.
Now, I noticed two things:
1. The initial population is not uploaded into the genomes.
In the .params file, I have set,
pop.subpop.0.size = 1
pop.subpop.0.species.genome-size = 3
pop.subpop.0.species.ind.gene.0 = java.lang.Float
pop.subpop.0.species.ind.gene.1 = java.lang.Float
pop.subpop.0.species.ind.gene.2 = java.lang.Float
In the pop.in file,
Number of Individuals: i1|
Individual Number: i0|
Evaluated: F
Fitness: f0|0.0|
i3|f|0.25|f|0.25|f|0.25|
To know if the population was uploaded, I added
"individuals[i].printIndividualForHumans(state, 0);" into Subpopulation
class' readSubpopulation(final EvolutionState state, final
LineNumberReader reader) method.
This is where I placed it.
...........
else for (int i = 0 ; i < individuals.length; i++)
{
int j =
Code.readIntegerWithPreamble(INDIVIDUAL_INDEX_PREAMBLE, state,
reader);
// sanity check
if (j!=i) state.output.warnOnce("On reading subpopulation
from text stream, some individual indexes in the subpopulation did not
match. " +
"The first was individual " + i + ", which is listed in the file
as " + j);
if (individuals[i] != null)
individuals[i].readIndividual(state, reader);
else
{
state.output.warnOnce("On reading subpopulation from text
stream, some of the preexisting subpopulation's slots were null. " +
"If you're starting an evolutionary run by reading an
existing population from a file, this is expected -- ignore this message.");
individuals[i] = species.newIndividual(state, reader);
// individuals[i].readIndividual(state, reader);
}
individuals[i].printIndividualForHumans(state, 0);
}
..........
What I got is "Parameters: null null null".
2. ECJ is having problem reading subpopulation size more than 1.
In the .params file, I set,
pop.subpop.0.size = 2
In the pop.in file,
Number of Individuals: i2|
Individual Number: i0|
Evaluated: F
Fitness: f0|0.0|
i3|f|0.25|f|0.25|f|0.25|
I received the message,
FATAL ERROR:
Line 5 has a bad preamble.Expected 'Individual Number: '
-->null
Then, I added the "Individual Number: " line
Number of Individuals: i2|
Individual Number: i0|
Evaluated: F
Fitness: f0|0.0|
i3|f|0.25|f|0.25|f|0.25|
Individual Number: i1|
But I get this,
FATAL ERROR:
Line 6 has a bad preamble.Expected 'Individual Number: '
-->null
I further added,
Number of Individuals: i2|
Individual Number: i0|
Evaluated: F
Fitness: f0|0.0|
i3|f|0.25|f|0.25|f|0.25|
Individual Number: i1|
Evaluated: F
Fitness: f0|0.0|
i3|f|0.3|f|0.3|f|0.3|
And I got this message,
FATAL ERROR:
Line 8 has a bad preamble.Expected 'Individual Number: '
-->i3|f|0.3|f|0.3|f|0.3|
thanks for your help.
On Sun, 21 Apr 2013 17:56:00 -0400, Sean Luke <[log in to unmask]>
wrote:
>On Apr 21, 2013, at 5:22 PM, SUBSCRIBE ECJ-INTEREST-L Anonymous
wrote:
>
>> 0. Be sure you're using the SVN repository version of ECJ, not the
tarball
>> version.
>> ---> Yes, its from the SVN.
>
>Are you sure? When I load this population into ecsuite, I get a different
set of warnings and it runs fine:
>
>java ec.Evolve \
> -file ec/app/ecsuite/ecsuite.params \
> -p pop.subpop.0.file=/tmp/foo.in \
> -p pop.subpop.0.species.genome-size=4
>
>.... I get ...
>
>WARNING:
>Subpopulation is reading from a file, but no extra-behavior provided. By
default, subpopulation will be truncated to fit the file size.
>ONCE-ONLY WARNING:
>On reading subpopulation from text stream, the current subpopulation
size didn't match the number of individuals in the file. The size of the
subpopulation will be revised accordingly. There were 2 individuals in the
file and 1000 individuals expected for the subopulation.
>Old subpopulation was of size 1000, truncating to size 2
>
>
>This is the new behavior for ECJ's population loading. It's telling me that
the subpopulation is supposed to be 1000 but only 2 individuals were
provided, and so the default behavior it will follow in that situation is to
truncate the population to 2 (there are two other behavior options). The
code works fine with 2, 3, or 4 individuals set in the file (i2| or i3| or i4|)
>
>Anyway, your posted warnings do not match this. It makes me suspect
you're possibly not using the SVN version.
>
>
>
>> 3. The file below has two individuals named "i2|". That's the cause of
the
>> second warning.
>> ---> If you are referring to "Individual Number: i0|", there are no
>> duplicates.
>
>You're right, I had misread the message.
>
>
>> 5. PrintIndividual needs the EvolutionState because it needs the
Output
>> facility. Is there a reason this won't be available but you'd still want to
>> print printIndividual? You can recreate most of printIndividual by just
>> writing out the right text and the right genome encodings (use
>> ec/util/Code.java).
>> ---> I want to quickly test ECJ with an initial population to see if its
what I
>> need, without having to dig for days simply to understand its workings.
If
>> you have a simple example, that would be very helpful.
>
>It depends on the representation. But here are some simple rules (note
the hint in the FLOAT discussion below):
>
>A BOOLEAN is written as either: T or F
>
>An INTEGER is written as: iX| where X is the integer value. Example:
i22|
>
>A FLOAT is written as: fX|Y| where Y is the floating-point
representation and X is the integer representation of the same bits (for
exactness). Example: f1048576000|0.25| ECJ will use X to determine
the precise value and will ignore Y. However if you omit X, then ECJ will
use Y (you still have to write both | symbols). This is useful if you are a
human and don't know these bits. So as a human you could just write:
f|0.25|
>
>A DOUBLE VECTOR INDIVIDUAL or FLOAT VECTOR INDIVIDUAL is
written as:
>
>Evaluated: BOOLEAN
>Fitness: FLOAT
>GENOME
>
>Where GENOME is an INTEGER indicating the number of genes, followed
by a FLOAT for each gene. Example:
>
>Evaluated: F
>Fitness: f0|0.0|
>i4|f1056964608|0.5|f1056964608|0.5|f1056964608|0.5|f1056964608|
0.5|
>
>A SUBPOPULATION is written as:
>
>Number of Individuals: INTEGER
>Individual Number: INTEGER
>INDIVIDUAL
>Individual Number: INTEGER
>INDIVIDUAL
>Individual Number: INTEGER
>INDIVIDUAL
>Individual Number: INTEGER
>INDIVIDUAL
>
>... and so on. That's the file you're trying to read in. You can also read
in entire POPULATIONS but it's rarely done.
>
>If you want to print this from some other application, you can do so by
just printing out the right stuff (ignoring the bit representation in the
float). Or you can use ec/util/Code.java to write out the bit
representation as well.
>
>Sean
|