On Jul 15, 2013, at 5:09 AM, David vun Kannon wrote:
> Looking again at ECJ after some time away from it, I downloaded ECJ 21 and tried out Tutorial 1. I was surprised to see this warning:
> The 'crossover-prob' parameter may only be used with any-point crossover. It states the probability that a particular gene will be crossed over. If you were looking for the probability of crossover happening at *all*, look at the 'likelihood' parameter.
> PARAMETER: pop.subpop.0.species.crossover-prob
> ALSO: vector.species.crossover-prob
Shoot. Looks like I missed the tutorial.
> Crossover-prob has (probably) meant the same thing since the beginning of ECJ - the probability of calling the crossover function in a breeding pipeline.
I do not believe that the vector crossover function has ever had a probability of occurrence. This is because normally such a thing would be done using MultiBreedingPipeline. crossover-prob has *always* (well, at least since v.10, which is the earliest I checked) referred to uniform crossover. The naming is consistent with mutation-prob.
> 20 versions later, the meaning of the parameter is changed to 'uniform crossover per site probability'. To take the place of the original meaning, a new parameter is created, 'likelihood'.
Actually what I believe was done (by me last year) was to *add* the ability to do crossover probability, since it was so common a need and MultiBreedingPipeline is unweildy.
> (As an aside, the code for uniform crossover is problematic in that it is called "any point" crossover, even though the documentation shows that the author knows that uniform crossover is the more widely used term.)
Yep. And the constants and parameters are called "any". This was an early stupidity that should be cleaned up.
> Likelihood is a broad and vague term, and as a parameter name there is nothing to suggest that it relates to all crossover operations, more than the chances of the Mets winning the World Series.
The problem is that "probability" was already used, and I don't like reverting in ECJ. I'm having a hard time coming up with another synonym. Suggestions?
> There is lots not to like about likelihood. It is defined in BreedingPipeline, which seems the wrong place for something that is crossover specific.
It's not crossover specific.
> The comment in the code
> /** Indicates the probability that the Breeding Pipeline will perform its mutative action instead of just doing reproduction. */
> is just wrong. And if you take the generated warning (above) at face value and change crossover-prob to likelihood, you won't solve the problem.
> pop.subpop.0.species.likelihood = 7.0
> doesn't throw the expected error. Varying likelihood from 1.0 to 0.0 has no effect on results. Obviously, the likelihood variable is being given the default value (1.0) because likelihood is misplaced in the parameter file.
David, your comments above have some mistakes in them. Why are you doing pop.subpop.0.species.likelihood? And actually the comment in the code is *exactly* what likelihood is supposed to be for. Now it may be that I've not gotten likelihood running in all of the breeding operators in ECJ yet (I have to double-check) but that is indeed its purpose. And it's the reason why it's in BreedingPipeline: it's general to all operators.