Open BEAGLE Change Log

3.0.3:                                                          (29/11/2007)

- Fix bug in reading GP ephemeral random constants                      (CG)

  Due to a wrong signature, method GP::EphemeralT<T>::readWithContext was
  not properly called for reading a GP ephemeral random constant from a XML
  file. (Thanks to Bartek)

3.0.2:                                                          (14/11/2007)

- Updated to PACC 1.3.1                                                 (CG)

- Conditional compilation of code in 'tests' directory                  (CG)

  Compilation of code in 'tests' directory is now disabled. It can be
  enabled through option '--enable-tests' to the configure script. This
  should reduce the compilation time for users, which are generally not
  interested in compiling these various tests.

- Modification to build system for fast compilation on Unix             (CG)

  Heavy use of templates conjugated to division of code in several
  independent .cpp files generate long compilation time on g++ and similar
  Unix compilers. The modification allow building library from a single
  .cpp file that includes other relevant source files used to generate the
  library such that compilation time is reduced by a factor 5.

- Bug fix in reading method name for class GP::EphemeralT<T>      (CG + JFD)

  A change of reading method name in the interface of class GP::Primitive
  was not propagated to class GP::EphemeralT<T>. This disabled correct
  reading of an ephemeral from a file, for example from a milestone.
  (Thanks to Jean-Francois Dupuis for spotting the bug.)

- Bug fix when reading a Beagle::Matrix from an empty string            (CG)

- Bug fix: OversizeOp's ratio now scales the population                 (MW)

  OversizeOp was previously increasing the deme size by DemeSize*Ratio.
  Now it makes the deme size equal to DemeSize*Ratio.  Also a special
  ratio of -1.0 was added that makes the deme size the same size as
  specified in 'ec.pop.size'.

- Bug fix: Fitness validity in TermMinFitnessOp and TermMaxFitnessOp    (MW)

  The two termination operators TermMinFitnessOp and TermMaxFitnessOp
  were not testing the validity of the individuals' fitness values.
  Validity of fitness values are now tested.

- Corrected inconsistance with hall-of-fame computation in knapsack     (CG)

  Configuration of knapsack have been modified for better computation
  of the Pareto hall-of-fame during the evolution. (Thanks to Bastien)

- Bug Fix: MilestoneWriteOp now handles exceptions during write()       (MW)

- Added commas to uint2ordinal() when num is 10,000 or more             (MW)

- Fix bug in standard STGP mutation operator                            (CG)

  Since the changes done in version 3.0.0, typed standard STGP mutation
  was not working properly, because of a change in the architecture of the
  GP initialization operators. (Thanks to Nicolas Navet)

- Altered parity example so that it matched Koza's work in GPII         (MW)

  Function set is now (AND,OR,NAND,NOR), as stated in GPII book.

- Maximum generation termination modified                               (CG)

  Termination of an evolution is no more deactivated with a maximum
  number of generation set to 0. This parameter value rather stop the
  evolution after the application of bootstrap operator set.

- Bug fix to support ADF without arguments                              (CG)

  Fixed GP::Invoker::execute to allow ADFs without arguments, without
  having to use a fake argument primitive.

- Correction to minimal bounds for real-valued GA and ES                (CG)

  Minimal bounds for real-valued GA and ES has been changed from DBL_MIN
  (1e-308) to -DBL_MAX (-1e308), which make more sense for usual
  unbounded real-valued optimisation problems.

- Bug correction and improved support for CMA-ES.                       (CG)

  An important  bug as well as some numerical rounding errors has been
  fixed in CMA-ES implementation. A new termination criterion specific the
  algorithm has been defined in order to interrupt CMA evolutions that has
  converged. Function MuWCommaLambdaCMAFltVecOp::operate has been separated
  into several smaller sub-functions, for modularity purposes. (Thanks to
  Olivier Teytaud, Sylvain Gelly, Nikolaus Hansen, and Anne Auger)

- Correction of randomizer reading/writing behavior                     (CG)

3.0.1:                                                          (11/10/2005)

- Several fixes to allow compilation on Mac OS X                   (CG + MP)

- Fixes in headers inclusion to allow precompiled headers               (CG)


3.0.0:                                                          (04/10/2005)

- Customizable allocator for STL containers                             (CG)

  Allocator used to instantiate elements of STL containers can be
  customized, in order to use an allocator different from the standard one.

- IndividualSizeFrequencyStatsOp statistics operator                    (CG)

  Statistics computation operator IndividualSizeFrequencyStatsOp has been
  implemented in order to display the different individual size
  frequencies over the evolutions. (Thanks to Matthew Walker)

- Methods to read individuals from files                                (CG)

  New convenient methods readFromFile have been added to classes
  Beagle::Individual and Beagle::IndividualBag in order to read individuals
  from XML files without having to set-up an evolutionary context.

- GP ephemeral value mutation operators                                 (CG)

  New ephemeral constants mutation templated operator
  GP::MutationEphemeralOpT, along with a specific instance for Double-typed
  ephemeral mutation class named GP::MutationEphemeralDoubleOp, have been
  added to the GP framework. These operators are useful to mutate the
  values contained in ephemeral random constant primitives.

- TSP example to illustrate integer vector representation               (CG)

  Addition of a new integer vector representation example, that is the
  Traveling Salesman Problem (TSP) solved by an indexed integer
  representation GA.

- Integer vectors representation                                        (CG)

  An integer vector representation is now part of the GA framework. Proper
  initialization, crossover and mutation operators has been defined, along
  with a genotype and evolver classes. A special case of the integer
  vector representation to contain a shuffled list of indices from
  0 to (n-1), where n is the size of the vectors, has been defined.
  Specific initialization, crossover and mutation operators has also been
  defined to use the integer vector as a list of indices.

- NSGA2Op modified for a parametrized number of children                (CG)

  The ratio of the number of children generated at each generation over
  the population size in the NSGA2 multiobjective replacement strategy
  operator can now be configured by parameter 'ec.mulambda.ratio'. This
  would allow an adjustment of the selection pressure at each generation.
  This is a generalization of NSGA2 as a multiobjective (mu+lambda)
  replacement strategy, common in the evolution strategy paradigm.

- Matrix and Vector classes inherit from their PACC-Math equivalents    (CG)

  Classes Beagle::Matrix and Beagle::Vector have been modified to inherit
  from their PACC-Math equivalents, PACC::Matrix and PACC::Vector.

- Migration of Beagle's inputs/outputs to PACC-XML facilities           (CG)

  Beagle XML parsing and streaming facilities have been replaced by the
  PACC-XML ones (which are simply a more mature version of them). The
  read* and write* methods present in almost every Beagle classes have been
  modified to comply with PACC-XML type and method names.

- Modified randomizer class                                             (CG)

  Beagle::Randomizer have been modified to inherit from PACC::Randomizer
  in order to minimize functionality overlaps. PACC::Randomizer is a
  different encapsulation of the Mersenne Twister random number generator.
  Beagle::RandomizerMersenne class has been removed and roll* methods
  have been changed from virtual to inline.

- ArrayT template                                                       (CG)

  New generic array type defined. The template inherits from both
  Beagle::Object and the std::vector template. Typedefs have been defined
  for basic C++ types as IntArray, UIntArray, DoubleArray, FloatArray,
  LongArray, BoolArray, ULongArray, ShortArray and UShortArray. Type
  IntegerVector have been replaced by the functionally equivalent UIntArray
  type.

- Whole system written in milestone files                               (CG)

  All system components are now written into milestone files. Register is
  now written as a part of the system.

- Modification to STGP support                                          (CG)

  STGP support in GP framework has been slightly modified. The typing now
  use directly the std::type_info information to compare node typing.
  For efficiency concerns, constrained initialization and crossover
  operators has been changed to select node of compatible typing instead
  of blindly trying different nodes. (Thanks to Graham Thomson)

- Dynamic configuration of primitive sets                               (CG)

  Primitive set composition can now be stated dynamically (without
  recompilation) into the configuration file.

- Evolutionary module acquisition support in GP framework          (MW + CG)

  Evolutionary module acquisition (Angeline and Pollack, 1993) is now
  supported as a standard GP feature. (Thanks to Matthew Walker)

- Refactored ADF mechanism, generic GP::Invoker class                   (CG)

  The mechanism for ADFs have been completely rewritten in a more generic
  fashion. Evolvable module acquisition, automatically defined iterations
  and such can now be relatively easily implemented over the GP::Invoker
  class.

- Small bug fix in GP::PrimitiveUsageStatsOp                            (CG)

  Primitive usage statistics didn't count the primitives of the first
  individual of each deme. (Thanks to Graham Thomson)

- Mechanism to interrupt GP individual execution                   (CG + MW)

  A new mechanism based on exception handling has been added to GP
  framework in order to interrupt the execution of GP individuals after a
  given number of nodes evaluation or when the time allowed is expired.
  If one of this criterion is reached, an special exception is thrown and
  must be caught in the GP fitness evaluation operator. New GP exception
  operators has been defined for that purpose. The maximum number of nodes
  and the time allowed is specified in the GP context used for the
  individual execution. (Thanks to Matthew Walker)

- Migration of project files to KDevelop 3                              (CG)

  KDevelop 3 is now part of the recent Linux distributions, so the
  different Open BEAGLE KDevelop project files have been migrated this
  new version.

- Dynamic ADF with variable number of arguments                    (MW + CG)

  Number of ADFs of the GP individuals can now be determined dynamically,
  by the initialization or mutation operators. ADFs can be added
  on-the-fly to a GP individual. The number of ADF arguments can also be
  dynamically stated and can change from an individual to another. A new
  ADFArgument type has been defined and should be used instead of simple
  TokenT variable (as it was done before). Constrained operators must
  also be used in order to generate valid individuals. (Thanks to Matthew
  Walker)

- Explicit association of GP trees to GP primitive set             (MW + CG)

  The association between GP trees and GP primitive set has been changed.
  Before, a given GP tree at the ith position in an individual was
  implicitly associated to the ith primitive set of the primitive super
  set. Now, the link between the two is explicit and relaxed, stated in
  an integer member of GP tree. There is no constraints on the associations
  possible between GP trees and GP primitive sets and there is no need to
  have as much primitive sets as there is GP trees in an individual (i.e.
  there could be only one primitive set available while having a variable
  number of GP trees in the individuals). (Thanks to Matthew Walker)

- Dynamic selection weight in primitive set                        (MW + CG)

  Selection weight of a primitive can now be stated dynamically, depending
  on the context. Method GP::Primitive::isSelectionWeightStable state
  whether, for a given number of argument, it is possible that the weight
  of the primitive can change. Method GP::Primitive::getSelectionWeight is
  used to generate the selection weight value in itself for the associated
  primitive, in the given context. (Thanks to Matthew Walker)

- Dynamic number of arguments for GP primitives                    (MW + CG)

  Number of arguments of GP primitives can now be stated dynamically, by
  properly over-defining method GP::Primitive::giveReference. Selection of a
  primitive in a primitive set has been changed, only one method
  (GP::PrimitiveSet::select) do all kind of selection, using special
  number of arguments values for selecting a primitive into all the branches 
  or all the primitives. (Thanks to Matthew Walker)

- GP primitives: GP::AbsT and GP::IfThenElseT                      (MW + CG)

  Two new GP primitives added, AbsT, which compute the absolute value of its
  argument, and IfThenElseT, a four-argument conditional primitive.
  (Thanks to Matthew Walker)

- Stack trace mechanism added to exceptions try/catching           (MW + CG)

  Method call trace mechanism added to follow function calls when Beagle
  exception is thrown but not caught. To trace a method call, the macros
  Beagle_StackTraceBeginM and Beagle_StackTraceEndM must be added
  respectively at the beginning and end of the method implementation. The
  call stack is displayed along with the error message by calling the
  method Exception::explain. All class methods of Open BEAGLE have been
  modified to have the Beagle_StackTraceBeginM/Beagle_StackTraceEndM
  macros surrounding them. (Thanks to Matthew Walker)

- Miscellaneous warning/error messages addition and improvements        (MW)

  Matthew slightly improved and added warning/error messages he encounters
  during its developments.

- System components                                                (MW + CG)

  Component map added to the basic evolutionary system (class System).
  A system component can be added dynamically to the system as a new system
  composing element with no need to extend/define a class specific to the
  problem/algorithm at hand. The logger, register and GP primitive super
  set have been re-defined as system components. (Thanks to Matthew Walker)

- Object::getName() method and NamedObject class                   (MW + CG)

  Method getName() added to class Beagle::Object in order to retrieve the
  name of any objects. Generic named object class added into the
  architecture. Several changes made in order to make specific named objects
  inheriting from the new generic named object class.
  (Thanks to Matthew Walker)

- Separation of log level parameter for console and file logging   (MW + CG)

  Log level is now separated for console and file logging. Two parameters
  ('lg.console.level' and 'lg.file.level') are now available to
  independently set the log level at the console and into a file. Parameter
  to disable/enable console logging have been removed from the system.
  (Thanks to Matthew Walker)

- Change format of GA::FloatVector                                 (CG + JS)

  Now use ';' instead of ',' to separate vector components in order to
  be consistent with Beagle::Matrix format. (Thanks to Jim Shepherd)

- Enhancement of DecimateOp operator                                    (CG)

  If value of parameter 'ec.decimation.ratio' is set to -1.0, DecimateOp
  operator will resize the population to the real size given in parameter
  'ec.pop.size'. This fix some problems encountered with the simultaneous
  use of ES and Distributed BEAGLE.

- Bug fix in GA::ESVector::read                                         (CG)

  Bug fix to allow reading of ES vector. The bug was caused by the use
  of double instead of float values in ES vector representation.

- Real-valued GA genotype values discretization                    (JS + CG)

  Real-valued GA genotypes values can be discretized by setting an
  increment on the possible values. For example, setting the increment of
  0.5 make the domain of possible value equal to ...,-0.5,0.0,0.5,1.0,... .
  (Thanks to Jim Shepherd)

- MutationGaussianFltVecOp: per-value setting for mu and sigma     (JS + CG)

  Mu and sigma parameters for MutationGaussianFltVecOp operator can now be
  set on a per-value basis, allowing to modulate the mutation effect
  for the different parameters composing the float vectors.
  (Thanks to Jim Shepherd)

- Bug fix in Matrix::tql2                                               (CG)

  Index out-of-bound bug fix in method Matrix::tql2, used to compute
  eigenvalues and eigenvectors.

- Bug fix in method Matrix::extract                                (CG + MP)

  Bug fix when extracting a sub-matrix from another matrix.

- Added InvalidateFitnessOp class                                       (MW)

  Fitness value for all the individuals of a deme can be invalidated by
  adding the operator InvalidateFitnessOp to the evolver's main-loop.
  (Thanks to Matthew Walker)

- Bug fix in GP::MutateSwapSubtreeOp                                    (MW)

  Silly bug in GP::MutateSwapSubtreeOp fixed. (Thanks to Matthew Walker)

- Added GP::ValidateOp class                                            (MW)

  Operator GP::ValidateOp check the validity of constrained GP trees and
  report any invalid trees, which is useful for debugging.
  (Thanks to Matthew Walker)

- Added GP::Tree::fixSubTreeSize()                                      (MW)

  Method GP::Tree::fixSubTreeSize() fix the sub-tree member of a GP::Node
  after a GP::Tree alteration. (Thanks to Matthew Walker)


2.2.0:                                                          (28/10/2004)

- Fix to compile with gcc 3.4                                      (LS + CG)

  Bug fix in files AbstractContainerAllocT.hpp and VivariumAllocT.hpp
  to allow compilation with gcc 3.4. (Thanks to Laurent Steffan)

- SBX float vector crossover added                                      (CG)

  Operator for simulated binary crossover (SBX) (of Deb and Beyer) added
  for float vector representation.

- CMA-ES implemented for float vectors representation                   (CG)

  CMA-ES (of Nikolaus Hansen et al.), one of the most powerful evolutionary
  algorithms for real-valued parameters function optimization, has been
  implemented for float vector representation. The algorithm can be used
  in any float vector problems, by specifying the use of the
  GA-MuWCommaLambdaCMAFltVecOp replacement strategy and the
  GA-MutationCMAFltVecOp mutation. See sample configuration file
  "maxfctfloat-cmaes.conf" of the maxfctfloat example for an usage
  illustration.

- Improved replacement strategy operators                               (CG)

  NSGA2Op, MuCommaLambdaOp and MuPlusLambdaOp replacement strategy
  operators have been improved to be used without evaluation operators in
  the breeder tree. This will allow to use these replacement strategy
  operators with special evaluation operators that can't be in a breeder
  tree, such the ones of Distributed BEAGLE or the co-evolution framework.

- RandomizerNR class removed                                            (CG)

  Due to some concerns on the licensing policies of the code presented in
  the book "Numerical Recipes in C", the random number generator class
  RandomizerNR (which correspond to the routine rand1 of NR book) has been
  removed.

- Improved float vector blend crossover (BLX-alpha)                     (CG)

  Blend crossover for float GA and paired ES has been updated to be conform
  to BLX-alpha crossover of Eshelman and Schaffer.

- Per-value range limits in GA framework                      (JS + CG + DS)

  Float GA and paired ES now includes a range limit for each parameters
  composing the individuals, instead of a global minimum and maximum.
  (Thanks to Jim Shepherd for the code and David Stocks for the suggestion)

- GA individual initialization operations limited to one genotype       (CG)

  To ease the use of the GA framework, initialization operators are now
  limited to generate individual with one genotype (bit string, 
  float vector or ES-pair vector). GA examples have been updated 
  accordingly.

- New Matrix and Vector classes for basic numerical computations        (CG)

  New classes Matrix and Vector are added with support for basic linear
  algebra operations plus some special operations for the computation of
  matrix inverse, determinants, and eigenvalues/eigenvector.

- Bug fix in the autoconf configuration of all examples            (MD + CG)

  (Thanks to Marc Dubreuil)

- Minor bug correction for compiling full debug                         (CG)

  Small bug fix at line 185 of file HierarchicalFairCompetitionOp.cpp to
  allow compilation in full debug mode. (Thanks to David Stocks)

- Changes in log outputs given by the evolver                           (CG)

  Log outputs given by the evolver such as "Evolving the 1st deme for
  generation 6" have been changed to avoid writing the generation
  number. This change is necessary as there was confusion about generation
  number given by the evolver vs the statistics for Distributed BEAGLE
  applications.

- Primitive usage statistics operator                              (MW + CG)

  Operator named GP::PrimitiveUsageStatsOp that compute usage statistics
  of each primitives in GP trees and display the results in the logs.
  (Thanks to Matthew Walker)


2.1.5:                                                          (03/08/2004)

- Re-writing of hierarchical fair competition operator                  (CG)

  The HFC migration operator has been rewritten in order to use adaptive
  fitness thresholds to migrate individuals from one deme to another,
  instead of using unconditional migration policy.

- Major change in deme migration mechanism                              (CG)

  A migration buffer has been added to the deme structure. This buffer
  should now be used by all migration operators to move individuals
  between demes. The migration buffer in deme is written in milestone
  files, which allow reproduction of multiple demes evolutions.
  MigrationRandomRingOp operator updated according to this change.

- Random number generator now initialized with /dev/urandom on Unix     (CG)

  Seed of random number generator is now taken from system device
  /dev/urandom on Unix, when available.

- Bug fix in Beagle::MigrationRandomRingOp                              (CG)

  Migration buffer in migration random ring operator was not checked to be
  emptied when starting a new evolution with a given evolver.
  (Thanks to Michel Fortin and Leila Dridi)

- Bug fix in GA::BitString::convertGray2Bin                             (MF)

  Bug fix in computation for the conversion of Gray code to binary code.
  (Thanks to Michel Fortin and Leila Dridi)

- Bug fix in statistics computation operator                            (CG)

  Statistics calculation operator now computes vivarium statistics
  only when all demes of a generation have been processed, with no
  assumption on the order of the demes. This fix is necessary as
  Distributed BEAGLE server send demes out-of-order to evolver clients. 

- Genotype/phenotype distance measure methods                           (CG)

  Two methods have been added to Beagle::Individual to compute distance
  between two individuals in genotype and phenotype space:
  getDistanceGenotype and getDistancePhenotype. These methods are
  implemented by throwing an exception; they must be over defined by the
  user for his application. (Suggestion of Jianjun Hu)


2.1.4:                                                          (04/07/2004)

- Hierarchical Fair Competition (HFC) operator                          (CG)

  HFC operator inspired by the work of Hu and Goodman. The operator is
  actually implemented as a migration operator that is at the same time a
  replacement strategy. The breeder tree of the replacement strategy is
  called to generate the new individuals. 

- InitializationOp now a breeder operator                               (CG)

  Abstract initialization operator now inherits from BreederOp, to enable
  using it in breeder trees. The operator can be used pretty much like a
  selection operator, as a leaf in a breeder tree that generate new
  individuals. The breeding probability is the reproduction probability.

- Comments in XML output of configuration dump or milestone write       (CG)

  Comments in XML files when writing a configuration dump or a
  milestone.

- Lexicographical parsimony pressure tournament selector operator       (CG)

  New selection operator based on tournaments selection, breaking ties by
  selecting the smallest individual.

- getSize() methods added to Individual and Genotype classes            (CG)

  getSize() method added to Individual, Genotype, GA::BitString,
  GA::FloatVector, GA::ESVector and GP::Tree classes. Return length for
  genotype representation and total length composing an individual.

- Random shuffle deme operator                                          (CG)

  New operator to random shuffle individuals in a deme. Useful for
  micro GA-like evolution with Distributed BEAGLE.

- Weights to modulate primitives selection in GP primitives sets        (CG)

  Primitives inserted in primitives set now get a weight that module
  the importance of being selected during initialization and mutation.
  Higher a weight value, higher chances are for the associated primitive
  to be selected. Default weight value is 1.0.

- Bug fix in Pareto Hall-of-Fame update methods                         (CG)

  Small index bug made update methods of Pareto hall-of-fame incorrect.

- Coev::TermBroadcastOp termination operator                            (CG)

  Termination criterion to broadcast and receive termination criterion
  notices between threads when doing co-evolution.

- Enhanced message of casting exception in Individual::operator=        (CG)

  Message thrown when fitness types mismatch during an individual
  copy has been enhanced to help users figuring out the problem.
  (Thanks to Matthew Walker)

- Bug fix in Register::interpretArgs                               (CG + MW)

  Remove a test that throw an exception when a parameter value on the 
  command-line is empty. (Thanks to Matthew Walker)

- Bug fix in GP::Tree                                                   (MW)

  Small typo in interpret() method. Only showed up with Beagle configured
  with --enable-full-debug.


2.1.3:                                                          (13/04/2004)

- Bug fix in GA::CrossoverUniformOpT and GA::EvolverES                  (CG)

  Small bug fix in constructors of GA::CrossoverUniformOpT and
  GA::EvolverES.


2.1.2:                                                          (08/04/2004)

- Support for pre-compiled headers on MS Visual C++ .NET                (CG)

  Pre-compiled headers are now generated when compiling the libraries on
  MS Visual Studio C++ .NET. This can speed-up significantly compilation
  time.

- New method to get document root tag in XMLParser                      (CG)

  Method XMLParser::getRootTagNode() has been added to conveniently allow
  the user to get access the document root tag node in one line of code.

- Robust reading of unknown parameters in register file                 (CG)

  When reading a register file, when a unknown parameter is met in a
  configuration file, the new policy is to log a warning message,
  instead of throwing an exception.

- Bug fix in Beagle::WrapperT<T>::read                                  (CG)

  Reading a wrapped value from a empty XML node doesn't change the value
  of the wrapped value. This causes problem for the type Beagle::String,
  where an empty XML node means an empty string value. The read method
  is now changed to assign the default constructor value the wrapped value
  when reading it from an empty XML node. (Thanks to Matthew Walker)

- Functions for searching in XML trees                        (MW + CG + MP)

  Two functions XMLNode::find have been added to search for a given node
  type and value in an XML tree. (Thanks to Matthew Walker)

- Update of Threading module and XMLNode class                     (MP + CG)

  Module Threading has been updated and several methods to modify XML
  tree has been added in class XMLNode, according to the changes made in
  Marc Parizeau's classes.

- CrossoverBlendESVecOp operator added                                  (CG)

  This operator implements a crossover operation for ES vectors where the
  offsprings are on a random position on the line connecting the values
  of the parents' values and strategy parameters.

- File renamed when in the way of an Open BEAGLE file                   (CG)

  If a file with the same name of a milestone, configuration or log file
  that is going to be written to disk, the existing file is renamed by
  appending an '~' to the filename. This allow some kind of backup
  mechanism for existing files, avoiding undesired file deletion. 

- Support for gzipped milestone / configuration files                   (CG)

  On platforms where a zlib installation is detected (most modern Linux
  distributions include it), support for reading gzipped milestone /
  configuration files is provided. Milestones are now gzipped when
  written on disk. Parameter "ms.write.compress" allows to disable
  milestone compression. Windows users most have zlib installed on their
  computer and set preprocessor flag BEAGLE_HAVE_LIBZ in header
  config.hpp to make use of this feature.

- Method to sort hall-of-fames in the descending order                  (CG)

  Method HallOfFame::sort() has been added to sort hall-of-fames
  in the descending order.

- Method Logger::terminate() to close logger                            (CG)

  Method Logger::terminate() added to manually close a running logger.

- DecimateOp and OversizeOp operators added.                            (CG)

  Two new operators have been added: DecimateOp and OversizeOp.
  DecimateOp shrinks the population by resizing to a ratio of the original
  population size, keeping only the best individuals of the original
  population. OversizeOp oversizes the population, using a breeder tree
  to generate the new individuals. These two operators allow 1) a new way
  to implement (mu+lambda) ES and 2) the implementation of a decimation
  operation similar to the one described in Koza's GP1 book.

- Aliases for statistics computation of minimization fitnesses          (CG)

  Aliases for statistics computation operators have been defined for
  minimization fitnesses measure. This allow, for example, to use
  "StatsCalcFitnessSimpleMinOp" operator (aliased to operator
  "StatsCalcFitnessSimpleOp") in conjunction of fitnesses of type
  "FitnessSimpleMinOp".

- Configuration dumper changes                                          (CG)

  Small change to allow parameter "ec.conf.dump" to be in parameter file
  with no value, without doing a configuration dump.

- Bug fix when parsing of big XML files                                 (CG)

  There was risk of stack overflow during the destruction of big XML trees.
  The problem was that in the destruction of a XML node, the destructor of
  the first child and next sibling node is called recursively
  until the leaves are reached. The destructor is now more intelligent by
  looping into children and siblings in order to avoid stack overflow.

- Validity attribute added to fitness and stats XML representation      (CG)

  An attribute named "valid" is added to fitness and statistics
  representation. If the value of the attribute is "no", the fitness or
  statistics read is considered invalid, and so the content is not read.

- Default constructor for specialized evolvers added                    (CG)

  Default constructors of specialized Evolver classes now have a default
  constructor that add the flavor-specific operators without setting
  the bootstrap and main-loop operator sets.


2.1.1:                                                          (17/01/2004)

- Several small changes to compile on gcc 2.96.                         (CG)

- StatsCalcFitnessKozaOp class scoped in GP namespace                   (CG)

  This class was misplaced into Beagle namespace while it should be scoped
  into namespace Beagle::GP.

- Small changes in file format                                          (CG)

  Small changes are made in for file format. More specifically attribute
  "mutdistribpb" renamed "distribpb" in operator CrossoverUniformOp, and
  type of genotype for ES, renamed "esvector" instead of "ESVector".
  Backward compatibility has been retained with old name. Attribute "size"
  in four standard genotypes is now optional, the same for attribute
  "depth" of GP tree genotype.

- Bug correction for multiobjective domination computation              (CG)

  Bug fix for Pareto domination computation. When comparing multiobjective
  fitness measure A with B, fitness A was said not dominated by B in the
  case where some objective values of A are equal to those of B, but none
  objective values of A where greater than B.

- Bug correction in spambase example                                    (CG)

  Primitives in spambase example still used symbol as name. This cause
  problem with new GP tree XML format, especially for LessThan primitive
  which was using "<" symbol.


2.1.0:                                                          (11/12/2003)

- Move to MS Visual .NET 2003 solution and project files                (CG)

  Solution and project files for MS Visual Studio .NET are now generated
  using version 2003, in opposition to version 2002 which was used
  previously. Forward compatibility is not a practise at Microsoft, so
  you probably need to pass to 2003 to use the solution and project files
  provided. But, it is still possible to regenerate these files for
  VS.NET 2002. Sorry for the problems that this might cause to Windows
  users, but the VS.NET installation in my lab is now fully 2003.

- Evolution strategy example: function maximization                     (CG)

  Usual GA function maximization example is implemented with ES as example
  'maxfctes'.

- Evolution strategy support added to GA framework                      (CG)

  Simple support for Evolution Strategy (ES) is added in the GA framework.
  ES genotype, implemented in class GA::ESVector, is defined as a vector of
  (value,strategy) pairs, where 'value' is the real value of the optimized
  value, and 'strategy' is the mutation strategy parameter. A simple ES
  mutation operator is defined in class GA::MutationESVecOp along with an
  ES evolver. Generic GA crossover operators have also been adapted to ES.

- Bug fix in RandomizerMersenne::rollUniform                            (CG)

  There was a bug in method RandomizerMersenne::rollUniform, when the lower
  bound was not 0. (Thanks to "Graamone")

- Seeding population from file                                     (CG + AM)

  Seeding population from file code added in basic initialization
  operator. File containing seeds is specified by parameter
  "ec.init.seedsfile". (Thanks to Andrew Marek)

- New termination criterion operators                                   (CG)

  Three new termination criterion operator classes added. TermMaxEvalsOp:
  interrupt evolution after the given number of fitness evaluation is done.
  TermMaxFitnessOp: interrupt evolution when an individual has a fitness
  value higher or equal to the given value. TermMinFitnessOp: interrupt
  evolution when an individual has a fitness value less or equal to the
  given value.

- Pareto front hall-of-fame                                             (CG)

  ParetoFrontHOF, Pareto front hall-of-fame class. Compute the Pareto front
  of solution for multiobjective EA populations. ParetoFrontCalculateOp:
  operator to compute Pareto front of population just before milestone
  writing. This operator must be in evolver's operator set between
  termination criterion operators and MilestoneWriteOp.

- Co-evolution example: co-evolutionary symbolic regression        (JW + CG)

  A two populations competitive co-evolution example, with a first population
  of training set samples, and the second population of symbolic expressions.
  Based on the paper "Methods for Evolving Robust Programs" of Panait and
  Luke. (Mostly done by Jiachuan Wang)

- Changes in population constructors signatures                         (CG)

  More coherent constructor signatures are used. Classes affected are:
  Individual, Deme, Vivarium, GP::Individual, GP::Deme, GP::Vivarium,
  IndividualAlloc, IndividualAllocT, DemeAlloc, DemeAllocT, VivariumAlloc,
  and VivariumAllocT.

- Real-valued GA example: function maximization                         (CG)

  Usual GA function maximization example is implemented with for real-valued
  genotypes as example 'maxfctfloat'.

- Support for real-valued GA in GA framework                            (CG)

  Basic real-valued GA fixed length genotype is added to the GA framework.
  The following classes have been added to the distribution:
  CrossoverOnePointFltVecOp, CrossoverTwoPointsFltVecOp,
  CrossoverUniformFltVecOp, CrossoverBlendFltVecOp, EvolverFloatVector,
  FloatVector, InitFltVecOp, MutationGaussianFltVecOp.

- New GA crossover operators                                            (CG)

  Two generic crossover operators has been added for vector-based EC:
  two-points crossover and uniform crossover. Generic version of these
  operators are defined as templates, while specific specialization of these
  algorithms is defined for bit string and real-valued GA. Generic
  implementation of one-point crossover, which was already available for
  bit string GA is also given.

- Major changes in GA framework                                         (CG)

  Major changes happened in GA framework to allow future extension from a
  simple bit string based GA to a more generic vector-based EA framework,
  with support for bit string GA, real-valued GA, ES, and possibility to
  extend to other types of vector-based EAs, including variable-length ones.

  Changes include:
    CrossoverOp      --> CrossoverOnePointOpT and CrossoverOnePointBitStrOp
    MutationOp       --> MutationFlipBitStrOp
    InitializationOp --> InitBitStrOp
    Evolver          --> EvolverBitString
    GA::Individual   --> removed
    GA::Deme         --> removed
    GA::Vivarium     --> removed

- Default GP fitness class changed                                      (CG)

  Default GP fitness measure changed from the overly complicated
  GP::FitnessKoza class to the less confusing FitnessSimple class. New
  computation statistics is added to GP framework, to compute statistics on
  both simple fitness values and GP trees depth and size. GP examples and
  configuration files have been updated accordingly.

- Co-evolution example: two-populations iterated prisoner's dilemma     (CG)

  Example two-populations iterated prisoner's dilemma, implemented with
  3 bits bit strings, is added to illustrate co-evolution and Parizeau's
  multi-threading classes.

- Multiple populations co-evolution basic support                       (CG) 

  Multiple populations co-evolution basic support is added with a
  multi-thread-ready evaluation operator. The approach used need to
  associate each co-evolving populations to a specific thread, and to do 
  the evaluation operation by "mating" the evaluation sets of the different
  populations/threads. The OS specific multi-threading calls are encapsulated
  by using Marc Parizeau's multi-threading classes, included in the
  co-evolution framework. Parizeau's threading classes run on Win32 and
  POSIX compliant Unix flavors, which includes Linux, Mac OS X, and Solaris.

- GA multiobjective example: Multiobjective 0/1 knapsack                (CG)

  Multiobjective 0/1 knapsack example illustrates the use of multiobjective
  EA with GA.

- Multiobjective fitness and selection methods                          (CG)

  Two multiobjective fitness measures have been added to the framework:
  FitnessMultiObj and its minimization companion FitnessMultiObjMin. Two
  multiobjective selection operators have been added: NSGA2Op, implementing
  the NSGA-II MOEA selection algorithm as a breeder's replacement strategy,
  and NPGA2Op, implementing the NPGA-II MOEA selection algorithm in a
  standard selection operator.

- Improved configuration file support with libtool                      (CG)

  The search path has been improved to correctly find configuration
  files when debugging or executing Open BEAGLE binaries dynamically linked
  using libtool.

- Example binaries *-debug removed                                      (CG)

  To reduce confusion and disk space, statically linked example binaries
  (named *-debug) are removed from the autoconf/automake configuration.

- Bug correction in statistics computation operators                    (CG)

  A computation bug with statistics computation operators of demes of
  size 1 has been fixed. (Thanks to Jianjun Hu)


2.0.0:                                                          (24/09/2003)

- LVSN contact address added in license comments of headers/sources     (CG)

- Two new selection operators: SelectRouletteOp and SelectRandomOp      (CG)

  Two new selection operators are added to Open BEAGLE: SelectRouletteOp
  which is fitness proportional roulette selection, and SelectRandomOp
  which is uniformly distributed random selection of individuals.

- GP operators supporting constrained trees splitted                    (CG)

  GP operators that supports constrained trees (crossover, mutation,
  and initialization) have been splitted in two operators, with one simple
  version not including constraints handling, and a second version, with
  word "Constrained" added in their name, supporting topological
  constraints.

- Negative fitness values and higher precision statistics               (CG)

  The classes associated to the fitness measures now support the
  possibility to use negative fitness value. The statistics are computed
  using double-precision arithmetics, which allow better precision and
  limit the effect of overflows.

- Initialization from file, without command-line arguments              (CG)

  It is possible for the user to initialize the whole system directly from
  a file, without having to give the command-line values (argc/argv of
  main() routine).

- Configuration files includes evolver structure                        (CG)

  The configuration file (.conf file) now include in addition to the
  parameters of the register, the possibility to set the configuration
  of the evolver. The name of the parameters associated to the configuration
  file have been changed to use the prefix "ec.conf" (i.e. configuration
  file name: "ec.conf.file", configuration file dump: "ec.conf.dump").
  The mechanism to read and write configuration has significantly changed.

- Dynamic evolver configuration from XML files                          (CG)

  Operator sets composing evolvers can now be written and read from file
  directly. A new way of doing things imply that each usable operators
  are putted into the evolver, are used to compose the operator sets
  when read from file. The operators have also been modified to be setup
  dynamically from files.

- Modified operators to comply with breeder model                       (CG)

  Several operators such crossover, mutation, selection, and evaluation
  have been modified to be usable as breeder operators.

- (Mu,Lambda) and (Mu+Lambda) replacement strategies                    (CG)

  The (Mu,Lambda) and (Mu+Lambda) replacement strategies, common in
  Evolution Strategy (ES), have been added to the framework. (Mu,Lambda)
  replacement strategy proceed by generating a new-born set of Lambda
  individuals from a parent population of Mu individuals (where Lambda >
  Mu). The Mu best individuals of the new-born population is used to make
  the next generation of individuals. The (Mu+Lambda) differs from the
  previous one by choosing the Mu best individuals to compose the new
  generation from both the populations of Lambda new-borns and Mu parents.

- Breeders and replacement strategies                                   (CG)

  Breeders and replacement strategies concepts have been added to the
  framework. A breeder operator is an operator that can process individuals
  instead of demes, allowing a finer control over the evolutionary algorithm.
  Breeders are structured as trees to generate new-born individuals one at
  the time. Replacement strategies are the root of the breeder tree, which
  insert each newly generated individual in the population following a given
  strategy. Two replacement strategies have been implemented: generational
  and steady-state.

- New exception class RunTimeException                                  (CG)

  New exception class RunTimeException added. This class covers
  miscellaneous exception cases related to run time value checking.
  Changes in different places in the code to throw RunTimeException instead
  of other Beagle exceptions.

- Read parameter operator removed from standard evolvers                (CG)

  The RegisterReadOp has been removed from the bootstrap and main-loop
  operator set of the standard evolvers, but still remain available in the
  EC framework.

- Bug correction in minOf() and maxOf()                                 (CG)

  Bug correction in minOf() and maxOf(), by testing of the function
  arguments for being Not-a-Number.

- Number of processed individuals added in context                      (CG)

  Basic EC context now has four new members: number of individuals
  processed (evaluated) in the actual deme for this generation, number of
  individuals processed in the whole evolution, number of individuals
  processed in the vivarium for this generation, and number of individuals
  processed in the vivarium for the whole evolution.

- Changes in statistics mechanism                                       (CG)

  Dynamic addition of statistical element is now possible. The statistics
  computation for a deme is now done in statistics calculation operator
  (no more in fitness class). Two new statistics calculation operator
  added: StatsCalcFitnessSimple, and StatsCalcFitnessKozaOp.

- File format changes                                                   (CG)

  The file format has been changed, using the new XML I/O classes. Among
  the changes, we note that file format is now completely XML standard
  compliant, and that the GP trees are now written using a pure XML format.

- New XML reading/writing classes                                  (CG + MP)

  The Open BEAGLE XML input and output classes as been changed for
  Marc Parizeau's XML parser and streamer. Signature of method Object::read
  and Object::write has been changed accordingly. This imply that every
  Open BEAGLE object that can be read and written have been changed to use
  new XML I/O mechanism.

- Gray code decoding facilities for bit strings                         (CG)

  A new decoding method has been added to the GA framework, to allow the
  decoding of gray-coded bit string to floating-point vectors. The
  maxfct example has been changed to use gray-coded strings instead of
  binary-coded ones.

- Mersenne twister random number generator                              (CG)

  A better (and faster) random number generator is now used in the
  framework: the mersenne twister. This number generator is now used
  by default by the framework, and I advice people to use it instead of
  the old one. The old random number generator, based on rand1 of
  "Numerical recipes in C", is still available.
  See http://www.math.keio.ac.jp/~matumoto/emt.html for details on the
  mersenne twister.

- Post-initialization hooks                                             (CG)

  Post-initialization hooks method called "postInit" has been added to
  different components (logger, register, randomizer, operators). These
  hooks provide an entry to a mechanism that is call once, after the system
  is initialized and the parameters read from the configuration file, but
  before the evolution is started.

- Changes in fitness classes                                            (CG)

  Some minor changes in fitness classes, to take account of invalid fitness
  measure in comparison methods, and to enable calculation of statistics
  for empty demes.

- Changes in Individual::isIdentical                                    (CG)

  The Individual::isIdentical method now tests whether two individuals are
  equals, in term of their fitness value, before comparing their structural
  similarity. This change affect the individuals putted in the hall-of-fame
  as now, two structurally identical individuals, but with a different
  fitness value, will no more considered as identical.

- New class HallOfFame, hall-of-fame in the vivarium                    (CG)

  The hall-of-fame mechanisms, which is essentially to preserve the
  best-of-run individuals into a persistent and evolution independent
  container, is now encapsulated into class HallOfFame. An hall-of-fame
  has been added to the vivarium. The hall-of-fame size parameter name has
  been changed for "ec.hof.demesize" for each deme's hall-of-fame size, and
  "ec.hof.vivasize" for the vivarium's hall-of-fame size. Default size
  values are now 1 for the vivarium's hall-of-fame, and 0 for the deme's
  one. The members of the hall-of-fame also includes their associated
  generation number and deme index of the moment they were put in
  the hall-of-fame.

- New GP mutation operator: MutationSwapSubtreeOp                 (CG + HJJ)

  New mutation operator added to the GP framework: MutationSwapSubtreeOp.
  This mutation operator implement a kind of self-crossover operation,
  where two subtrees of the same individual are exchanged. Two types of
  swap subtree mutation are possible: external subtree mutation, using two
  exclusive subtrees, and internal subtree mutation, where one of the
  swapped subtree is within the other. In the later case, three mutation
  points are used. (In collaboration with Jianjun Hu)

- Bug fix in method Deme::updateHallOfFame                              (CG)

  Hall-of-fame was not correctly updated when HOF size is > 1.
  (Thanks to Jianjun Hu)


1.1.1:                                                          (28/05/2003)

- Ordinal numbers correctly displayed.                             (MW + CG)

  Ordinal numbers (1st, 2nd, 27th, etc.) are now correctly outputted in logs
  using new function uint2ordinal. (Thanks to Matthew Walker)

- Minor correction to compile with MS Visual C++ .NET 2003 (7.1).       (CG)

  Some minor code correction to allow compilation with MS Visual C++ .NET
  2003 (7.1). (Thanks to sashan)

- Bug fix in GP::InitHalfOp.                                            (CG)

  Type mistake for typedef of type GP::InitHalfOp::Bag.
  (Thanks to Matthew Walker)

- FitnessKoza now inherits from FitnessSimple.                          (CG)

  The class FitnessKoza now inherits from FitnessSimple. The value of the
  simple fitness is the normalized measure of the Koza's fitness. The
  interface of the class stay unchanged. This will be useful as
  selection operators usable with class FitnessSimple will also be usable
  with class FitnessKoza.

- New GA example: All Zeros.                                            (CG)

  A new GA example is added to the distribution. It consists to discover
  a bit string made only of zeros. It is expressed as a minimization
  problem, as the fitness measure is the number of one in the bit string.
  It also uses the new fitness class, FitnessSimpleMin.

- New fitness class: FitnessSimpleMin.                                  (CG)

  A new fitness class is added to the generic framework. The fitness is
  similar to FitnessSimple with the exception that smaller values are
  better. This new class is targeted for minimization problems.

- Bug fix: config.hpp was not correctly installed on Unix               (CG)

  Since version 1.0.3, file config.hpp was not correctly installed on Unix
  with the command 'make install'.


1.1.0:                                                          (30/04/2003)

- Doxygen comments improvements                                         (CG)

  Code comments improved. New section "Modules" in the doxygen
  documentation, where the classes are regrouped in a human-understandable
  fashion. This new section is appropriate to get familiar with the
  framework.

- Milestone file format modified                                        (CG)

  With the class name and in the statistics changes, the milestone file
  format has been changed. The old format is not recognized by the
  framework, until someone develop a XSLT to transform them (any
  volunteer?). Note that the actual new format is transitory
  and will _NOT_ be compatible with the new format announced with the new
  XML readers/writers.

- GP tree size and depth measures added to GP::FitnessKoza              (CG)

  Class GP::FitnessKoza now contained two new measures: the number of nodes
  in the individuals, and the tree depth of the individual. This is
  appropriate to monitor code growth in the population during evolutions.

- Changes in statistics and fitness classes                             (CG)

  A major revision of statistics classes has been made. Classes
  MeasureStats and PopulationStats are eliminated. The GenerationStats is
  renamed Stats, and the Measure struct is now in the same header than this
  class ("beagle/Stats.hpp"). The members m3rdQuart (third quartile measure),
  mMedian (median measure), and m1stQuart (first quartile measure) of the
  Measure struct are eliminated. The mPopSize and mGeneration members
  are moved into the Stats class and new member called mProcessed
  (number of individuals processed (evaluated) in actual generation) and
  mTotalProcessed (total number of individuals processed (evaluated) in the
  whole evolution) are added to the class Stats. The statistics in the deme
  are now only for the most recent generation. For the history statistics,
  the user should consult the logs. A statistics member is added to the
  vivarium. Class DisplayStatsOp merged into class StatsCalculateOp. The
  statistics are generated directly by the class StatsCalculateOp and now
  outputted passing by the logger. The declaration of the prototype of method
  Fitness::calculateDemeStats is changed for Fitness::calculateStats.

- New logging mechanism                                            (CG + MP)

  A new logging mechanism has been developed. Two new classes are added
  to the framework: Logger, abstract logging class, and LoggerXML, logger
  that can write into a file and/or the standard output in a XML format.
  A logger handle is added to the System class. There is 8 levels of logging
  available, from level 0 (nothing) to level 7 (debug). High logging levels
  include all the previous one. Macros are added to facilitate logging.
  Several parameters for the logging are added in the register. See the
  manual for more details. Almost half of the framework classes source
  code, essentially the operators, have been modified to log their
  operations.

- Some name changes of classes and files                                (CG)

  In order to make the whole organization more coherent, the name of
  the following classes, with their associated files, has been changed.

  CalculateStatsOp        -> StatsCalculateOp
  GenerationStats         -> Stats
  MaxGenerationTermOp     -> TermMaxGenOp
  RandomRingMigrationOp   -> MigrationRandomRingOp 
  ReadMilestoneOp         -> MilestoneReadOp
  ReadParametersOp        -> RegisterReadOp
  SimpleFitness           -> FitnessSimple
  TournamentSelectionOp   -> SelectTournamentOp
  WriteMilestoneOp        -> MilestoneReadOp
  GA::GenerationalEvolver -> GA::EvolverGenerational
  GA::SteadyStateEvolver  -> GA::EvolverSteadyState
  GP::GenerationalEvolver -> GP::EvolverGenerational
  GP::KozaFitness         -> GP::FitnessKoza
  GP::MaxHitsTermOp       -> GP::TermMaxHitsOp
  GP::ReadMilestoneOp     -> GP::MilestoneReadOp
  GP::ShrinkMutationOp    -> GP::MutationShrinkOp
  GP::StandardMutationOp  -> GP::MutationStandardOp
  GP::SteadyStateEvolver  -> GP::EvolverSteadyState
  GP::SwapMutationOp      -> GP::MutationSwapOp


1.0.3:                                                          (20/03/2003)

- Prefix BEAGLE_ added to preprocessor flags in file config.hpp         (CG)

  The prefix BEAGLE_ is now used as prefix of all preprocessor flags
  generated by autoconf in file config.hpp.

- Additional methods to read/write demes                                (CG)

  The methods Deme::read and Deme::write have been cut into fine grained
  methods to read/write the hall-of-fame and the population.

- New templated functions isNaN, isInfinity, and isFinite to check      (CG)
  whether a floating-point number is not-a-number, infinite or finite

  These new functions enable the checking of finiteness of floating-point
  numbers, that is a number is not NaN, infinite, or finite (nor NaN or
  infinite). These functions are generic, portable replacements to previous
  calls to the GNU macro isfinite, which is only available on gcc <= 2.95.

- New templated arithmetic functions maxOf, minOf, and pow2Of           (CG)

  These arithmetic functions replace the Beagle_MaxM, Beagle_MinM and
  Beagle_Pow2M macros to evaluate respectively the maximum of two
  numbers, the minimum of two numbers, and the square of a number.

- Members mHallOfFame and mStats in Deme changed from value to handle   (CG)

  Type of member Deme::mHallOfFame changed from Individual::Bag to
  Individual::Bag::Handle. Type of member Deme::mStats changed from
  PopulationStats to PopulationStats::Handle. This is to allow smart
  pointing of deme's hall-of-fame and statistics. (Thanks to Jianjun Hu)

- Bug correction in SteadyState::operate                                (CG)

  The steady-state now update the hall-of-fame with the best of run
  individuals. The method Deme::updateHOFWithIndividual is added in order
  to update the hall-of-fame with one individual. (Thanks to Jianjun Hu)

- Bug correction in Register::interpretArgs                             (CG)

  Correction of a bug in the command-line parsing routines in the register.
  When two consecutive arguments starting with -OB were given on the
  command-line, the second was ignored. (Thanks to Jianjun Hu)


1.0.1:                                                          (20/11/2002)

- Autoconf/automake/libtool compilation front-end                       (CG)

  This enable the compilation on different Unix systems using the GNU build
  tools. It eliminates the manual setting of preprocessing flags to compile
  on a given target (configure script now sets these flags automatically).
  The preprocessing flags name are changed to be compliant with autoconf.
  The user doesn't need anymore to edit the infamous 'beagle.make' and
  'beagle-debug.make' files.

- Support for MS Visual C++ .NET                                        (CG)

  The framework now compiles under MS Visual C++ .NET. Some changes are
  made to the code to allow it. Support for Borland C++ Builder is
  abandoned. (Thanks to Mark Mikulec)

- Modification of the file structure                                    (CG)

  The examples are moved into the folder 'examples' and are now independent
  projects. The 'make' and 'BCB' folders are eliminated and different
  autoconf/automake files are added. The folders 'MSVCPP' contains the
  MS Visual C++ .NET specific project files.

- Complete revision of parameter tags and descriptions             (CG + MP)

  The parameter tags are changed to augment consistency and organization.
  Some useless and confusing parameters are eliminated. The short and
  long help about the parameters is completely revised. The '-EC'
  command-line prefix is changed for '-OB'.

- Code revision of the examples                                    (CG + MP)

  The four examples code are revised for clarity and simplicity.

- Bug correction in SteadyStateOp::operate                              (CG)

  Correction of a bug in the steady-state operator when mating two
  individuals for crossover. (Thanks to Jianjun Hu)

- Bug correction in symbolic regression example                         (CG)

  The symbolic regression evaluation operator "initialize" method
  previously called the random number generator. This may cause problems as
  the random number generator internal state value may be changed after
  this call. This situation is now corrected by sampling the equation to
  regress at the first call to the method "evaluate". (Thanks to Brad
  Pillow)

- Bug correction in MigrationOp::migrate                                (CG)

  Correction of a bug that happen when determining whether migration happens
  or not, given the migration interval. (Thanks to Mathieu Roy)


1.0.0:                                                          (22/07/2002)

 - Modification of statistics classes                                   (CG)
 - Modification of copy behavior of bags and bag allocators        (CG + MP)
 - Several minor bug fixes                                              (CG)
 - Several minor comments revision                                 (CG + MP)
 - Minor changes to compile with Borland C++ Builder                    (CG)

0.16.2 (BETA):                                                  (13/06/2002)

 - Merge of mixed and uniform bags into unified bags               (CG + MP)
 - Several class name changes                                      (CG + MP)
 - Several minor bug fixes                                              (CG)
 - The GP framework                                                     (CG)
 - Tree GP test examples                                                (CG)

0.16.1 (ALPHA):                                                 (21/03/2002)

 - The makefiles structure                                              (CG)
 - The generic OO foundations                                           (CG)
 - The generic EC framework                                             (CG)
 - The GA framework                                                     (CG)
 - A simple GA test example                                             (CG)



