This package contains auxillary utility classes and functions used by ECJ, but
which can easily be used by other Java libraries and are not specific to ECJ.


LOGGING FACILITY
----------------

When ECJ was first developed (in 1998) there was no Java logging facility, no
log4j, etc.  So I rolled my own, largely a copy of the one in lil-gp.  The 
facility has proven fairly robust, so we've kept it over the years.  The
facility has a basic class:

	ec.util.Output

... which does most of the logging work.  Output holds one or more *logs*,
defined by

	ec.util.Log

... which are largely (but not required to be) wrappers around streams to
standard out, standard err, or various files.  Output then allows you to print
to these logs, or to issue "announcements" to them.  An announcement is 
different from an ordinary print statement in that it is also stored in memory 
permanently, and so gets checkpointed.  When a log is restarted from 
checkpoint, all of its announcements can be reissued to the log; that's how 
ECJ prints all of its stuff out to the terminal again when restarting from 
checkpoint.  Beware that because announcements are stored in memory as well as
printed out, if you issue too many of them, you'll fill up memory excessively.
Announcements are all subclasses 

	ec.util.Announcement

Logs restart themselves from checkpoint using a small class:

	ec.util.LogRestarter

When output generates exceptions, usually pertaining to writing to Logs, it
does so with an OutputException

	ec.util.OutputExcption



RANDOM NUMBER GENERATORS
------------------------

ECJ's random number generator is a Java implementation of the Mersenne Twister
random number generator which I wrote in 1998.  It's still a popular
implementation of the Mersenne Twister algorithm, largely because it's quite
fast.  ECJ has two versions of the algorithm but only uses one:
MersenneTwisterFast:

	ec.util.MersenneTwister
	
	A drop-in subclass replacement for java.util.Random which uses the
	Mersenne Twister algorithm instead.

	ec.util.MersenneTwisterFast

	Algorithmically identical to ec.util.MersenneTwister, but without
	synchronization, and with a lot of hard-code-inlined methods.  As
	a result much harder to read and understand, but over twice as fast.


PARAMETER DATABASE	
------------------

ECJ's parameter database facility was also built from scratch at a time when
Java had no other built-in facilities available.  The parameter database is
built on top of Java's Properties class, but adds the additional functionality
of multiple files with inheritance, plus command-line properties and dynamic
properties.  The primary class is

	ec.util.ParameterDatabase

... which loads properties from various files and stores them internally for
you to query at runtime.  To query for a property, you create a Parameter
(a wrapper for String, used instead of String for entirely historical reasons).
You then issue the Parameter to the ParameterDatabase and get the corresponding
value.  Parameters are defined with:

	ec.util.Parameter

When there is an exception upon creating a Parameter, a BadParameterException
is thrown:

	ec.util.BadParameterException

When you use a Parameter to attempt to load and and initialize a class from
the ParameterDatabase, and something failed on that attempt, a 
ParamClassLoadException is called:

	ec.util.ParamClassLoadException

The GUI facility of ECJ has additional classes meant to access parameters
programmatically in Swing.  Generally you wouldn't play with these:

	ec.util.ParameterDatabaseEvent
	ec.util.ParameterDatabaseTreeModel
	ec.util.ParameterDatabaseTreeNode	
	ec.util.ReflectedObject



READING, WRITING, CHECKPOINTING, AND NETWORKING
-----------------------------------------------

Many ECJ objects (notably Individuals) have the ability to write themselves
out to a stream in a fashion that is both readable by humans (more or less)
*and* can be read back in a way that maintains integrity.  To do this they
rely on ECJ's "Code" facility to encode and decode basic data elements.  To 
encode data, you can use the Code class:

	ec.util.Code

To decode data, you use the Code class in conjunction with a special object
which gives you additional information about the decoded data.  This special
object is called a DecodeReturn:

	ec.util.DecodeReturn

In certain rare situations ECJ finds that it needs to be able to hook a
DataOutputStream directly to a DataInputStream.  Surprisingly, Java cannot
provide this facility without using two threads (to enable the PipedInputStream
and PipedOutputStream).  ECJ's solution is a buffered single-thread pipe called
DataPipe:

	ec.util.DataPipe

ECJ implements checkpointing of runs via Java's serialization facility.  The
cover class which handles this work is called Checkpoint:

	ec.util.Checkpoint

Last, a long-standing bug in Java prevents proper lookup of localhost sockets.
This is fixed using a class from Jakarta called LocalHost:

	ec.util.LocalHost



MANIPULATING ARRAYS
-------------------

Largely for historical reasons, ECJ has its own quicksort facilities.  We keep
these facilities because, quite surprisingly, Java's current sorting facilities
are very much insufficient.  ECJ's basic class for sorting is QuickSort:

	ec.util.QuickSort

QuickSort relies on a special Comparator object for determining whether two
objects are greater or less than one another.  This is mostly for historical
reasons.  There is also a special version of this object for longs:

	ec.util.SortComparator
	ec.util.SortComparatorL

ECJ can convert arrays of floats, doubles, or arbitrary objects, into
distributions and then select random numbers under them (treating the
values in the arrays as actual prenormalized probabilities).  The primary class
for this is RandomChoice:

	ec.util.RandomChoice

RandomChoice can work with arrays of Objects as long as there's a provided
object a RandomChoiceChooser, which provides the "probability" value for a
given Object.  There are two versions of RandomChoiceChooser, one which 
assumes probabilities are floats, and the other which assumes they are doubles
(again, mostly for historical reasons):

	ec.util.RandomChoiceChooser
	ec.util.RandomChoiceChooserD



SIMPLE LEXING (TOKENIZING)
--------------------------

ECJ's Grammatical Evolution facility needs to lex simple rulesets, one per line,
from a file.  The following class makes regular-expression-based lexing simpler:

	ec.util.Lexer



ECJ'S VERSION
-------------

Information regarding the current version of ECJ is located in:

	ec.util.Version
