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.
Compared to previous versions of ECJ, version 20 seems to have introduced a change in parameter meaning in the vector package. However, the tutorial parameter files have not been updated to reflect this change.
I could accept this as just one quirk in a complex system, happily change 'crossover-prob' to 'likelihood' myself in the params file, and move on, if it were not for the egregiously bad nature of the change.
Crossover-prob has (probably) meant the same thing since the beginning of ECJ - the probability of calling the crossover function in a breeding pipeline. 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'.
(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.)
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.
There is lots not to like about likelihood. It is defined in BreedingPipeline, which seems the wrong place for something that is 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.
If I might be allowed a suggestion...
Add a new and specifically named parameter for uniform crossover per site probability, perhaps 'uniform-crossover-per-site-prob' would work. Revert crossover-prob to its original and clear meaning. Eliminate the likelihood parameter. Eliminate the now useless warning message. Move the test of the crossover-prob parameter to a more appropriate location.
If all of that isn't in the cards, at least improve the warning message so that users will know where to set the likelihood parameter so that it has an effect.
Thank you very much for ECJ.
David vun Kannon