|
From: Theuns C. <the...@gm...> - 2009-06-10 06:42:06
|
I have a Subversion checkout that had these changes. I then created a
patch with
svn diff >changes.patch
and applied it now into my Git checkout with
patch -p0 changes.patch
---
.../kmeans/CentroidsInitialisationStrategy.java | 6 +-
...ataSetBasedCentroidsInitialisationStrategy.java | 10 +-
.../cilib/clustering/kmeans/KMeans.java | 11 +-
.../RandomCentroidsInitialisationStrategy.java | 8 +-
.../cooperative/SplitCooperativeAlgorithm.java | 26 +-
.../StandardContributionUpdateStrategy.java | 4 +-
.../FitnessUpdateStrategy.java | 13 +-
.../StandardFitnessUpdateStrategy.java | 4 +-
.../net/sourceforge/cilib/entity/EntityType.java | 3 +-
.../net/sourceforge/cilib/entity/Topology.java | 12 +
.../cilib/entity/topologies/GBestTopology.java | 18 +
.../cilib/entity/topologies/LBestTopology.java | 25 +
.../entity/topologies/VonNeumannTopology.java | 35 +
.../clustering/ClusteringFitnessFunction.java | 5 +-
.../clustering/KHarmonicMeansFunction.java | 2 +-
.../ClusterMeanStrategy.java | 2 +-
.../validityindices/DaviesBouldinIndex.java | 2 +-
.../clustering/validityindices/DunnIndex33.java | 2 +-
.../clustering/validityindices/DunnIndex53.java | 2 +-
.../validityindices/HalkidiVazirgiannisIndex.java | 2 +-
.../validityindices/MaulikBandyopadhyayIndex.java | 2 +-
.../VeenmanReindersBackerIndex.java | 2 +-
.../java/net/sourceforge/cilib/math/StatUtils.java | 2 +-
.../measurement/single/NumberOfClustersFormed.java | 53 +-
.../cilib/problem/ClusteringProblem.java | 21 +-
.../cilib/problem/dataset/ClusterableDataSet.java | 71 -
.../sourceforge/cilib/problem/dataset/DataSet.java | 36 +-
.../cilib/problem/dataset/DataSetManager.java | 32 +-
.../problem/dataset/DynamicCirclesDataSet.java | 131 +
.../cilib/problem/dataset/DynamicDataSet.java | 94 +
.../problem/dataset/DynamicDataSetBuilder.java} | 46 +-
.../dataset/DynamicHelixSpheresDataSet.java} | 43 +-
.../cilib/problem/dataset/LocalDataSet.java | 41 +-
.../cilib/problem/dataset/Pattern.java} | 45 +-
...taSetBuilder.java => StaticDataSetBuilder.java} | 105 +-
.../cilib/pso/dynamic/ChargedParticle.java | 7 +-
.../ChargedParticleInitialisationStrategy.java | 5 +
.../ChargedSwarmInitialisationStrategy.java | 130 +
.../pso/dynamic/ChargedVelocityUpdateStrategy.java | 155 +-
.../pso/dynamic/DynamicIterationStrategy.java | 47 +-
...ndardChargedParticleInitialisationStrategy.java | 5 +-
.../EnvironmentChangeDetectionStrategy.java | 83 +-
.../RandomSentriesDetectionStrategy.java | 4 +-
.../RandomSentryDetectionStrategy.java | 149 +-
.../RandomSentryPointsDetectionStrategy.java | 4 +-
.../TopologyBestSentryDetectionStrategy.java | 3 +-
.../responsestrategies/DualReactionStrategy.java | 2 -
.../EnvironmentChangeResponseStrategy.java | 8 +-
.../PartialReinitialisationResponseStrategy.java | 11 +-
.../ParticleReevaluationResponseStrategy.java | 16 +-
.../cilib/pso/particle/AbstractParticle.java | 17 +-
.../cilib/pso/particle/StandardParticle.java | 2 -
...DataSetBasedPositionInitialisationStrategy.java | 6 +-
.../sourceforge/cilib/util/ClusteringUtils.java | 92 +-
.../net/sourceforge/cilib/util/VectorUtils.java | 54 +-
.../clustering/ClusteringFitnessFunctionTest.java | 8 +-
.../net/sourceforge/cilib/math/StatUtilsTest.java | 2 +-
.../cilib/problem/dataset/MockStringDataSet.java | 6 +
...lderTest.java => StaticDataSetBuilderTest.java} | 14 +-
.../cilib/util/ClusteringUtilsTest.java | 14 +-
xml/charged.pso.xml | 71 +
xml/clustering-gbest-pso.xml | 4191 ++++++++++++++++++++
xml/clustering.dynamic.circles.xml | 60 +
xml/kmeans.xml | 145 +
xml/predatorPreyCoevolution.xml | 18 +-
65 files changed, 5567 insertions(+), 678 deletions(-)
delete mode 100644 src/main/java/net/sourceforge/cilib/problem/dataset/ClusterableDataSet.java
create mode 100644 src/main/java/net/sourceforge/cilib/problem/dataset/DynamicCirclesDataSet.java
create mode 100644 src/main/java/net/sourceforge/cilib/problem/dataset/DynamicDataSet.java
copy src/{test/java/net/sourceforge/cilib/problem/dataset/AssociatedPairDataSetBuilderTest.java => main/java/net/sourceforge/cilib/problem/dataset/DynamicDataSetBuilder.java} (53%)
copy src/{test/java/net/sourceforge/cilib/problem/dataset/AssociatedPairDataSetBuilderTest.java => main/java/net/sourceforge/cilib/problem/dataset/DynamicHelixSpheresDataSet.java} (54%)
copy src/{test/java/net/sourceforge/cilib/problem/dataset/AssociatedPairDataSetBuilderTest.java => main/java/net/sourceforge/cilib/problem/dataset/Pattern.java} (54%)
rename src/main/java/net/sourceforge/cilib/problem/dataset/{AssociatedPairDataSetBuilder.java => StaticDataSetBuilder.java} (69%)
create mode 100644 src/main/java/net/sourceforge/cilib/pso/dynamic/ChargedSwarmInitialisationStrategy.java
rename src/test/java/net/sourceforge/cilib/problem/dataset/{AssociatedPairDataSetBuilderTest.java => StaticDataSetBuilderTest.java} (88%)
create mode 100644 xml/charged.pso.xml
create mode 100644 xml/clustering-gbest-pso.xml
create mode 100644 xml/clustering.dynamic.circles.xml
create mode 100644 xml/kmeans.xml
diff --git a/src/main/java/net/sourceforge/cilib/clustering/kmeans/CentroidsInitialisationStrategy.java b/src/main/java/net/sourceforge/cilib/clustering/kmeans/CentroidsInitialisationStrategy.java
index 205ffaa..5a9fa3d 100644
--- a/src/main/java/net/sourceforge/cilib/clustering/kmeans/CentroidsInitialisationStrategy.java
+++ b/src/main/java/net/sourceforge/cilib/clustering/kmeans/CentroidsInitialisationStrategy.java
@@ -24,7 +24,7 @@ package net.sourceforge.cilib.clustering.kmeans;
import java.io.Serializable;
import net.sourceforge.cilib.problem.ClusteringProblem;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet;
+import net.sourceforge.cilib.problem.dataset.StaticDataSetBuilder;
import net.sourceforge.cilib.type.types.container.Vector;
import net.sourceforge.cilib.util.Cloneable;
@@ -48,9 +48,9 @@ public interface CentroidsInitialisationStrategy extends Serializable, Cloneable
* centroids.
*
* @param problem the {@link ClusteringProblem} currently being optimized
- * @param dataset the {@link ClusterableDataSet} currently being clustered
+ * @param dataset the {@link StaticDataSetBuilder} currently being clustered
* @return a {@link Vector} that represents all the centroids
*/
- public Vector initialise(ClusteringProblem problem, ClusterableDataSet dataset);
+ public Vector initialise(ClusteringProblem problem, StaticDataSetBuilder dataset);
}
diff --git a/src/main/java/net/sourceforge/cilib/clustering/kmeans/DataSetBasedCentroidsInitialisationStrategy.java b/src/main/java/net/sourceforge/cilib/clustering/kmeans/DataSetBasedCentroidsInitialisationStrategy.java
index 4b35102..ef8b1d7 100644
--- a/src/main/java/net/sourceforge/cilib/clustering/kmeans/DataSetBasedCentroidsInitialisationStrategy.java
+++ b/src/main/java/net/sourceforge/cilib/clustering/kmeans/DataSetBasedCentroidsInitialisationStrategy.java
@@ -26,8 +26,8 @@ import java.util.ArrayList;
import net.sourceforge.cilib.math.random.generator.MersenneTwister;
import net.sourceforge.cilib.math.random.generator.Random;
import net.sourceforge.cilib.problem.ClusteringProblem;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet.Pattern;
+import net.sourceforge.cilib.problem.dataset.Pattern;
+import net.sourceforge.cilib.problem.dataset.StaticDataSetBuilder;
import net.sourceforge.cilib.type.types.container.Vector;
/**
@@ -51,6 +51,7 @@ public class DataSetBasedCentroidsInitialisationStrategy implements CentroidsIni
/**
* {@inheritDoc}
*/
+ @Override
public DataSetBasedCentroidsInitialisationStrategy getClone() {
return new DataSetBasedCentroidsInitialisationStrategy();
}
@@ -60,10 +61,11 @@ public class DataSetBasedCentroidsInitialisationStrategy implements CentroidsIni
* given dataset.
*
* @param problem the {@link ClusteringProblem} currently being optimized
- * @param dataset the {@link ClusterableDataSet} currently being clustered
+ * @param dataset the {@link StaticDataSetBuilder} currently being clustered
* @return a {@link Vector} that represents all the centroids
*/
- public Vector initialise(ClusteringProblem problem, ClusterableDataSet dataset) {
+ @Override
+ public Vector initialise(ClusteringProblem problem, StaticDataSetBuilder dataset) {
ArrayList<Pattern> patterns = dataset.getPatterns();
int numberOfCentroids = problem.getNumberOfClusters();
Vector centroids = new Vector(problem.getDomain().getDimension());
diff --git a/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java b/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java
index beba140..62d532f 100644
--- a/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java
+++ b/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java
@@ -30,16 +30,15 @@ import net.sourceforge.cilib.algorithm.Algorithm;
import net.sourceforge.cilib.algorithm.SingularAlgorithm;
import net.sourceforge.cilib.math.StatUtils;
import net.sourceforge.cilib.problem.OptimisationSolution;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet.Pattern;
+import net.sourceforge.cilib.problem.dataset.Pattern;
import net.sourceforge.cilib.type.types.container.Vector;
import net.sourceforge.cilib.util.ClusteringUtils;
import net.sourceforge.cilib.util.calculator.FitnessCalculator;
import net.sourceforge.cilib.util.calculator.StructuredTypeFitnessCalculator;
/**
- * This algorithm is an implementation of the KMeans Clustering algorithm.
- * <p>
- * This is the implementation as described in Section 2 of:
+ * This algorithm is an implementation of the KMeans Clustering algorithm. This is the implementation as described in
+ * Section 2 of:
*
* @inproceedings{ 2000.Ray.jul, title = "Determination of Number of Clusters in
* K-Means Clustering and Application in Colour Image
@@ -97,7 +96,7 @@ public class KMeans extends SingularAlgorithm {
public void performInitialisation() {
ClusteringUtils helper = ClusteringUtils.get();
- centroids = centroidsInitialisationStrategy.initialise(helper.getClusteringProblem(), helper.getClusterableDataSet());
+ centroids = centroidsInitialisationStrategy.initialise(helper.getClusteringProblem(), helper.getDataSetBuilder());
}
/**
@@ -152,7 +151,7 @@ public class KMeans extends SingularAlgorithm {
*/
private Vector reinitialiseCentroid(Vector centroid) {
ClusteringUtils helper = ClusteringUtils.get();
- Vector tmp = centroidsInitialisationStrategy.initialise(helper.getClusteringProblem(), helper.getClusterableDataSet());
+ Vector tmp = centroidsInitialisationStrategy.initialise(helper.getClusteringProblem(), helper.getDataSetBuilder());
// this first centroid will do
return tmp.subList(0, centroid.getDimension() - 1);
diff --git a/src/main/java/net/sourceforge/cilib/clustering/kmeans/RandomCentroidsInitialisationStrategy.java b/src/main/java/net/sourceforge/cilib/clustering/kmeans/RandomCentroidsInitialisationStrategy.java
index f72d3cc..8cf1292 100644
--- a/src/main/java/net/sourceforge/cilib/clustering/kmeans/RandomCentroidsInitialisationStrategy.java
+++ b/src/main/java/net/sourceforge/cilib/clustering/kmeans/RandomCentroidsInitialisationStrategy.java
@@ -22,7 +22,7 @@
package net.sourceforge.cilib.clustering.kmeans;
import net.sourceforge.cilib.problem.ClusteringProblem;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet;
+import net.sourceforge.cilib.problem.dataset.StaticDataSetBuilder;
import net.sourceforge.cilib.type.types.container.Vector;
/**
@@ -37,6 +37,7 @@ public class RandomCentroidsInitialisationStrategy implements CentroidsInitialis
/**
* {@inheritDoc}
*/
+ @Override
public RandomCentroidsInitialisationStrategy getClone() {
return new RandomCentroidsInitialisationStrategy();
}
@@ -47,10 +48,11 @@ public class RandomCentroidsInitialisationStrategy implements CentroidsInitialis
* {@link Vector} that will house the centroids.
*
* @param problem the {@link ClusteringProblem} currently being optimized
- * @param dataset the {@link ClusterableDataSet} currently being clustered
+ * @param dataset the {@link StaticDataSetBuilder} currently being clustered
* @return a {@link Vector} that represents all the centroids
*/
- public Vector initialise(ClusteringProblem problem, ClusterableDataSet dataset) {
+ @Override
+ public Vector initialise(ClusteringProblem problem, StaticDataSetBuilder dataset) {
Vector centroids = (Vector) problem.getDomain().getBuiltRepresenation().getClone();
centroids.randomize();
diff --git a/src/main/java/net/sourceforge/cilib/cooperative/SplitCooperativeAlgorithm.java b/src/main/java/net/sourceforge/cilib/cooperative/SplitCooperativeAlgorithm.java
index e0cce2d..659e45a 100644
--- a/src/main/java/net/sourceforge/cilib/cooperative/SplitCooperativeAlgorithm.java
+++ b/src/main/java/net/sourceforge/cilib/cooperative/SplitCooperativeAlgorithm.java
@@ -133,10 +133,12 @@ public class SplitCooperativeAlgorithm extends MultiPopulationBasedAlgorithm imp
contributionUpdateStrategy = contributionUpdate;
}
+ @Override
public Entity getContribution() {
return context;
}
+ @Override
public Fitness getContributionFitness() {
return context.getFitness();
}
@@ -146,27 +148,11 @@ public class SplitCooperativeAlgorithm extends MultiPopulationBasedAlgorithm imp
* method sets the fitness for the context of the cooperating algorithm, i.e. the fitness for all
* cooperating algorithms as a whole.
*/
+ @Override
public void updateContributionFitness(Fitness fitness) {
context.setFitness(fitness);
}
-/* public Iterator<Algorithm> iterator() {
- if(populationIterator == null)
- throw new InitialisationException("The PopulationIterator has not been initialised yet.");
- return populationIterator.clone();
- }
-
- public Iterator getPopulationtIterator() {
- return populationIterator;
- }
-
- public void setPopulationIterator(PopulationIterator iterator) {
- if(subPopulationsAlgorithms == null)
- throw new InitialisationException("The populations (ArrayList<Algorithms>) have not been initialised yet.");
- populationIterator = iterator;
- populationIterator.setPopulations(subPopulationsAlgorithms);
- }
-*/
public FitnessUpdateStrategy getFitnessUpdateStrategy() {
return fitnessUpdateStrategy;
}
@@ -175,9 +161,6 @@ public class SplitCooperativeAlgorithm extends MultiPopulationBasedAlgorithm imp
this.fitnessUpdateStrategy = fitnessUpdate;
}
- // @Initialiser
- // QUESTION are initialisations (or initialisers) still deprecated? Should we use @Initialiser
- // here instead?
@Override
public void performInitialisation() {
context.setCandidateSolution(optimisationProblem.getDomain().getBuiltRepresenation().getClone());
@@ -204,7 +187,8 @@ public class SplitCooperativeAlgorithm extends MultiPopulationBasedAlgorithm imp
participantProblem.updateContext(context);
ParticipatingAlgorithm participantAlgorithm = (ParticipatingAlgorithm) population;
contributionUpdateStrategy.updateContribution(participantAlgorithm.getContribution(), 0, context, participantProblem.getOffset(), participantProblem.getDimension());
- fitnessUpdateStrategy.updateFitness(optimisationProblem, context);
+ //TODO: The following statement might move out of this for-loop when I start clustering using the algorithm
+ fitnessUpdateStrategy.updateFitness(context);
}
}
diff --git a/src/main/java/net/sourceforge/cilib/cooperative/contributionupdatestrategies/StandardContributionUpdateStrategy.java b/src/main/java/net/sourceforge/cilib/cooperative/contributionupdatestrategies/StandardContributionUpdateStrategy.java
index 133601d..51e618f 100644
--- a/src/main/java/net/sourceforge/cilib/cooperative/contributionupdatestrategies/StandardContributionUpdateStrategy.java
+++ b/src/main/java/net/sourceforge/cilib/cooperative/contributionupdatestrategies/StandardContributionUpdateStrategy.java
@@ -28,8 +28,10 @@ import net.sourceforge.cilib.entity.Entity;
* TODO: Complete this javadoc.
*/
public class StandardContributionUpdateStrategy implements ContributionUpdateStrategy {
+
+ @Override
public void updateContribution(Entity src, int srcPos, CooperativeEntity dst, int dstPos, int length) {
- //copy participant contribution to context only when the participant's fitness is better than the context's fitness
+ //always copy participant contribution to context
dst.update(src, srcPos, dstPos, length);
}
}
diff --git a/src/main/java/net/sourceforge/cilib/cooperative/fitnessupdatestrategies/FitnessUpdateStrategy.java b/src/main/java/net/sourceforge/cilib/cooperative/fitnessupdatestrategies/FitnessUpdateStrategy.java
index bfda263..7baec6c 100644
--- a/src/main/java/net/sourceforge/cilib/cooperative/fitnessupdatestrategies/FitnessUpdateStrategy.java
+++ b/src/main/java/net/sourceforge/cilib/cooperative/fitnessupdatestrategies/FitnessUpdateStrategy.java
@@ -22,20 +22,17 @@
package net.sourceforge.cilib.cooperative.fitnessupdatestrategies;
import net.sourceforge.cilib.entity.Entity;
-import net.sourceforge.cilib.problem.OptimisationProblem;
+import net.sourceforge.cilib.measurement.single.Fitness;
/**
- * Update the {@linkplain Fitness} for the current {@linkplain Entity} based on
- * the provided {@linkplain OptimisationProblem}.
+ * Update the {@linkplain Fitness} for the current {@linkplain Entity}.
*/
public interface FitnessUpdateStrategy {
/**
- * Update the fitness of the provided {@linkplain Entity}, based on the current
- * {@linkplain OptimisationProblem}.
- * @param problem The {@linkplain OptimisationProblem} to base the fitness
- * calculation on.
+ * Update the fitness of the provided {@linkplain Entity}.
+ *
* @param context The {@linkplain Entity} to apply the fitness update on.
*/
- void updateFitness(OptimisationProblem problem, Entity context);
+ void updateFitness(Entity context);
}
diff --git a/src/main/java/net/sourceforge/cilib/cooperative/fitnessupdatestrategies/StandardFitnessUpdateStrategy.java b/src/main/java/net/sourceforge/cilib/cooperative/fitnessupdatestrategies/StandardFitnessUpdateStrategy.java
index 983d20c..f5762f2 100644
--- a/src/main/java/net/sourceforge/cilib/cooperative/fitnessupdatestrategies/StandardFitnessUpdateStrategy.java
+++ b/src/main/java/net/sourceforge/cilib/cooperative/fitnessupdatestrategies/StandardFitnessUpdateStrategy.java
@@ -22,7 +22,6 @@
package net.sourceforge.cilib.cooperative.fitnessupdatestrategies;
import net.sourceforge.cilib.entity.Entity;
-import net.sourceforge.cilib.problem.OptimisationProblem;
/**
* TODO: Complete this javadoc.
@@ -32,7 +31,8 @@ public class StandardFitnessUpdateStrategy implements FitnessUpdateStrategy {
/**
* {@inheritDoc}
*/
- public void updateFitness(OptimisationProblem problem, Entity context) {
+ @Override
+ public void updateFitness(Entity context) {
//context.setFitness(problem.getFitness(context.get(), true));
context.calculateFitness();
}
diff --git a/src/main/java/net/sourceforge/cilib/entity/EntityType.java b/src/main/java/net/sourceforge/cilib/entity/EntityType.java
index 4b41624..115eeb2 100644
--- a/src/main/java/net/sourceforge/cilib/entity/EntityType.java
+++ b/src/main/java/net/sourceforge/cilib/entity/EntityType.java
@@ -34,7 +34,8 @@ public enum EntityType {
public enum Particle {
BEST_POSITION,
BEST_FITNESS,
- VELOCITY;
+ VELOCITY,
+ CHARGE;
public enum Guide {
LOCAL_GUIDE,
diff --git a/src/main/java/net/sourceforge/cilib/entity/Topology.java b/src/main/java/net/sourceforge/cilib/entity/Topology.java
index 63eba26..5d6e853 100644
--- a/src/main/java/net/sourceforge/cilib/entity/Topology.java
+++ b/src/main/java/net/sourceforge/cilib/entity/Topology.java
@@ -78,6 +78,18 @@ public interface Topology<E extends Entity>
*/
public boolean isEmpty();
+ /**
+ * Returns an <code>iterator</code> over all entities in the neighbourhood of the given
+ * {@link net.sourceforge.cilib.entity.Entity}.
+ *
+ * @param entity the {@link net.sourceforge.cilib.entity.Entity} in this
+ * {@link net.sourceforge.cilib.entity.Topology} whose neighbourhood is desired
+ * @return An iterator over all the neighbours of the given
+ * {@link net.sourceforge.cilib.entity.Entity}
+ * @author Theuns Cloete
+ */
+ public abstract Iterator<E> neighbourhood(E entity);
+
/**
* Remove all the entities from the topology.
* {@inheritDoc}
diff --git a/src/main/java/net/sourceforge/cilib/entity/topologies/GBestTopology.java b/src/main/java/net/sourceforge/cilib/entity/topologies/GBestTopology.java
index 3e81aae..7114665 100644
--- a/src/main/java/net/sourceforge/cilib/entity/topologies/GBestTopology.java
+++ b/src/main/java/net/sourceforge/cilib/entity/topologies/GBestTopology.java
@@ -80,6 +80,14 @@ public class GBestTopology<E extends Entity> extends AbstractTopology<E> {
return new GBestTopologyIterator<E>(this);
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Iterator<E> neighbourhood(E entity) {
+ return new GBestTopologyIterator<E>(this, entity);
+ }
+
@Override
public boolean add(E particle) {
return entities.add(particle);
@@ -239,6 +247,16 @@ public class GBestTopology<E extends Entity> extends AbstractTopology<E> {
index = -1;
}
+ /**
+ * Construct an iterator that can iterate over the given entity's neighbourhood.
+ * @param topology the topology in which the given entity resides
+ * @param entity the entity whos neighbourhood is desired
+ */
+ public GBestTopologyIterator(GBestTopology<T> topology, T entity) {
+ this.topology = topology;
+ this.index = indexOf(entity);
+ }
+
@Override
public int getIndex() {
return index;
diff --git a/src/main/java/net/sourceforge/cilib/entity/topologies/LBestTopology.java b/src/main/java/net/sourceforge/cilib/entity/topologies/LBestTopology.java
index 9d3863a..15f2792 100644
--- a/src/main/java/net/sourceforge/cilib/entity/topologies/LBestTopology.java
+++ b/src/main/java/net/sourceforge/cilib/entity/topologies/LBestTopology.java
@@ -86,6 +86,16 @@ public class LBestTopology<E extends Entity> extends GBestTopology<E> {
}
/**
+ * {@inheritDoc}
+ * @author Theuns Cloete
+ */
+ @Override
+ public Iterator<E> neighbourhood(E entity) {
+ this.neighbourhoodSize.updateParameter();
+ return new LBestNeighbourhoodIterator<E>(this, entity);
+ }
+
+ /**
* Sets the {@linkplain ControlParameter} that should be used to determine the
* number of particles in the neighbourhood of each particle. The default is a
* {@linkplain ConstantControlParameter} with the parameter set to 3.
@@ -127,6 +137,21 @@ public class LBestTopology<E extends Entity> extends GBestTopology<E> {
count = 0;
}
+ /**
+ * Construct an iterator that can iterate over the given entity's neighbourhood.
+ * @param topology the topology in which the given entity resides
+ * @param entity the entity whos neighbourhood is desired
+ */
+ public LBestNeighbourhoodIterator(LBestTopology<T> topology, T entity) {
+ this.topology = topology;
+ this.index = indexOf(entity) - (this.topology.getNeighbourhoodSize() / 2) - 1;
+
+ if (this.index < 0) {
+ this.index += this.topology.size();
+ }
+ this.count = 0;
+ }
+
@Override
public int getIndex() {
return index;
diff --git a/src/main/java/net/sourceforge/cilib/entity/topologies/VonNeumannTopology.java b/src/main/java/net/sourceforge/cilib/entity/topologies/VonNeumannTopology.java
index 3d658a5..2b0f8cb 100644
--- a/src/main/java/net/sourceforge/cilib/entity/topologies/VonNeumannTopology.java
+++ b/src/main/java/net/sourceforge/cilib/entity/topologies/VonNeumannTopology.java
@@ -89,6 +89,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public VonNeumannTopology<E> getClone() {
return new VonNeumannTopology<E>(this);
}
@@ -97,14 +98,21 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
* {@inheritDoc}
*/
@SuppressWarnings("unchecked")
+ @Override
public Iterator<E> neighbourhood(Iterator<? extends Entity> iterator) {
MatrixIterator<E> i = (MatrixIterator<E>) iterator;
return new VonNeumannNeighbourhoodIterator<E>(this, i);
}
+ @Override
+ public Iterator<E> neighbourhood(E entity) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
/**
* {@inheritDoc}
*/
+ @Override
public Iterator<E> iterator() {
return new VonNeumannTopologyIterator<E>(this);
}
@@ -112,6 +120,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public boolean add(E particle) {
int min = entities.size();
ArrayList<E> shortest = null;
@@ -136,6 +145,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public boolean addAll(Collection<? extends E> set) {
this.entities.ensureCapacity(this.entities.size()+set.size());
Iterator<? extends E> i = set.iterator();
@@ -150,6 +160,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public int size() {
// TODO: couldn't we just return entities.size()?
int size = 0;
@@ -193,6 +204,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public boolean hasNext() {
return row != topology.lastRow || col != topology.lastCol;
}
@@ -200,6 +212,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public T next() {
if (row == topology.lastRow && col == topology.lastCol) {
throw new NoSuchElementException();
@@ -217,6 +230,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public void remove() {
if (col == -1) {
throw new IllegalStateException();
@@ -234,6 +248,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public int getRow() {
return row;
}
@@ -241,6 +256,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public int getCol() {
return col;
}
@@ -269,6 +285,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public boolean hasNext() {
return (index != Direction.DONE);
}
@@ -276,6 +293,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public T next() {
switch (index) {
case CENTER: {
@@ -342,6 +360,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public void remove() {
topology.remove(row, col);
if (index == Direction.CENTER) {
@@ -352,6 +371,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public int getRow() {
return row;
}
@@ -359,6 +379,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public int getCol() {
return col;
}
@@ -368,6 +389,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public boolean remove(E indiv) {
throw new UnsupportedOperationException("Method not supported in VonNeumannTopology");
}
@@ -375,6 +397,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public E get(int index) {
throw new UnsupportedOperationException("Method not supported in VonNeumannTopology");
}
@@ -382,6 +405,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public E set(int index, E indiv) {
throw new UnsupportedOperationException("Method not supported in VonNeumannTopology");
}
@@ -389,6 +413,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public List<E> asList() {
List<E> entityList = new ArrayList<E>();
for (ArrayList<E> i : entities){
@@ -400,6 +425,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public boolean isEmpty() {
throw new UnsupportedOperationException("Method not supported in VonNeumannTopology");
}
@@ -407,6 +433,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public void clear() {
throw new UnsupportedOperationException("Method not supported in VonNeumannTopology");
}
@@ -487,6 +514,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public boolean addAll(int index, Collection<? extends E> c) {
throw new UnsupportedOperationException("Method not supported in VonNeumannTopology");
}
@@ -494,6 +522,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public void add(int index, E element) {
throw new UnsupportedOperationException("Method not supported in VonNeumannTopology");
}
@@ -501,6 +530,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public E remove(int index) {
throw new UnsupportedOperationException("Method not supported in VonNeumannTopology");
}
@@ -508,6 +538,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public int indexOf(Object o) {
throw new UnsupportedOperationException("Method not supported in VonNeumannTopology");
}
@@ -515,6 +546,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public int lastIndexOf(Object o) {
throw new UnsupportedOperationException("Method not supported in VonNeumannTopology");
}
@@ -522,6 +554,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public ListIterator<E> listIterator() {
throw new UnsupportedOperationException("Method not supported in VonNeumannTopology");
}
@@ -529,6 +562,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public ListIterator<E> listIterator(int index) {
throw new UnsupportedOperationException("Method not supported in VonNeumannTopology");
}
@@ -536,6 +570,7 @@ public class VonNeumannTopology<E extends Entity> extends AbstractTopology<E> {
/**
* {@inheritDoc}
*/
+ @Override
public List<E> subList(int fromIndex, int toIndex) {
throw new UnsupportedOperationException("Method not supported in VonNeumannTopology");
}
diff --git a/src/main/java/net/sourceforge/cilib/functions/clustering/ClusteringFitnessFunction.java b/src/main/java/net/sourceforge/cilib/functions/clustering/ClusteringFitnessFunction.java
index f039027..94243e6 100644
--- a/src/main/java/net/sourceforge/cilib/functions/clustering/ClusteringFitnessFunction.java
+++ b/src/main/java/net/sourceforge/cilib/functions/clustering/ClusteringFitnessFunction.java
@@ -31,7 +31,7 @@ import org.slf4j.LoggerFactory;
import net.sourceforge.cilib.functions.ContinuousFunction;
import net.sourceforge.cilib.functions.clustering.clustercenterstrategies.ClusterCenterStrategy;
import net.sourceforge.cilib.functions.clustering.clustercenterstrategies.ClusterCentroidStrategy;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet.Pattern;
+import net.sourceforge.cilib.problem.dataset.Pattern;
import net.sourceforge.cilib.type.types.container.Vector;
import net.sourceforge.cilib.util.ClusteringUtils;
@@ -68,6 +68,7 @@ public abstract class ClusteringFitnessFunction extends ContinuousFunction {
clusterCenterStrategy = new ClusterCentroidStrategy();
}
+ @Override
public abstract ClusteringFitnessFunction getClone();
/**
@@ -97,7 +98,7 @@ public abstract class ClusteringFitnessFunction extends ContinuousFunction {
*/
@Override
public double evaluate(Vector centroids) {
- helper = ClusteringUtils.get(); //this statement should not be in a constructor
+ helper = ClusteringUtils.get(); //this statement should not be in a constructor
helper.arrangeClustersAndCentroids(centroids);
arrangedClusters = helper.getArrangedClusters();
arrangedCentroids = helper.getArrangedCentroids();
diff --git a/src/main/java/net/sourceforge/cilib/functions/clustering/KHarmonicMeansFunction.java b/src/main/java/net/sourceforge/cilib/functions/clustering/KHarmonicMeansFunction.java
index c5e2044..cf38491 100644
--- a/src/main/java/net/sourceforge/cilib/functions/clustering/KHarmonicMeansFunction.java
+++ b/src/main/java/net/sourceforge/cilib/functions/clustering/KHarmonicMeansFunction.java
@@ -21,7 +21,7 @@
*/
package net.sourceforge.cilib.functions.clustering;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet.Pattern;
+import net.sourceforge.cilib.problem.dataset.Pattern;
import net.sourceforge.cilib.type.types.container.Vector;
/**
diff --git a/src/main/java/net/sourceforge/cilib/functions/clustering/clustercenterstrategies/ClusterMeanStrategy.java b/src/main/java/net/sourceforge/cilib/functions/clustering/clustercenterstrategies/ClusterMeanStrategy.java
index 38b21a1..575faa7 100644
--- a/src/main/java/net/sourceforge/cilib/functions/clustering/clustercenterstrategies/ClusterMeanStrategy.java
+++ b/src/main/java/net/sourceforge/cilib/functions/clustering/clustercenterstrategies/ClusterMeanStrategy.java
@@ -24,7 +24,7 @@ package net.sourceforge.cilib.functions.clustering.clustercenterstrategies;
import java.util.Collection;
import net.sourceforge.cilib.math.StatUtils;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet.Pattern;
+import net.sourceforge.cilib.problem.dataset.Pattern;
import net.sourceforge.cilib.type.types.container.Vector;
import net.sourceforge.cilib.util.ClusteringUtils;
diff --git a/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/DaviesBouldinIndex.java b/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/DaviesBouldinIndex.java
index db17062..c880f0c 100644
--- a/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/DaviesBouldinIndex.java
+++ b/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/DaviesBouldinIndex.java
@@ -23,7 +23,7 @@ package net.sourceforge.cilib.functions.clustering.validityindices;
import java.util.Collection;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet.Pattern;
+import net.sourceforge.cilib.problem.dataset.Pattern;
import net.sourceforge.cilib.type.types.container.Vector;
/**
diff --git a/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/DunnIndex33.java b/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/DunnIndex33.java
index 3aa6708..ee0992f 100644
--- a/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/DunnIndex33.java
+++ b/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/DunnIndex33.java
@@ -24,7 +24,7 @@ package net.sourceforge.cilib.functions.clustering.validityindices;
import java.util.Collection;
import net.sourceforge.cilib.functions.clustering.clustercenterstrategies.ClusterMeanStrategy;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet.Pattern;
+import net.sourceforge.cilib.problem.dataset.Pattern;
import net.sourceforge.cilib.type.types.container.Vector;
/**
diff --git a/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/DunnIndex53.java b/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/DunnIndex53.java
index 79b4d98..0ac0f32 100644
--- a/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/DunnIndex53.java
+++ b/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/DunnIndex53.java
@@ -23,7 +23,7 @@ package net.sourceforge.cilib.functions.clustering.validityindices;
import java.util.Collection;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet.Pattern;
+import net.sourceforge.cilib.problem.dataset.Pattern;
import net.sourceforge.cilib.type.types.container.Vector;
/**
diff --git a/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/HalkidiVazirgiannisIndex.java b/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/HalkidiVazirgiannisIndex.java
index 11a6684..c327c66 100644
--- a/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/HalkidiVazirgiannisIndex.java
+++ b/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/HalkidiVazirgiannisIndex.java
@@ -23,7 +23,7 @@ package net.sourceforge.cilib.functions.clustering.validityindices;
import net.sourceforge.cilib.functions.clustering.ClusteringFitnessFunction;
import net.sourceforge.cilib.math.StatUtils;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet.Pattern;
+import net.sourceforge.cilib.problem.dataset.Pattern;
import net.sourceforge.cilib.type.types.container.Vector;
/**
diff --git a/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/MaulikBandyopadhyayIndex.java b/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/MaulikBandyopadhyayIndex.java
index 82624f9..0d59a61 100644
--- a/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/MaulikBandyopadhyayIndex.java
+++ b/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/MaulikBandyopadhyayIndex.java
@@ -22,7 +22,7 @@
package net.sourceforge.cilib.functions.clustering.validityindices;
import net.sourceforge.cilib.functions.clustering.ClusteringFitnessFunction;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet.Pattern;
+import net.sourceforge.cilib.problem.dataset.Pattern;
import net.sourceforge.cilib.type.types.container.Vector;
/**
diff --git a/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/VeenmanReindersBackerIndex.java b/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/VeenmanReindersBackerIndex.java
index db39f5e..d0d13d4 100644
--- a/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/VeenmanReindersBackerIndex.java
+++ b/src/main/java/net/sourceforge/cilib/functions/clustering/validityindices/VeenmanReindersBackerIndex.java
@@ -29,7 +29,7 @@ import net.sourceforge.cilib.controlparameter.ControlParameter;
import net.sourceforge.cilib.functions.clustering.ClusteringFitnessFunction;
import net.sourceforge.cilib.functions.clustering.clustercenterstrategies.ClusterMeanStrategy;
import net.sourceforge.cilib.math.StatUtils;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet.Pattern;
+import net.sourceforge.cilib.problem.dataset.Pattern;
import net.sourceforge.cilib.type.types.container.Vector;
/**
diff --git a/src/main/java/net/sourceforge/cilib/math/StatUtils.java b/src/main/java/net/sourceforge/cilib/math/StatUtils.java
index 792211c..6cc73d4 100644
--- a/src/main/java/net/sourceforge/cilib/math/StatUtils.java
+++ b/src/main/java/net/sourceforge/cilib/math/StatUtils.java
@@ -23,7 +23,7 @@ package net.sourceforge.cilib.math;
import java.util.Collection;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet.Pattern;
+import net.sourceforge.cilib.problem.dataset.Pattern;
import net.sourceforge.cilib.type.types.Numeric;
import net.sourceforge.cilib.type.types.container.Vector;
diff --git a/src/main/java/net/sourceforge/cilib/measurement/single/NumberOfClustersFormed.java b/src/main/java/net/sourceforge/cilib/measurement/single/NumberOfClustersFormed.java
index 132160e..dfb0f3e 100644
--- a/src/main/java/net/sourceforge/cilib/measurement/single/NumberOfClustersFormed.java
+++ b/src/main/java/net/sourceforge/cilib/measurement/single/NumberOfClustersFormed.java
@@ -21,8 +21,14 @@
*/
package net.sourceforge.cilib.measurement.single;
+import java.util.ArrayList;
+import java.util.Hashtable;
+
import net.sourceforge.cilib.algorithm.Algorithm;
import net.sourceforge.cilib.measurement.Measurement;
+import net.sourceforge.cilib.problem.dataset.DataSetBuilder;
+import net.sourceforge.cilib.problem.dataset.Pattern;
+import net.sourceforge.cilib.problem.dataset.StaticDataSetBuilder;
import net.sourceforge.cilib.type.types.Int;
import net.sourceforge.cilib.type.types.Type;
import net.sourceforge.cilib.type.types.container.Vector;
@@ -33,13 +39,13 @@ import net.sourceforge.cilib.util.ClusteringUtils;
* For this measurement to work, the following is important:
* <ol>
* <li><tt>Algorithm.get()</tt> should not be <tt>null</tt>.</li>
- * <li>The algorithm's best solution (best position) should return a {@linkplain Vector}.</li>
- * <li>The algorithm's problem's {@linkplain DataSetBuilder} should be a
- * {@linkplain ClusterableDataSet}.</li>
- * <li>The <tt>arrangeClustersAndCentroids()</tt> method (defined in
- * {@linkplain ClusterableDataSet}) should be implemented to remove <i>empty clusters</i>.</li>
- * <li>The <tt>getArrangedClusters()</tt> method (defined in {@linkplain ClusterableDataSet})
- * should be implemented to return the list of non-empty clusters.</li>
+ * <li>The algorithm's best solution (best position) should return a {@link Vector}.</li>
+ * <li>The algorithm's problem's {@link DataSetBuilder} should be a
+ * {@link StaticDataSetBuilder}.</li>
+ * <li>The {@link ClusteringUtils#arrangeClustersAndCentroids(net.sourceforge.cilib.type.types.container.Vector)} method
+ * should be implemented to remove <i>empty clusters</i>.</li>
+ * <li>The {@link ClusteringUtils#getArrangedClusters()} method should be implemented to return the list of non-empty
+ * clusters.</li>
* </ol>
* @author Theuns Cloete
*/
@@ -52,18 +58,51 @@ public class NumberOfClustersFormed implements Measurement {
public NumberOfClustersFormed(NumberOfClustersFormed rhs) {
}
+ @Override
public NumberOfClustersFormed getClone() {
return new NumberOfClustersFormed(this);
}
+ @Override
public String getDomain() {
return "Z";
}
+ @Override
public Type getValue(Algorithm algorithm) {
ClusteringUtils helper = ClusteringUtils.get();
Vector centroids = (Vector) algorithm.getBestSolution().getPosition();
helper.arrangeClustersAndCentroids(centroids);
+ plotClusters();
return new Int(helper.getArrangedCentroids().size());
}
+
+ private void plotClusters() {
+ System.out.println("reset");
+ System.out.println("set term jpeg medium");
+ System.out.println("set output \"iteration." + String.format("%04d", Algorithm.get().getIterations()) + ".jpg\"");
+ System.out.print("plot [-0.5:10][-5:5] sin(x) - 0.5, 0.5 - sin(x), ");
+
+ ArrayList<Hashtable<Integer, Pattern>> arrangedClusters = ClusteringUtils.get().getArrangedClusters();
+ ArrayList<Vector> arrangedCentroids = ClusteringUtils.get().getArrangedCentroids();
+ for (int i = 0; i < arrangedClusters.size() * 2; i++) {
+ System.out.print("'-'");
+ if (i < arrangedClusters.size() * 2 - 1) {
+ System.out.print(", ");
+ }
+ }
+ System.out.println();
+
+ for (Hashtable<Integer, Pattern> cluster : arrangedClusters) {
+ for (Pattern pattern : cluster.values()) {
+ System.out.println(pattern);
+ }
+ System.out.println('e');
+ }
+
+ for (Vector centroid : arrangedCentroids) {
+ System.out.println(centroid.toString('\0', '\0', '\t'));
+ System.out.println('e');
+ }
+ }
}
diff --git a/src/main/java/net/sourceforge/cilib/problem/ClusteringProblem.java b/src/main/java/net/sourceforge/cilib/problem/ClusteringProblem.java
index 068b9c0..082dd18 100644
--- a/src/main/java/net/sourceforge/cilib/problem/ClusteringProblem.java
+++ b/src/main/java/net/sourceforge/cilib/problem/ClusteringProblem.java
@@ -24,8 +24,7 @@ package net.sourceforge.cilib.problem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import net.sourceforge.cilib.problem.dataset.AssociatedPairDataSetBuilder;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet;
+import net.sourceforge.cilib.problem.dataset.StaticDataSetBuilder;
import net.sourceforge.cilib.problem.dataset.DataSetBuilder;
import net.sourceforge.cilib.problem.dataset.DataSetManager;
import net.sourceforge.cilib.type.DomainParser;
@@ -40,7 +39,7 @@ import net.sourceforge.cilib.util.EuclideanDistanceMeasure;
* <p>
* This class is used to setup/configure a problem that is capable of clustering the data in
* a dataset, more specifically the data contained in an
- * {@link net.sourceforge.cilib.problem.dataset.AssociatedPairDataSetBuilder}. Clustering is an
+ * {@link net.sourceforge.cilib.problem.dataset.StaticDataSetBuilder}. Clustering is an
* {@link net.sourceforge.cilib.problem.OptimisationProblemAdapter optimisation} problem. The process of optimising a
* clustering is driven by a fitness function that determines the fitness of a specific
* clustering. This class therefore wraps a {@link net.sourceforge.cilib.problem.FunctionOptimisationProblem} (called the
@@ -217,6 +216,7 @@ public class ClusteringProblem extends OptimisationProblemAdapter {
*
* @return the {@link #domainRegistry} of this clustering problem
*/
+ @Override
public DomainRegistry getBehaviouralDomain() {
return domainRegistry;
}
@@ -245,6 +245,7 @@ public class ClusteringProblem extends OptimisationProblemAdapter {
* @return the {@link #innerProblem}'s {@linkplain net.sourceforge.cilib.problem.FunctionOptimisationProblem#function function's}
* domain registry
*/
+ @Override
public DomainRegistry getDomain() {
return innerProblem.getFunction().getDomainRegistry();
}
@@ -254,21 +255,21 @@ public class ClusteringProblem extends OptimisationProblemAdapter {
* {@link DataSetBuilder}. Then use the {@link ClusteringUtils} per-thread singleton to
* set the {@link DataSetBuilder} as the current dataset for this clustering.
*
- * @throws IllegalArgumentException when the given {@link net.sourceforge.cilib.problem.dataset.DataSetBuilder} is not an
- * {@link net.sourceforge.cilib.problem.dataset.AssociatedPairDataSetBuilder}. This is only temporary, because I
+ * @throws IllegalArgumentException when the given {@link net.sourceforge.cilib.problem.dataset.DataSetBuilder} is not a
+ * {@link net.sourceforge.cilib.problem.dataset.StaticDataSetBuilder}. This is only temporary, because I
* didn't want to change the more generic {@link net.sourceforge.cilib.problem.dataset.DataSetBuilder} too much.
* @param dsb the {@link net.sourceforge.cilib.problem.dataset.DataSetBuilder} that represents the dataset that should be
* clustered
*/
@Override
public void setDataSetBuilder(DataSetBuilder dsb) {
- if (!(dsb instanceof AssociatedPairDataSetBuilder))
- throw new IllegalArgumentException("This ClusteringProblem expects an AssociatedPairDataSet\nONLY FOR NOW\nBECAUSE I didn't want to change the more generic DataSetBuilder");
+ if (!(dsb instanceof StaticDataSetBuilder))
+ throw new IllegalArgumentException("This ClusteringProblem expects a StaticDataSetBuilder\nONLY FOR NOW\nBECAUSE I didn't want to change the more generic DataSetBuilder");
- AssociatedPairDataSetBuilder builder = (AssociatedPairDataSetBuilder) dsb;
+ StaticDataSetBuilder builder = (StaticDataSetBuilder) dsb;
- dataSetBuilder = DataSetManager.getInstance().getDataSetBuilder(builder);
- ClusteringUtils.get().setClusterableDataSet((ClusterableDataSet) dataSetBuilder);
+ this.dataSetBuilder = DataSetManager.getInstance().getDataSetBuilder(builder);
+ ClusteringUtils.get().setDataSetBuilder((StaticDataSetBuilder) this.dataSetBuilder);
}
/**
diff --git a/src/main/java/net/sourceforge/cilib/problem/dataset/ClusterableDataSet.java b/src/main/java/net/sourceforge/cilib/problem/dataset/ClusterableDataSet.java
deleted file mode 100644
index 1d22eea..0000000
--- a/src/main/java/net/sourceforge/cilib/problem/dataset/ClusterableDataSet.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2003 - 2008
- * Computational Intelligence Research Group (CIRG@UP)
- * Department of Computer Science
- * University of Pretoria
- * South Africa
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-package net.sourceforge.cilib.problem.dataset;
-
-import java.util.ArrayList;
-
-import net.sourceforge.cilib.type.types.container.Vector;
-import net.sourceforge.cilib.util.Cloneable;
-
-/**
- * All datasets that will be clustered have to implement this interface.
- * @author Theuns Cloete
- */
-public interface ClusterableDataSet {
-
- public int getNumberOfPatterns();
-
- public Pattern getPattern(int index);
-
- public ArrayList<Pattern> getPatterns();
- public Vector getMean();
- public double getVariance();
- public double getCachedDistance(int x, int y);
- public void initialise();
-
- /**
- * TODO: Complete this javadoc.
- */
- public class Pattern implements Cloneable {
- private static final long serialVersionUID = 8831874859964777328L;
- private String clas = "<not set>";
- public Vector data = null;
-
- public Pattern(String c, Vector d) {
- clas = c;
- data = d;
- }
-
- public Pattern(Pattern rhs) {
- clas = rhs.clas;
- data = rhs.data;
- }
-
- public Pattern getClone() {
- return new Pattern(this);
- }
-
- public String toString() {
- return clas + " -> " + data;
- }
- }
-}
diff --git a/src/main/java/net/sourceforge/cilib/problem/dataset/DataSet.java b/src/main/java/net/sourceforge/cilib/problem/dataset/DataSet.java
index 4385f60..d3f156f 100644
--- a/src/main/java/net/sourceforge/cilib/problem/dataset/DataSet.java
+++ b/src/main/java/net/sourceforge/cilib/problem/dataset/DataSet.java
@@ -23,6 +23,7 @@ package net.sourceforge.cilib.problem.dataset;
import java.io.InputStream;
import java.io.Serializable;
+import java.util.ArrayList;
import net.sourceforge.cilib.util.Cloneable;
@@ -35,19 +36,20 @@ import net.sourceforge.cilib.util.Cloneable;
public abstract class DataSet implements Cloneable, Serializable {
private static final long serialVersionUID = 5190227337412349440L;
- @Deprecated
- protected String patternExpression = null;
+ protected String identifier = null;
public DataSet() {
- patternExpression = "";
+ identifier = "<not set>";
}
public DataSet(DataSet rhs) {
- patternExpression = new String(rhs.patternExpression);
+ identifier = rhs.identifier;
}
public abstract DataSet getClone();
+ public abstract ArrayList<Pattern> parseDataSet();
+
/**
* Returns the data set as a byte array.
* @return the data set as a <code>byte[]</code>
@@ -61,23 +63,23 @@ public abstract class DataSet implements Cloneable, Serializable {
public abstract InputStream getInputStream();
/**
- * Set the regular expression that will be used to split the patterns in the provided DataSet
- * file. The format of this regular expression depends on where you are calling the method from.
- * When you specify the regular expression in a simulation XML file, the format should be a
- * standard regular expression. When you call this method directly with a regular expression in
- * double quotes (from a Java source file), then the format of the regular expression should be a
- * Java style regular expression.
- * @param regexp The regex to use
+ * Get the unique identifier of this data set.
+ *
+ * @return the unique identifier of this data set
*/
- public void setPatternExpression(String regexp) {
- patternExpression = regexp;
+ public String getIdentifier() {
+ return identifier;
}
/**
- * Get the regular expression that has been set for this DataSet.
- * @return The regular expression.
+ * Set the identifier of this data set. In the case of a file on disk, i.e. when using
+ * {@link LocalDataSet}, the filename will be used as the identifier. In the case of a
+ * dynamic data set, i.e. when using {@link DynamicDataSet}, a generated will might be
+ * used as the identifier.
+ *
+ * @param id the identifier of the data set
*/
- public String getPatternExpression() {
- return patternExpression;
+ public void setIdentifier(String id) {
+ identifier = id;
}
}
diff --git a/src/main/java/net/sourceforge/cilib/problem/dataset/DataSetManager.java b/src/main/java/net/sourceforge/cilib/problem/dataset/DataSetManager.java
index bed926c..6145dcc 100644
--- a/src/main/java/net/sourceforge/cilib/problem/dataset/DataSetManager.java
+++ b/src/main/java/net/sourceforge/cilib/problem/dataset/DataSetManager.java
@@ -25,7 +25,9 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.Hashtable;
-import net.sourceforge.cilib.problem.dataset.ClusterableDataSet.Pattern;
+import net.sourceforge.cilib.problem.Problem;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* This class is a Singleton and is responsible for managing all the {@link DataSet}s and
@@ -37,23 +39,24 @@ import net.sourceforge.cilib.problem.dataset.ClusterableDataSet.Pattern;
* {@link Pattern}s that have been returned by the {@link LocalDataSet#parseDataSet()}
* method) makes sure that a specific dataset is parsed and instantiated only once. <br/>
* The second, {@link #builders} (with its <code>key</code> the identifier of the dataset
- * builder and its <code>value</code> the {@link AssociatedPairDataSetBuilder} object)
+ * builder and its <code>value</code> the {@link StaticDataSetBuilder} object)
* makes sure that a specific dataset builder is built and initialised only once.<br/> The
* concrete {@link LocalDataSet} is used, but only for now, because I didn't want to change
- * the more generic {@link DataSet}.<br/> The concrete {@link AssociatedPairDataSetBuilder} is
+ * the more generic {@link DataSet}.<br/> The concrete {@link StaticDataSetBuilder} is
* used, but only for now, because I didn't want to change the more generic
* {@link DataSetBuilder}.
*/
public final class DataSetManager implements Serializable {
private static final long serialVersionUID = 6735187580654161651L;
+ private static Logger logger = LoggerFactory.getLogger(DataSetManager.class);
private static volatile DataSetManager instance = null;
private Hashtable<String, ArrayList<Pattern>> datasets = null;
- private Hashtable<String, AssociatedPairDataSetBuilder> builders = null;
+ private Hashtable<String, StaticDataSetBuilder> builders = null;
private DataSetManager() {
datasets = new Hashtable<String, ArrayList<Pattern>>();
- builders = new Hashtable<String, AssociatedPairDataSetBuilder>();
+ builders = new Hashtable<String, StaticDataSetBuilder>();
}
public static synchronized DataSetManager getInstance() {
@@ -72,14 +75,15 @@ public final class DataSetManager implements Serializable {
* parsed/instantiated before
* @return an {@link ArrayList} of {@link Pattern}s representing the given dataset
*/
- public synchronized ArrayList<Pattern> getDataFromSet(LocalDataSet dataset) {
- String identifier = dataset.getFile();
+ public synchronized ArrayList<Pattern> getDataFromSet(DataSet dataset) {
+ String identifier = dataset.getIdentifier();
-// log.debug("Requesting " + identifier);
+ logger.debug("Requesting " + identifier);
if (!datasets.containsKey(identifier)) {
+ logger.debug("Parsing " + identifier);
datasets.put(identifier, dataset.parseDataSet());
}
-// log.debug("Returning " + identifier);
+ logger.debug("Returning " + identifier);
return datasets.get(identifier);
}
@@ -88,20 +92,20 @@ public final class DataSetManager implements Serializable {
* requested built up dataset. The dataset builder's identifier is used as the key into
* the {@link #builders} {@link Hashtable}.
...
[truncated message content] |