Moving SPAM back from Hive repository to spam repository.
Committing current class diagram for SPAM.

Not sure I really want to make a UML for the full system, but it may have value
later on... Especially when I have to pass it on to someone else...
Made sweeping changes:
 * Finally fixed HierarchicalCluster to be well (much better at least)
   designed.
 * Removed the 'types' package and moved the classes within this package to
   other, more appropriate, packages.
 * Fixed PyroprintMetric, PyroprintComparator, PyroprintAverageMetric
 * Fixed ITSRegionMetric, ITSRegionComparator, ITSRegionAverageMetric

 Still to be done:
  * Fix IsolateMetric, IsolateComparator, IsolateAverageMetric
  * Fix ClusterMetric/ClusterComparators
  * Fix clustering algorithms to reflect changes throughout code
  * Fix GUI to be more succinct
Adding the start of unit tests. Only 1 file so far, that is super basic and not
particularly useful, but will ramp up once I finish the rewrite (for general
clustering program) and need to start testing the hell out of the clustering
Made all of the base metrics classes (including ___AverageMetric) compliant
with the new approach. This means that PyroprintMetric is given 2 pyroprints to
compare, ITSRegionMetric is given 2 ITSRegions to compare, etc. Additionally,
Debug and Error outputs are appropriately replaced with calls to Logger.debug
and Logger.error, respectively.

All reset() calls are made in result() and in
some cases there may be additional consolidations of some of these methods in
the future, although I think I actually prefer the apply() -> result() process.
It is prone to error but may yield some extra flexibility in the future.

Isolate now contains a HashMap of regions mapping region name (string) ->
region object (ITSRegion). This is so that when the IsolateMetric is given two
isolates to compare, it goes through each of it's ITSRegionMetrics and
the region that metric is meant to be applied to is then pulled from the
Isolate regionMap by name. Otherwise it would be inefficient and unreliable to
compare ITSRegions for isolates.

Additionally, I have added errorcodes to each metric including DataMetric (the
interface). This is so that I no longer have to ruin my code appearance by
being explicit with unwrapping and wrapping double values in Double objects. I
can just pass doubles around and check error codes (getError() or mErrorCode)
in order to see if the received value is a valid one. I will have to be sure
that the GUI somehow flags values as incorrect should any error codes be set so
that it is apparent when computed values should be disregarded.
Committing this for the skeleton of the testing framework in the future. This
will be more like unit tests. I think I would like to style this after the
tests in perl modules so that I can always be sure when something is/isn't
working as it should be and on "installation" it can be sure that nothing got
messed up.
I have propagated appropriate changes throughout all metrics, and even created
PyroprintSimpleMetric to be used for CSV files. With this metric, it should be
possible to create the appropriate Isolate:ITSRegion:Pyroprint object
structures and use the metrics the same as if pulling from the database, but
using a matrix of correlation values instead of a list of peak heights for the
pyroprints.
Propagated changes up through AgglomerativeClusterer. Renamed
PartitionedAgglomerative to be OhClustering but have not modified the file
otherwise.

I changed HierarchicalCluster to be HCluster (HierarchicalCluster was too long
of a name) and I have then proceeded to make HierarchicalClusterer,
AgglomerativeClusterer, and eventually OHClustering to use HClusters instead of
Clusters.

Also removing the use of ClusterAnalyzer in each of the files. Going to see if
I can't simplify that process.
Aldin told me to commit. -eriq
Going to have to back up and re-work my design because of generic/template
bloat.
Simplified the code to remove template/generics bloat. To do this I changed
Cluster to not take a generic, but instead it's data collection has generics
for Clusterable. In turn, I replaced Clusterable with BaseClusterable (No
   longer saw a need for Clusterable) and changed the biology types (ITSRegion,
   Isolate, Pyroprint) to extend Clusterable and also to internalize
   Comparators. The internalization of Comparators was necessary in order to
   make each biology type use the same type of collection (Collection) and
   remove the need for maps in Isolate to map region names to the ITSRegion
   object. Also, because of this simplification the Comparator classes could be
   removed. Additionally, since the abstract Metrics were incredibly simple I
   realized I could delete these as well and simply have Metric classes that
   implement DataMetric<type>. All in all this simplification has been good,
   however I am now back to my original problem of cyclic generics (Cluster
   extends Clusterable<Clusterable>) this will need more designing and
   deliberating...
FINALLY FINALLY FINALLY cleaned up the code and java generics are used in a
decent way and there is no bloat or obfuscation. everything seems to be
designed pretty well and now it's just a matter of making sure everything is
correct and connecting everything to the GUI.
Propagated the previous changes of simplifying DataMetric and DataComparator
usage and proliferation to a much more minimal stub. Additionally, I split the
PyroprintPearsonMetric into two metrics to remove the need for a flag to
determine which Pearson's Correlation equation to calculate (Unstable is highly
suggested and encouraged).

Added some content to Configuration and additionally started modifying a
standard property configuration file.

With any luck this should make it really easy to specify what metric modules,
clustering modules, etc. should be used in analysis.
Have been modifying a lot of GUI code and it sucks so bad to have to go through
all of that. Also did a couple final changes to everything below the GUI code
(or so I think)
Got clustering to work fundamentally (minus the actual grouping of clusters?).
Still need to finish some bugs, make sure it works, and then propagate
appropriate changes to the GUI and other functionality.

This does not yet cluster data from the database
Changed Makefile to use -Xlint when compiling.

Found the bug preventing clusters from joining which was the hardcoded upper
threshold was in percent, not in decimal value.

Clusters are now joining, and distances seem to be correctly calculated between
individual isolates.

Distances between clusters with multiple isolates needs to be double checked
and the hardcoded upper threshold for isolate similarity needs to be addressed.
Made the upper threshold in 'isSimilar' in Isolate.java to be parameterized so
that it is no longer hardcoded.
Added 'isDifferent' method to biology data types and to cluster.

This allows us to use 'isDifferent' instead of a lower threshold value for
AgglomerativeClusterer. Additionally, removed the use of a threshold value in
Agglomerative Clusterer.
Re-added writing output of clustering to two files: csv file and xml file.

Need to re-add statistics calculations to clusters. And then add clustering
from database
Added statistics to xml output.

Cluster now has a method for computing statistics within the cluster.

HCluster now has an implementation of computeStatistics

DendogramNode now contains a reference to the cluster corresponding to that
dendogram.