ECJ

Version		Change Log
----------------------------------------------------------------------------
1		Initial version

2		First prerelease, too many additions to mention

3		Second prerelease
		Race condition bug fixed in ec.gp.koza.Crossover
	     	Breeding trees can now be prespecified
		Crossover can throw away the second sibling
		Multiplexer sped up by a factor of 10!  I might do the
			same thing for Parity and Regression if I have time,
			though for Regression it won't make much of a 
			difference -- thanks to Poli and Langdon
		Lots of little additions and tweaks
		GPNode functions increased
		Regression's * operator no longer shortcuts (due to NaN/Inf)
		Documentation fixes
		Fitness.equivalentTo() now is ==, not >=
		ec.util.Version modified slightly
		Individuals can now be written out to streams, not just logs

4		Third prerelease
		Finisher and Exchanger now are told the run result 
			(success/failure) when they're cleaning up
		Protected Log (rlog) in ec.app.regression.func.Log now is:
				(if (= x 0) x (abs (log x)))
			It was incorrectly:
				(if (<= x 0) x (abs (log x)))
		Edge domain added, with basic function classes
		GPNode.readNode() and ERC.readNode() now check to 
			make sure that the character after the read node is 
			whitespace, (, ), or end of string
		GPTree's readTree() method now checks if a line is empty, 
			rather than bombing.  :-)
		Default population size is now 1024
		Koza FULL/GROW/HALF algorithms now ramp properly; before 
			they were fixed to maxDepth rather than ramping 
			between minDepth and maxDepth.
		ECJ now uses the following for its FULL/GROW/HALF algorithm
			parameter defaults:
				GROW:  	min-depth=5, max-depth=5 (Koza standard
					for mutation)
				FULL:	undefined
				HALF:	min-depth=2, max-depth=6 (Koza standard
					for new individuals)
			Unlike Koza, ECJ permits single-terminal trees/subtrees
		Fixed the documentation for FULL/GROW/HALF to describe the
			odd things that Koza and lil-gp do.
		MersenneTwister and MersenneTwisterFast implement the new, 
			official, improved Mersenne Twister seeding algorithm.
		MersenneFastest.c file deleted
		Three Classes Shortened to the 31 char Mac filename limit:
			ParameterClassNotFoundException ->
				ParameterClassLoadException
			FitnessProportionateSelection ->
				FitProportionateSelection
			SteadyStateBreedingSourceForm ->
				SteadyStateBSourceForm
		ec/params and ec/simple/params files now don't have overlapping
			stuff
		ec/gp/params no longer includes ec/multiobjective/params
		ec.gp.koza.KozaShortStatistics now splits up
			postEvaluationStatistics so that you can include
			stuff in an overriding class before a println 
			is issued.
		
5		Fourth prerelease
		Decided on a strategy to deal with (ARGH!!!) Sun's shift to
			incompatible floating point types across platforms.
			See the file "ABOUT.JDK13"
		ec.select.TournamentSelection can have a tournament of 1
		added README.MacOS
		minor fix to ec.util.ParameterDatabase
		removed the (commented out) populate(...) method from ec.Group
		ec.Evolve now allows <=0 as a seed (since we're using the new
			MersenneTwister seeding algorithm).
		minor fix to ec.gp.GPTreeConstraints
		Added the TwoBox problem
		Orphaned interface GPNodeBuilderHelper deleted
		Modified documentation eval.finish -> eval.problem parameter
		Added the PTC1 and PTC2 algorithms.  Slight addition to
			GPNodeConstraints to accommodate them.
		Added the es package, including (mu,lambda) and (mu+lambda)
			selection strategies.  Totally untested, use at
			your own risk.
		Modified ECJ's strong-typing claim.  ECJ does atomic and
			set-based typing, but will not handle polymorphic
			algorithms without some coding (which I may or
			may not get to -- set-based strong typing is
			pretty dang useful, and it's rare that you
			need more than that).
		Tweaked documentation of SteadyState stuff; as currently
			implemented, the steady state evolution only marks
			one individual per subpop for death each loop
			(not n individuals, as had previously suggested).
		Added elitism to ec.simple.SimpleBreeder
		Symbolic Regression training set size now a parameter
		Fixed ForceBreedingPipeline's claimed default parameter base
		Changed default parameter base for entire ec.breed package
			to "breed"
		Moved all params files to foo.params.  Updated parent 
			statements within params files to reflect this.
			Hope I got 'em all.
		ec.BreedingSource now has typicalIndsProduced() set to a
			default of 1, rather than forcing it to be abstract.
		MAJOR CHANGE: Species no longer has an array of breeding 
			pipelines. It now has a single pipeline.  If you 
			need to pick from among pipelines, use 
			ec.breed.MultiBreedingPipeline.  The various GP 
			params files have been updated to reflect this 
			(since Koza GP by default picks from among pipelines),
			but your params files may be broken because stuff like
				pop.subpop.0.species.pipe.0.blah.blah
			has now changed to
				pop.subpop.0.species.pipe.source.0.blah.blah
			with the insertion of the MultiBreedingPipeline.  
			This is a good thing overall though -- it 
			dramatically simplifies the breeding code with no net
			loss.
		Tweaked the documentation stating the purpose of 
			GPBreedingPipeline.
		Tweaked documentation for ec.Evolve
		Modified ec.util.ParameterDatabase to sort its listed parameters
		Fixed bugs (I hope) in ec.gp.breed.RandomBranch
		Modified RandomChoice (adding the exemptZeroes method) so that 
			it properly handles zero-probability values, and also
			added the ability to handle objects which return 
			doubles rather than floats (RandomChoiceChooserD).
		ec.gp.GPNodeBuilder.canPick() and ec.gp.GPNodeBuilder.pickSize()
			are no longer final
		ec.util.MersenneTwister[Fast].nextBoolean([float|double]) now
			checks to see if the probability is 0.0 or 1.0 and
			guarantees to return false or true in that case
        	Modified ec.Exchanger.runComplete(...) to return a String
        	Modified the various EvolutionState subclasses to consider
        	    ec.Exchanger.runComplete(...) properly in their decision
        	    to shut down prematurely
		ec.steadystate.SteadyStateEvolutionState now reports that it
		    found an ideal individual
		Docs updated
