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

6	Fifth prerelease
	Island models, coevolution, and competitive fitness have been added.
		A bunch of big modifications were made in order to implement 
       	     	coevolution, competitive fitness, and island models.  Get
            	ready, here we go:
        Major change, not backward-compatible:  the thread parameter
		    has been removed from most print- and read- methods 
		    which operate on PrintWriters or LineNumberReaders for
		    individuals and subcomponents.  This is because reading
		    and writing might be done in a private thread (for 
		    asynchronous island model exchanges for example), and so
 		    no thread number is appropriate.  If you need to use a
		    random number generator,  you will need to create one
		    yourself.  Do not rely on random[0].  Affected methods:

			Species.newIndividual(...)
			Fitness.printFitness(...)
			Fitness.readFitness(...)
			Individual.printIndividual(...)
			Individual.readindividual(...)
			simple.SimpleFitness.printFitness(...)
			simple.SimpleFitness.readFitness(...)
			gp.GPSpecies.newIndividual(...)
			gp.GPIndividual.printIndividual(...)
			gp.GPIndividual.readIndividual(...)
			gp.GPTree.printTree(...)
			gp.GPTree.readTree(...)
			gp.GPNode.printRootedTree(...)
			gp.GPNode.readRootedTree(...)
			gp.GPNode.printNode(...)
			gp.koza.KozaFitness.printFitness(...)
			gp.kozalKozaFitness.readFitness(...)
			multiobjective.MultiObjectiveFitness.printFitness(...)
			multiobjective.MultiObjectiveFitness.readFitness(...)
        
        Bug fix in ParameterDatabase.getStringWithDefault() now always
            returns the default string if the string was not found for
            the given parameter (sometimes it was returning null)
        gp.GPTree.printTree* methods now make certain that a return is
            printed at the end.  Also gp.GPIndividual.printIndividual*
            does not make certain (it assumes that printTree will 
            do it). Fixed to make IslandModel exchanges work right.
        EvolutionState.resetFromCheckpoint() is no longer a hook -- 
            now it's the official mechanism that Checkpoint uses
            to get the whole evolution system to restart itself
            after a checkpoint.  Accordingly, output.restart() and
            Exchanger.reinitializeContacts() have been moved to this
            location, and removed from their previous locations in
            the various EvolutionState objects.
        EvolutionState.go() and EvolutionState.run() no longer throw
            IOExceptions, because they no longer call output.restart()
        Fixed checkpoint bug -- GPNodeConstraints wasn't writing out all
            of its static variables.
        Fixed another checkpoint bug -- various Clique objects weren't
            getting written out at all because we no longer reference
            them with pointers but instead with bytes.  This was fixed
            by sticking their static hashtables in a vector called
            "statics" maintained by EvolutionState, so *something*
            serializable is pointing to them.
        Major change, not backward-compatable: the mechanism behind
            the Problem class has been modified, in order to clean up
            stuff to make competitive fitness and coevolution methods more
            doable.  To whit:
                1. Problem is no longer an interface.  It is now an
                empty abstract class.  We may add stuff to this class in
                the future.
                2. Problem's methods have been moved into another
                interface, "SimpleProblemForm".  Problems will now have
                Problem Forms which they implement.  This permits us to
                have different kinds of evaluation methods (for single
                evolution, coevolution, etc.)  The Evaluator involved
                is responsible for checking to make certain that the
                correct Problem Form is being used.
                3. The evaluate(...) and describe(...) methods no longer
                pass in an array of individuals; instead they pass in a
                single individual.
                
            The net result of this is that you will have to modify your
                Problem subclasses so that they implement
                ec.simple.SimpleProblemForm, and so that they do not go
                through the individuals passed in one by one and evaluate
                them, but rather just evaluate a single individual.  This
                generally means you just remove an outer for-loop (at
                least that's what I had to do for all the demo examples).
                
            Affected classes (besides your own Problem subclasses):
                SimpleProblemForm (new)
                Problem
                GPProblem
                SimpleEvaluator
                SteadyStateEvaluator
                Ant
                Edge
                Lawnmower
                Multiplexer
                multiplexerslow.Multiplexer
                Parity
                Regression
                TwoBox
	
	And now for stuff that doesn't have to do with Island Models or
	Coevolution or Competitive Fitness:

	MersenneTwister and MersenneTwisterFast now have a new nextLong(long)
		method so you can get longs up to a certain size.  It's not
		nearly as efficient as the nextInt method, as you might guess.
	ParameterDatabase now has the methods getLongWithMax and 
		getLongWithDefault.  One set of getLong(...) methods has been
		deprecated.  This gets getLong...(...) in-line with the getInt
		methods.
	A new package, vector, has been added for simple GA individuals.
		This package may be modified heavily, don't rely on it to be
		forward-compatible with future versions.
	A new package, rule, has been added for simple rule-based individuals.
		This package may be modified heavily, don't rely on it to be
		forward-compatible with future versions.
	Individuals now have a size() method, which provides a hook for
		parsimony pressure techniques.
	The ParameterDatabase itself has a new global parameter,
		print-params,
		which if true will print parameters as they are grabbed
		from the database through the various get() methods.
		Printing is done through stderr, not logged.
	ec.Evolve has been updated to provide new parameters which list
		all the parameters NOT used or NOT accessed (so you
		can see if you misspelled something and it's being ignored,
		for example).
        Fitness has been tweaked a little bit to allow the fitness() function
                to return ANY value between 0.0 and infinity, rather than the
                previous form (between 0.0 and 1.0).  This isn't a problem
                for fitness-proportionate selection methods because they use
                the distribution mechanisms, which autonormalize.  However,
                it necessitates changing SimpleFitness so that you now have
                to *specify* whether or not something is the ideal fitness.
                This may require a tiny rewrite in those apps which use
                SimpleFitness.  KozaFitness isn't affected because it's defined
                to have the ideal at 0.0.  MultiObjectiveFitness still defines
                its fitnesses as arrays from 0.0 to 1.0 inclusive -- if you
                need them to go to infinity as well, let us know.
        KozaFitness has deprecated its setFitness() function -- now you should
                instead use the better-named setStandardizedFitness().
        Some changes in how breeding pipelines operate:
                1. if generateMax is true, then MultiBreedingPipeline will 
		   return *exactly* the maximum typical number.  Previously
		   the pipeline returned a value between the maximum typical 
		   number and the maximum requested.
                2.  The typicalIndsProduced() method has been modified in all
		    the breeding pipelines.  Instead of returning 1 (for 
		    mutation) or 1 or 2 (for crossover), it now operates as
		    follows:
                        A. Mutation and Reproduction pipelines return the 
			   typical number of individuals returned by their 
		   	   sources.  Thus they no longer force their sources 
			   to return 1 individual apiece.
                        B. Crossover pipelines return the minimum typical number
                           of individuals returned by their sources.   Thus they
                           no longer force their sources to return 1 or 2 
			   individuals.
                    This change was made to make it easier to tack a mutation 
		    pipeline onto a crossover pipeline without losing 
		    individuals.
		3. Buffered and Force Breeding pipelines still work as normal
		Hope this doesn't break anything! Most of this will not make 
	        any difference, because selection methods typically return 1
		individual apiece anyway, which gets bubbled up through the 
		pipelines.  
	Added the Uniform and RandTree tree-generation algorithms.
	A Makefile is now provided.
	Added the app/ecsuite and app/sum examples for the Vector package

7 	Sixth prerelease
	Added SimpleShortStatistics	
	Modified Statistics to be a Clique, so you can have multiple statistics
		in tree arrangement.  If you have subclassed SimpleStatistics,
		you may want to modify your code to subclass from Statistics
		instead.
	Converted KozaStatistics to be a subclass of Statistics, not 
		SimpleStatistics
        Converted KozaShortStatistics to be a subclass of Statistics, not 
		SimpleStatistics
	Fixed a serious bug in the IslandExchange which causes it to not 
		connect to the correct topology.  
	Changed "nr-dest" to "num-dest" in InterPopulationExchange.
	Removed the "id" parameter in InterPopulationExchange (wasn't being 
		used).
	Updated and fixed the documentation for IslandExchange and 
		InterPopulationExchange.
	Added ABOUT.MacOSX
	Added a textual version of the license in LICENSE

8	Seventh prerelease
        All Individuals now must have a method called deepClone(), which 
                guarantees a deep clone of the individual.  This is done
                by default by doing a protoCloneSimple(), though if protoClone
                normally light-clones, deepClone() should be overridden.  This
                is done already in GPIndividual, and GPTree now sports a
                deepClone() method as well.  ec.gp.koza.ReproductionPipeline
                has been retrofitted to use deepClone(), just for the heck
                of it.  Best-of-generation now uses deep cloning to hang onto
                its individual and guarantee that its fitness doesn't change.
                Affected classes:
                    Individual, GPIndividual, GPTree, SimpleStatistics,
                    SimpleShortStatistics, KozaStatistics, KozaShortStatistics
        Removed best_of_generation from SimpleShortStatistics and
                KozaShortStatistics.  best_of_generation has long been
                supplanted by best_of_generation_a, and was dead code.
	Modified the island model parameter file examples so that they provide
		different initial seeds to different islands -- oops!
	Fixed CHANGES to be 80 columns
	ECJ now prints out seed and thread information
	Modified the island model parameter file examples so that they use
		8999 as the server port and 9000 and up for the client ports;
		each client island parameter file now specifies a unique client
		port, it was too much of a hassle having to specify the port
		on the command line every time to just test the system on a
		single machine.
	ecsuite no longer uses a ForceBreedingPipeline -- this is unneccessary
		because recent changes in Mutation pipelines has them returning
		all the individuals they receive from children rather than just
		1 (we were using a ForceBreedingPipeline to force the Mutation
		pipeline to return 2 kids, which it does anyway now)
	Modified ABOUT.MacOSX to add the trick where if you do -Xincgc you get
		much faster evolution runs
        Methods previously using ec.gp.koza.KozaFitness.setFitness() now instead
                call ec.gp.koza.KozaFitness.setStandardizedFitness() (the first
                method has been deprecated).  Accordingly, the sample domains
		now use setStandardizedFitness().
        Removed the numbits package
        BreedingSource had its produce(...) method incorrectly stated as having
            final int max, final int min.... instead of the other way around.
            No methods actually implementing or using BreedingSource did it this
            way however (it was a typo), so it's been fixed to be min first,
            then max.
	ParameterDatabase can now print out parameters as they're requested.
            Simply say:		-p print-params=true
	Fixed some bugs in the es package which were causing it to crash.
	    Also, es now uses es.mu.N to specify the mu value for subpopulation
	    N.  Additionally, the es.params file has been modified to make it
	    cleaner and easier to follow.
        Modified ABOUT.MacOSX to note that Apple has fixed the hostname bug
            in OS X 10.1
        Added VectorGene and GeneVectorIndividual to the vector package.
        Fixed bugs in the FloatVectorIndividual and DoubleVectorIndividual
            (they were being cast to IntegerVectorIndividual, which would
            cause a crash during equals(...)).
        Deleted RuleSetConstraint.java
        In GPNode's comments, oldSubtree and newSubtree were accidentally
            reversed.  That has been remedied.
        Modified TournamentSelection so that you can now specify a tournament
            "size" between 1.0 and 2.0 (floating-point), which results in a
            tournament of size 2 where the "better" individual wins with a
            probability of size/2.  Accordingly, TournamentSelection no longer
            permits a default size -- you *must* specify one.
        Added a ReproductionPipeline to ec.breed.  This pipeline relies on the
            new Individual.deepClone()... method.  Consequently, other
            ReproductionPipeline classes have been deprecated.
        Changes were made to better support steady state evolution:
            1. BreedingPipelines now support SteadyStateBSourceForm
            2. Major rewrite of SteadyStateEvolutionState, SteadyStateBreeder,
               and SteadyStateEvaluator to handle statistics better.
            3. Added an optional SteadyStateStatisticsForm
	    4. Added a new Statistics object: KozaSteadyStateStatistics
        A bug was fixed in SteadyStateEvaluator: it doesn't count the first
            population's individuals in the generation count.  This is remedied
            by updating the generation count by the generation size after the
            first evaluation.
        Modifications were made to the documentation of Statistics indicating 
            that when and if Statistics hooks are called is entirely up to the
            EvolutionState object, so you should make sure your Statistics 
            object is compatible with it.
        Slight modification to FitProportionateSelection documentation.
        BufferedBreedingPipeline, ForceBreedingPipeline, and 
            MultiBreedingPipeline weren't necessarily cloning their individuals.
            Now they are more careful!
        GenerationSwitchPipeline added.  This pipeline switches children at some
            generation.  Useful for some adaptive mechanisms.
        Added Tutorial 1
        Fixed an inifinite-loop bug in BufferedBreedingPipeline
        Fixed some equality bugs in IslandExchange noted by jlint
        Fixed a minor output verbosity bug noted by jlint
        Little syntactic tweaks (no bug fixes) to make jlint happier
        jlint makes numerous other complaints, but I've verified that they're
            not significant.  To whit:
            1. complaints about null references are due to jlint not 
               understanding that state.output.fatal() and 
               state.output.exitWithErrors() will exit the program.
            2. array index out-of-bounds complaints are because I will subtract
               1 from a value to get the array index sometimes; that's just 
               fine.
            3. complaints about "volatile" access are because multiple threads 
               in ECJ make simultaneous access to read-only protocol areas of
               the program, which is fine.
            4. synchronized complaints are specious
            5. Complaints about Mersenne Twister bugs are all false -- I've
               double checked.  It looks like an error in jlint's understanding
               of how >> works.  BTW, it also complains about java.util.Random
               in the same way. :-)
        Minor efficiency change: CrossoverPipeline (line 325) used to avoid
               verifying points only when the second parent was tossed; now we
               also do it if there's only one individual to create.  Should have
               no change at all on the system.
        CrossoverPipeline.parents made public, CrossoverPipeline.verifyPoints
               moved from private to public final
	Added Koza Quintic and Sextic problems to Regression
        Fixes to elitism code -- SimpleBreeder wasn't preserving all the elites,
               and also wasn't deep-cloning them.  Thanks to garij8l0@elon.edu
        RuleSetConstraints and RuleConstraints serialize properly, oops
	Made a few static constants final that we had not noticed.
        Fixed reset bug in GeneVectorIndividual.
	(Finally) changed the nostore parameter to store (and flipped the
               meaning)
        Individuals now contain a pointer to their species.  readIndividual(...)
               should not try to "read" in the species, nor should
               printIndividual(...) attempt to "print" the species to the
               stream.  Species should be careful to set the prototypical 
               individual's species to themselves BEFORE calling setup(...) on
               the prototypical individual.
        MAJOR OVERHAUL OF VECTOR PACKAGE.  Sorry, it had to be done.
               VectorIndividuals previously were carrying around lots of baggage
               (like genome size, mutation probabilities, crossover types, etc.)
               that should be shared among individuals.  So now they store this
               information in their shared VectorSpecies.  Accordingly, there 
               are different VectorSpecies subclasses for different data type 
               groups.  An individual can access this data now because 
               Individuals have pointers to their species (see above) now.
        VectorIndividuals can now have a min/max constraint on their genes OR
               individual unique min/max constraints on each separate gene. 
        Deleted old MacOSX 10.0.x stuff from About.MacOSX
	GroupedProblem changed to an Interface called GroupedProblemForm
	Removed ec.gp.koza.ReproductionPipeline and
		ec.rule.breed.RuleReproductionPipeline and
		ec.vector.breed.VectorReproductionPipeline since they 
		all duplicate ec.breed.ReproductionPipeline
	simple.params now states that the default fitness for subpop 0 is
		ec.simple.SimpleFitness
	ec.params now has duplicate-retries set to 0
	when seeds=time, ec.Evolve makes sure the seeds are all different from
		each other.
	Added tutorial 2
	Fixed small bug in CompetitiveEvaluator (sometimes the number of games
		for individuals in two-way random tournaments were mixed).
		Thanks to Flavio Baronti <f.baro@libero.it> for alerting us.
	Fixed a bug in the Statistics files that altered the best_of_run
		individual being properly calculated in the multiple
		population cases. Thanks to Krzysztof (Chris) Krawiec for
		alerting us.
	Added the parsimony package. This package contains various simple
		parsimony pressure techniques we've been using.
	Added the teambots package.

9	Eighth Prerelease
	Well, it looks like ECJ usage is really taking off, given the rate
		of bug reports.  :-)
	Fixed a bug in IntegerVectorSpecies and FloatVectorSpecies that did
		not properly set the min and max gene values on a per-gene
		basis. Thanks to Emanuel Slaby <Emanuel.Slaby@unibw-hamburg.de>
	Fixed a minor bug in ec.util.Output that might cause it to try to
		get the value of the announcements vector even if the vector
		is null.  Thanks to Mohamad Mehdi Haji <m2haji@yahoo.com>
	Added the ability to specify an integer Parameter value in hex
	Bug fix in PTC2, not using the right distributions when doing strong
		typing.  Doesn't affect typeless runs.  Thanks to David
		Chan <dmchan@stanford.edu>
	KozaStatistcs now does printIndividualForHumans rather than
		printIndividual -- not sure when it had reverted there.
	SteadyStateBreeder had a serious bug that prevented individuals from
		getting evaluated -- this resulted in statistics that didn't
		converge (They stayed perfectly flat), so it was pretty
		obvious.  Nailed down thanks to a mention of oddities from
		Atif Azad <atif.azad@ul.ie>
	SteadyStateBreeder now lets the deselector know that an individual has
		been replaced.
	The IslandExchange server now announces that it's shutting down -- it
		only does so if all the clients have disconnected.
	Vector package includes evaluated: line in its readers and writers
	Tutorials 3 and 4 added
	Minor print bug removed form DoubleIndividual and FloatIndividual
	Small bugs fixed in island model
	SPEA2 package added (thanks to Robert Hubley!)
