You can subscribe to this list here.
2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(2) |
Sep
(7) |
Oct
(1) |
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
(13) |
Feb
(17) |
Mar
(5) |
Apr
(10) |
May
(10) |
Jun
(42) |
Jul
(23) |
Aug
(38) |
Sep
(12) |
Oct
(9) |
Nov
(6) |
Dec
|
2005 |
Jan
(3) |
Feb
(17) |
Mar
(6) |
Apr
|
May
(1) |
Jun
(10) |
Jul
|
Aug
(10) |
Sep
|
Oct
(8) |
Nov
(2) |
Dec
(2) |
2006 |
Jan
(2) |
Feb
(11) |
Mar
(44) |
Apr
(84) |
May
(120) |
Jun
(18) |
Jul
|
Aug
(12) |
Sep
(19) |
Oct
(22) |
Nov
(7) |
Dec
(11) |
2007 |
Jan
(6) |
Feb
(10) |
Mar
(24) |
Apr
(13) |
May
(46) |
Jun
(25) |
Jul
(46) |
Aug
(47) |
Sep
(60) |
Oct
(61) |
Nov
(138) |
Dec
(47) |
2008 |
Jan
(6) |
Feb
(23) |
Mar
(58) |
Apr
(78) |
May
(82) |
Jun
(34) |
Jul
(56) |
Aug
(59) |
Sep
(54) |
Oct
(127) |
Nov
(47) |
Dec
(33) |
2009 |
Jan
(16) |
Feb
(18) |
Mar
(37) |
Apr
(162) |
May
(49) |
Jun
(58) |
Jul
(59) |
Aug
(17) |
Sep
(10) |
Oct
|
Nov
|
Dec
|
From: Marde G. <mg...@cs...> - 2009-09-18 11:54:05
|
-- This message is subject to the CSIR's copyright terms and conditions, e-mail legal notice, and implemented Open Document Format (ODF) standard. The full disclaimer details can be found at http://www.csir.co.za/disclaimer.html. This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. MailScanner thanks Transtec Computers for their support. |
From: Marde G. <mg...@cs...> - 2009-09-18 11:53:08
|
-- This message is subject to the CSIR's copyright terms and conditions, e-mail legal notice, and implemented Open Document Format (ODF) standard. The full disclaimer details can be found at http://www.csir.co.za/disclaimer.html. This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. MailScanner thanks Transtec Computers for their support. |
From: Gary P. <gpa...@gm...> - 2009-09-18 07:03:35
|
Hi all, It's been a while since the last release, but I'm glad to announce that 0.7.2 of CIlib has been released. Changes are as follows: Additions: - New domain parser implementation with simplified usage API. - Generic EP algorithm has been included. - Initial generic Niching framework (including the NichePSO) has been included with a selection of different available operators. - Updates to the Immutable Matrix API. - Algorithm hierarchy has been simplified to facility more testability. - Documentation updates. Removed: - Entity.getBehavioralDomain() method as it was no longer used - Algorithm.reset() method did not do anything - EntityType.Individual* enum has been removed as the manner in which strategy parameters are handled was not correct. Head on over to the website http://www.cilib.net and grab a copy. As always, feature / support / bug reports are welcome. Regards, CIlib Team. |
From: Gary P. <gpa...@gm...> - 2009-09-08 13:25:07
|
I like the refactor. Patch currently in testing. On Tuesday 08 September 2009 14:36:40 Andrich van Wyk wrote: > The Visitor abstract class only implemented a single method (isDone) and > had an empty default constructor (it maintained no instance fields). It > has therefore been changed to an interface and the responisibility of > isDone delegated to the implementing class. Updated extensions > accordingly. > --- > .../cilib/container/visitor/PrePostVisitor.java | 11 ++++++++++- > .../cilib/container/visitor/Visitor.java | 14 +++----------- > .../cilib/entity/visitor/ClosestEntityVisitor.java | 8 ++++++++ > .../cilib/entity/visitor/DiameterVisitor.java | 8 ++++++++ > .../cilib/entity/visitor/RadiusVisitor.java | 8 ++++++++ > .../cilib/entity/visitor/SpatialRadiusVisitor.java | 8 ++++++++ > .../cilib/entity/visitor/TopologyVisitor.java | 2 +- > .../foundation/NeuralNetworkRetrievalVisitor.java | 5 +++++ > .../sourceforge/cilib/problem/ProblemVisitor.java | 3 ++- > .../cilib/pso/particle/ParticleVisitor.java | 3 ++- > .../net/sourceforge/cilib/type/types/Types.java | 2 +- > 11 files changed, 56 insertions(+), 16 deletions(-) > > diff --git > a/src/main/java/net/sourceforge/cilib/container/visitor/PrePostVisitor.jav > a > b/src/main/java/net/sourceforge/cilib/container/visitor/PrePostVisitor.jav > a index 63ca955..207ba86 100644 > --- > a/src/main/java/net/sourceforge/cilib/container/visitor/PrePostVisitor.jav > a +++ > b/src/main/java/net/sourceforge/cilib/container/visitor/PrePostVisitor.jav > a @@ -31,7 +31,7 @@ package net.sourceforge.cilib.container.visitor; * > @author Gary Pampara > * @param <E> The element type. > */ > -public class PrePostVisitor<E> extends Visitor<E> { > +public class PrePostVisitor<E> implements Visitor<E> { > > /** > * Create a new instance of {@linkplain PrePostVisitor}. > @@ -48,6 +48,7 @@ public class PrePostVisitor<E> extends Visitor<E> { > /** > * {@inheritDoc} > */ > + @Override > public void visit(E o) {}; > > /** > @@ -55,4 +56,12 @@ public class PrePostVisitor<E> extends Visitor<E> { > * @param o The element to post visit. > */ > public void postVisit(E o) {}; > + > + /** > + * {@inheritDoc} > + */ > + @Override > + public boolean isDone() { > + return false; > + } > } > diff --git > a/src/main/java/net/sourceforge/cilib/container/visitor/Visitor.java > b/src/main/java/net/sourceforge/cilib/container/visitor/Visitor.java index > db5d38a..e0c9220 100644 > --- a/src/main/java/net/sourceforge/cilib/container/visitor/Visitor.java > +++ b/src/main/java/net/sourceforge/cilib/container/visitor/Visitor.java > @@ -24,16 +24,10 @@ package net.sourceforge.cilib.container.visitor; > /** > * Abstract class defining the general structure of a <tt>Visitor</tt>. > * > - * @author Gary Pampara > + * @author Gary Pampara, andrich > * @param <E> The type object. > */ > -public abstract class Visitor<E> { > - > - /** > - * Create the {@linkplain Visitor} instance. > - */ > - protected Visitor() { > - } > +public interface Visitor<E> { > > /** > * Visit the provided object. > @@ -46,7 +40,5 @@ public abstract class Visitor<E> { > * @return <code>true</code> if the visit operation is complete, > * <code>false</code> otherwise. > */ > - public boolean isDone() { > - return false; > - } > + public boolean isDone(); > } > diff --git > a/src/main/java/net/sourceforge/cilib/entity/visitor/ClosestEntityVisitor. > java > b/src/main/java/net/sourceforge/cilib/entity/visitor/ClosestEntityVisitor. > java index 6aa4580..97d229b 100644 > --- > a/src/main/java/net/sourceforge/cilib/entity/visitor/ClosestEntityVisitor. > java +++ > b/src/main/java/net/sourceforge/cilib/entity/visitor/ClosestEntityVisitor. > java @@ -35,6 +35,7 @@ public class ClosestEntityVisitor extends > TopologyVisitor { private Entity closestEntity; > private Entity targetEntity; > private double closest = Double.MAX_VALUE; > + private boolean done; > > /** > * Perform the search for the closest entity. > @@ -42,6 +43,7 @@ public class ClosestEntityVisitor extends TopologyVisitor > { */ > @Override > public void visit(Topology<? extends Entity> topology) { > + done = false; > closestEntity = null; > > for (Entity entity : topology) { > @@ -54,6 +56,7 @@ public class ClosestEntityVisitor extends TopologyVisitor > { this.closest = distance; > } > } > + done = true; > } > > /** > @@ -82,4 +85,9 @@ public class ClosestEntityVisitor extends TopologyVisitor > { this.targetEntity = targetEntity; > } > > + @Override > + public boolean isDone() { > + return done; > + } > + > } > diff --git > a/src/main/java/net/sourceforge/cilib/entity/visitor/DiameterVisitor.java > b/src/main/java/net/sourceforge/cilib/entity/visitor/DiameterVisitor.java > index 8c182a7..a7324c4 100644 > --- > a/src/main/java/net/sourceforge/cilib/entity/visitor/DiameterVisitor.java > +++ > b/src/main/java/net/sourceforge/cilib/entity/visitor/DiameterVisitor.java > @@ -34,12 +34,14 @@ import > net.sourceforge.cilib.type.types.container.Vector; public class > DiameterVisitor extends TopologyVisitor { > > private double distance = -Double.MAX_VALUE; > + private boolean done; > > public DiameterVisitor() { > } > > @Override > public void visit(Topology<? extends Entity> topology) { > + done = false; > double maxDistance = 0.0; > > Iterator<? extends Entity> k1 = topology.iterator(); > @@ -59,6 +61,7 @@ public class DiameterVisitor extends TopologyVisitor { > } > > distance = maxDistance; > + done = true; > } > > @Override > @@ -66,4 +69,9 @@ public class DiameterVisitor extends TopologyVisitor { > return this.distance; > } > > + @Override > + public boolean isDone() { > + return done; > + } > + > } > diff --git > a/src/main/java/net/sourceforge/cilib/entity/visitor/RadiusVisitor.java > b/src/main/java/net/sourceforge/cilib/entity/visitor/RadiusVisitor.java > index cebfdf5..400bfcc 100644 > --- a/src/main/java/net/sourceforge/cilib/entity/visitor/RadiusVisitor.java > +++ b/src/main/java/net/sourceforge/cilib/entity/visitor/RadiusVisitor.java > @@ -33,6 +33,7 @@ import net.sourceforge.cilib.type.types.container.Vector; > public class RadiusVisitor extends TopologyVisitor { > > private double radius = -Double.MAX_VALUE; > + private boolean done; > > /** > * {@inheritDoc} > @@ -41,6 +42,7 @@ public class RadiusVisitor extends TopologyVisitor { > */ > @Override > public void visit(Topology<? extends Entity> topology) { > + done = false; > double maxDistance = 0.0; > > Vector swarmBestParticlePosition = (Vector) > this.currentAlgorithm.getBestSolution().getPosition(); @@ -57,6 +59,7 @@ > public class RadiusVisitor extends TopologyVisitor { } > > radius = maxDistance; > + done = true; > } > > @Override > @@ -64,4 +67,9 @@ public class RadiusVisitor extends TopologyVisitor { > return this.radius; > } > > + @Override > + public boolean isDone() { > + return done; > + } > + > } > diff --git > a/src/main/java/net/sourceforge/cilib/entity/visitor/SpatialRadiusVisitor. > java > b/src/main/java/net/sourceforge/cilib/entity/visitor/SpatialRadiusVisitor. > java index 1bb02d0..37c2182 100644 > --- > a/src/main/java/net/sourceforge/cilib/entity/visitor/SpatialRadiusVisitor. > java +++ > b/src/main/java/net/sourceforge/cilib/entity/visitor/SpatialRadiusVisitor. > java @@ -34,12 +34,14 @@ import > net.sourceforge.cilib.type.types.container.Vector; public class > SpatialRadiusVisitor extends TopologyVisitor { > > private double radius = -Double.MAX_VALUE; > + private boolean done; > > /** > * {@inheritDoc} > */ > @Override > public void visit(Topology<? extends Entity> topology) { > + done = false; > // set radius value to be returned to zero > double maxDistance = 0.0; > > @@ -78,6 +80,7 @@ public class SpatialRadiusVisitor extends TopologyVisitor > { } > > radius = maxDistance; > + done = true; > } > > @Override > @@ -85,4 +88,9 @@ public class SpatialRadiusVisitor extends TopologyVisitor > { return this.radius; > } > > + @Override > + public boolean isDone() { > + return done; > + } > + > } > diff --git > a/src/main/java/net/sourceforge/cilib/entity/visitor/TopologyVisitor.java > b/src/main/java/net/sourceforge/cilib/entity/visitor/TopologyVisitor.java > index 8c4f77b..1f1d011 100644 > --- > a/src/main/java/net/sourceforge/cilib/entity/visitor/TopologyVisitor.java > +++ > b/src/main/java/net/sourceforge/cilib/entity/visitor/TopologyVisitor.java > @@ -36,7 +36,7 @@ import > net.sourceforge.cilib.util.EuclideanDistanceMeasure; * > * @author gpampara > */ > -public abstract class TopologyVisitor extends Visitor<Topology<? extends > Entity>> { +public abstract class TopologyVisitor implements > Visitor<Topology<? extends Entity>> { > > protected Algorithm currentAlgorithm; > protected DistanceMeasure distanceMeasure; > diff --git > a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetwo > rkRetrievalVisitor.java > b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetwo > rkRetrievalVisitor.java index b8fa30b..1ca32c1 100644 > --- > a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetwo > rkRetrievalVisitor.java +++ > b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetwo > rkRetrievalVisitor.java @@ -43,4 +43,9 @@ public class > NeuralNetworkRetrievalVisitor extends ProblemVisitor { public > EvaluationMediator getMediator() { > return mediator; > } > + > + @Override > + public boolean isDone() { > + return false; > + } > } > diff --git > a/src/main/java/net/sourceforge/cilib/problem/ProblemVisitor.java > b/src/main/java/net/sourceforge/cilib/problem/ProblemVisitor.java index > 3d27452..42acb8d 100644 > --- a/src/main/java/net/sourceforge/cilib/problem/ProblemVisitor.java > +++ b/src/main/java/net/sourceforge/cilib/problem/ProblemVisitor.java > @@ -23,11 +23,12 @@ package net.sourceforge.cilib.problem; > > import net.sourceforge.cilib.container.visitor.Visitor; > > -public abstract class ProblemVisitor extends Visitor<Problem> { > +public abstract class ProblemVisitor implements Visitor<Problem> { > > /** > * {@inheritDoc} > */ > + @Override > public abstract void visit(Problem o); > > } > diff --git > a/src/main/java/net/sourceforge/cilib/pso/particle/ParticleVisitor.java > b/src/main/java/net/sourceforge/cilib/pso/particle/ParticleVisitor.java > index d822605..c463415 100644 > --- a/src/main/java/net/sourceforge/cilib/pso/particle/ParticleVisitor.java > +++ b/src/main/java/net/sourceforge/cilib/pso/particle/ParticleVisitor.java > @@ -28,11 +28,12 @@ import net.sourceforge.cilib.entity.Particle; > /** > * @author Edwin Peer > */ > -public abstract class ParticleVisitor extends Visitor<Particle> { > +public abstract class ParticleVisitor implements Visitor<Particle> { > > /** > * Visit the provided particle. > * @param entity The {@linkplain Particle} to apply the visitor to. > */ > + @Override > public abstract void visit(Particle entity); > } > diff --git a/src/main/java/net/sourceforge/cilib/type/types/Types.java > b/src/main/java/net/sourceforge/cilib/type/types/Types.java index > f6dc48c..963b06b 100644 > --- a/src/main/java/net/sourceforge/cilib/type/types/Types.java > +++ b/src/main/java/net/sourceforge/cilib/type/types/Types.java > @@ -57,7 +57,7 @@ public final class Types { > return false; > } > > - private static class BoundsVerificationVisitor extends Visitor<Type> { > + private static class BoundsVerificationVisitor implements > Visitor<Type> { private boolean valid = true; > private boolean isDone = false; > |
From: Andrich v. W. <avw...@gm...> - 2009-09-08 12:56:03
|
The Visitor abstract class only implemented a single method (isDone) and had an empty default constructor (it maintained no instance fields). It has therefore been changed to an interface and the responisibility of isDone delegated to the implementing class. Updated extensions accordingly. --- .../cilib/container/visitor/PrePostVisitor.java | 11 ++++++++++- .../cilib/container/visitor/Visitor.java | 14 +++----------- .../cilib/entity/visitor/ClosestEntityVisitor.java | 8 ++++++++ .../cilib/entity/visitor/DiameterVisitor.java | 8 ++++++++ .../cilib/entity/visitor/RadiusVisitor.java | 8 ++++++++ .../cilib/entity/visitor/SpatialRadiusVisitor.java | 8 ++++++++ .../cilib/entity/visitor/TopologyVisitor.java | 2 +- .../foundation/NeuralNetworkRetrievalVisitor.java | 5 +++++ .../sourceforge/cilib/problem/ProblemVisitor.java | 3 ++- .../cilib/pso/particle/ParticleVisitor.java | 3 ++- .../net/sourceforge/cilib/type/types/Types.java | 2 +- 11 files changed, 56 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/sourceforge/cilib/container/visitor/PrePostVisitor.java b/src/main/java/net/sourceforge/cilib/container/visitor/PrePostVisitor.java index 63ca955..207ba86 100644 --- a/src/main/java/net/sourceforge/cilib/container/visitor/PrePostVisitor.java +++ b/src/main/java/net/sourceforge/cilib/container/visitor/PrePostVisitor.java @@ -31,7 +31,7 @@ package net.sourceforge.cilib.container.visitor; * @author Gary Pampara * @param <E> The element type. */ -public class PrePostVisitor<E> extends Visitor<E> { +public class PrePostVisitor<E> implements Visitor<E> { /** * Create a new instance of {@linkplain PrePostVisitor}. @@ -48,6 +48,7 @@ public class PrePostVisitor<E> extends Visitor<E> { /** * {@inheritDoc} */ + @Override public void visit(E o) {}; /** @@ -55,4 +56,12 @@ public class PrePostVisitor<E> extends Visitor<E> { * @param o The element to post visit. */ public void postVisit(E o) {}; + + /** + * {@inheritDoc} + */ + @Override + public boolean isDone() { + return false; + } } diff --git a/src/main/java/net/sourceforge/cilib/container/visitor/Visitor.java b/src/main/java/net/sourceforge/cilib/container/visitor/Visitor.java index db5d38a..e0c9220 100644 --- a/src/main/java/net/sourceforge/cilib/container/visitor/Visitor.java +++ b/src/main/java/net/sourceforge/cilib/container/visitor/Visitor.java @@ -24,16 +24,10 @@ package net.sourceforge.cilib.container.visitor; /** * Abstract class defining the general structure of a <tt>Visitor</tt>. * - * @author Gary Pampara + * @author Gary Pampara, andrich * @param <E> The type object. */ -public abstract class Visitor<E> { - - /** - * Create the {@linkplain Visitor} instance. - */ - protected Visitor() { - } +public interface Visitor<E> { /** * Visit the provided object. @@ -46,7 +40,5 @@ public abstract class Visitor<E> { * @return <code>true</code> if the visit operation is complete, * <code>false</code> otherwise. */ - public boolean isDone() { - return false; - } + public boolean isDone(); } diff --git a/src/main/java/net/sourceforge/cilib/entity/visitor/ClosestEntityVisitor.java b/src/main/java/net/sourceforge/cilib/entity/visitor/ClosestEntityVisitor.java index 6aa4580..97d229b 100644 --- a/src/main/java/net/sourceforge/cilib/entity/visitor/ClosestEntityVisitor.java +++ b/src/main/java/net/sourceforge/cilib/entity/visitor/ClosestEntityVisitor.java @@ -35,6 +35,7 @@ public class ClosestEntityVisitor extends TopologyVisitor { private Entity closestEntity; private Entity targetEntity; private double closest = Double.MAX_VALUE; + private boolean done; /** * Perform the search for the closest entity. @@ -42,6 +43,7 @@ public class ClosestEntityVisitor extends TopologyVisitor { */ @Override public void visit(Topology<? extends Entity> topology) { + done = false; closestEntity = null; for (Entity entity : topology) { @@ -54,6 +56,7 @@ public class ClosestEntityVisitor extends TopologyVisitor { this.closest = distance; } } + done = true; } /** @@ -82,4 +85,9 @@ public class ClosestEntityVisitor extends TopologyVisitor { this.targetEntity = targetEntity; } + @Override + public boolean isDone() { + return done; + } + } diff --git a/src/main/java/net/sourceforge/cilib/entity/visitor/DiameterVisitor.java b/src/main/java/net/sourceforge/cilib/entity/visitor/DiameterVisitor.java index 8c182a7..a7324c4 100644 --- a/src/main/java/net/sourceforge/cilib/entity/visitor/DiameterVisitor.java +++ b/src/main/java/net/sourceforge/cilib/entity/visitor/DiameterVisitor.java @@ -34,12 +34,14 @@ import net.sourceforge.cilib.type.types.container.Vector; public class DiameterVisitor extends TopologyVisitor { private double distance = -Double.MAX_VALUE; + private boolean done; public DiameterVisitor() { } @Override public void visit(Topology<? extends Entity> topology) { + done = false; double maxDistance = 0.0; Iterator<? extends Entity> k1 = topology.iterator(); @@ -59,6 +61,7 @@ public class DiameterVisitor extends TopologyVisitor { } distance = maxDistance; + done = true; } @Override @@ -66,4 +69,9 @@ public class DiameterVisitor extends TopologyVisitor { return this.distance; } + @Override + public boolean isDone() { + return done; + } + } diff --git a/src/main/java/net/sourceforge/cilib/entity/visitor/RadiusVisitor.java b/src/main/java/net/sourceforge/cilib/entity/visitor/RadiusVisitor.java index cebfdf5..400bfcc 100644 --- a/src/main/java/net/sourceforge/cilib/entity/visitor/RadiusVisitor.java +++ b/src/main/java/net/sourceforge/cilib/entity/visitor/RadiusVisitor.java @@ -33,6 +33,7 @@ import net.sourceforge.cilib.type.types.container.Vector; public class RadiusVisitor extends TopologyVisitor { private double radius = -Double.MAX_VALUE; + private boolean done; /** * {@inheritDoc} @@ -41,6 +42,7 @@ public class RadiusVisitor extends TopologyVisitor { */ @Override public void visit(Topology<? extends Entity> topology) { + done = false; double maxDistance = 0.0; Vector swarmBestParticlePosition = (Vector) this.currentAlgorithm.getBestSolution().getPosition(); @@ -57,6 +59,7 @@ public class RadiusVisitor extends TopologyVisitor { } radius = maxDistance; + done = true; } @Override @@ -64,4 +67,9 @@ public class RadiusVisitor extends TopologyVisitor { return this.radius; } + @Override + public boolean isDone() { + return done; + } + } diff --git a/src/main/java/net/sourceforge/cilib/entity/visitor/SpatialRadiusVisitor.java b/src/main/java/net/sourceforge/cilib/entity/visitor/SpatialRadiusVisitor.java index 1bb02d0..37c2182 100644 --- a/src/main/java/net/sourceforge/cilib/entity/visitor/SpatialRadiusVisitor.java +++ b/src/main/java/net/sourceforge/cilib/entity/visitor/SpatialRadiusVisitor.java @@ -34,12 +34,14 @@ import net.sourceforge.cilib.type.types.container.Vector; public class SpatialRadiusVisitor extends TopologyVisitor { private double radius = -Double.MAX_VALUE; + private boolean done; /** * {@inheritDoc} */ @Override public void visit(Topology<? extends Entity> topology) { + done = false; // set radius value to be returned to zero double maxDistance = 0.0; @@ -78,6 +80,7 @@ public class SpatialRadiusVisitor extends TopologyVisitor { } radius = maxDistance; + done = true; } @Override @@ -85,4 +88,9 @@ public class SpatialRadiusVisitor extends TopologyVisitor { return this.radius; } + @Override + public boolean isDone() { + return done; + } + } diff --git a/src/main/java/net/sourceforge/cilib/entity/visitor/TopologyVisitor.java b/src/main/java/net/sourceforge/cilib/entity/visitor/TopologyVisitor.java index 8c4f77b..1f1d011 100644 --- a/src/main/java/net/sourceforge/cilib/entity/visitor/TopologyVisitor.java +++ b/src/main/java/net/sourceforge/cilib/entity/visitor/TopologyVisitor.java @@ -36,7 +36,7 @@ import net.sourceforge.cilib.util.EuclideanDistanceMeasure; * * @author gpampara */ -public abstract class TopologyVisitor extends Visitor<Topology<? extends Entity>> { +public abstract class TopologyVisitor implements Visitor<Topology<? extends Entity>> { protected Algorithm currentAlgorithm; protected DistanceMeasure distanceMeasure; diff --git a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkRetrievalVisitor.java b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkRetrievalVisitor.java index b8fa30b..1ca32c1 100644 --- a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkRetrievalVisitor.java +++ b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkRetrievalVisitor.java @@ -43,4 +43,9 @@ public class NeuralNetworkRetrievalVisitor extends ProblemVisitor { public EvaluationMediator getMediator() { return mediator; } + + @Override + public boolean isDone() { + return false; + } } diff --git a/src/main/java/net/sourceforge/cilib/problem/ProblemVisitor.java b/src/main/java/net/sourceforge/cilib/problem/ProblemVisitor.java index 3d27452..42acb8d 100644 --- a/src/main/java/net/sourceforge/cilib/problem/ProblemVisitor.java +++ b/src/main/java/net/sourceforge/cilib/problem/ProblemVisitor.java @@ -23,11 +23,12 @@ package net.sourceforge.cilib.problem; import net.sourceforge.cilib.container.visitor.Visitor; -public abstract class ProblemVisitor extends Visitor<Problem> { +public abstract class ProblemVisitor implements Visitor<Problem> { /** * {@inheritDoc} */ + @Override public abstract void visit(Problem o); } diff --git a/src/main/java/net/sourceforge/cilib/pso/particle/ParticleVisitor.java b/src/main/java/net/sourceforge/cilib/pso/particle/ParticleVisitor.java index d822605..c463415 100644 --- a/src/main/java/net/sourceforge/cilib/pso/particle/ParticleVisitor.java +++ b/src/main/java/net/sourceforge/cilib/pso/particle/ParticleVisitor.java @@ -28,11 +28,12 @@ import net.sourceforge.cilib.entity.Particle; /** * @author Edwin Peer */ -public abstract class ParticleVisitor extends Visitor<Particle> { +public abstract class ParticleVisitor implements Visitor<Particle> { /** * Visit the provided particle. * @param entity The {@linkplain Particle} to apply the visitor to. */ + @Override public abstract void visit(Particle entity); } diff --git a/src/main/java/net/sourceforge/cilib/type/types/Types.java b/src/main/java/net/sourceforge/cilib/type/types/Types.java index f6dc48c..963b06b 100644 --- a/src/main/java/net/sourceforge/cilib/type/types/Types.java +++ b/src/main/java/net/sourceforge/cilib/type/types/Types.java @@ -57,7 +57,7 @@ public final class Types { return false; } - private static class BoundsVerificationVisitor extends Visitor<Type> { + private static class BoundsVerificationVisitor implements Visitor<Type> { private boolean valid = true; private boolean isDone = false; -- 1.6.0.4 |
From: Gary P. <gpa...@gm...> - 2009-09-08 10:31:42
|
I would prefer it to be an interface, although the class is maintaining the method: /** * Determine if the visitor has completed its visit operation. * @return <code>true</code> if the visit operation is complete, * <code>false</code> otherwise. */ public boolean isDone() { return false; } I'm all for changing that though. Having the specific visitor maintain the state of when it is done would be a good thing. Regards, Gary On Tuesday 08 September 2009 11:53:26 Andrich van Wyk wrote: > Hi > > The Visitor<E> class is currently abstract, would it not maybe make more > sense to change it to an interface? > Regards > |
From: Andrich v. W. <avw...@gm...> - 2009-09-08 09:53:41
|
Hi The Visitor<E> class is currently abstract, would it not maybe make more sense to change it to an interface? Regards -- Andrich van Wyk |
From: Gary P. <gpa...@gm...> - 2009-09-07 11:53:41
|
Thanks for the heads up Andrich. A good catch. next has not been merged into master yet (thankfully). I will *NOT* be merging it until I receive a patch for the offending class. Code that is in that state will not make it into a release. Please get the patch to me asap. This would have obviously been found if there were some unit tests for the class. Wasting time like this is not constructive, at all. On Monday 07 September 2009 13:43:01 Andrich van Wyk wrote: > Hi > > In the next branch there is a bug in the > PartialReinitialisationResponseStrategy class, line 80: > > current.getPosition().randomize(null); > > this causes a NullPointer exception when the randomization is finally > delegated to the runtime Type class. > As shown by this stack trace: > > Exception in thread "Thread-16" java.lang.NullPointerException > at net.sourceforge.cilib.type.types.Real.randomize(Real.java:225) > at > net.sourceforge.cilib.type.types.container.Vector.randomize(Vector.java:464 > ) at > net.sourceforge.cilib.pso.dynamic.responsestrategies.PartialReinitialisatio > nResponseStrategy.respond(PartialReinitialisationResponseStrategy.java:80) > at > net.sourceforge.cilib.pso.dynamic.DynamicIterationStrategy.performIteration > (DynamicIterationStrategy.java:107) at > net.sourceforge.cilib.pso.dynamic.DynamicIterationStrategy.performIteration > (DynamicIterationStrategy.java:48) at > net.sourceforge.cilib.pso.PSO.algorithmIteration(PSO.java:121) at > net.sourceforge.cilib.algorithm.AbstractAlgorithm.performIteration(Abstract > Algorithm.java:129) at > net.sourceforge.cilib.algorithm.AbstractAlgorithm.run(AbstractAlgorithm.jav > a:171) at > net.sourceforge.cilib.simulator.Simulation.run(Simulation.java:81) > > Regards > |
From: Andrich v. W. <avw...@gm...> - 2009-09-07 11:43:16
|
Hi In the next branch there is a bug in the PartialReinitialisationResponseStrategy class, line 80: current.getPosition().randomize(null); this causes a NullPointer exception when the randomization is finally delegated to the runtime Type class. As shown by this stack trace: Exception in thread "Thread-16" java.lang.NullPointerException at net.sourceforge.cilib.type.types.Real.randomize(Real.java:225) at net.sourceforge.cilib.type.types.container.Vector.randomize(Vector.java:464) at net.sourceforge.cilib.pso.dynamic.responsestrategies.PartialReinitialisationResponseStrategy.respond(PartialReinitialisationResponseStrategy.java:80) at net.sourceforge.cilib.pso.dynamic.DynamicIterationStrategy.performIteration(DynamicIterationStrategy.java:107) at net.sourceforge.cilib.pso.dynamic.DynamicIterationStrategy.performIteration(DynamicIterationStrategy.java:48) at net.sourceforge.cilib.pso.PSO.algorithmIteration(PSO.java:121) at net.sourceforge.cilib.algorithm.AbstractAlgorithm.performIteration(AbstractAlgorithm.java:129) at net.sourceforge.cilib.algorithm.AbstractAlgorithm.run(AbstractAlgorithm.java:171) at net.sourceforge.cilib.simulator.Simulation.run(Simulation.java:81) Regards -- Andrich van Wyk |
From: Gary P. <gpa...@gm...> - 2009-09-03 10:18:16
|
The getBehaviouralDomain() method is not used at all and is simply clogging up the code base. Signed-off-by: Gary Pampara <gpa...@gm...> --- .../algorithm/MultistartOptimisationAlgorithm.java | 4 ---- .../rnaprediction/RNAOptimisationProblem.java | 8 -------- .../bioinf/sequencealignment/BinaryMSAProblem.java | 7 ------- .../cilib/bioinf/sequencealignment/MSAProblem.java | 4 ---- .../criterion/CriterionBasedMOProblemAdapter.java | 5 ----- .../foundation/NeuralNetworkProblem.java | 4 ---- .../cilib/problem/ClusteringProblem.java | 10 ---------- .../CooperativeOptimisationProblemAdapter.java | 5 ----- .../cilib/problem/FunctionLearningProblem.java | 13 ------------- .../cilib/problem/FunctionOptimisationProblem.java | 8 -------- .../cilib/problem/MOOptimisationProblem.java | 5 ----- .../cilib/problem/OptimisationProblem.java | 10 ---------- .../CompetitiveCoevolutionProblemAdapter.java | 4 ---- .../GameLearningOptimizationProblem.java | 8 -------- .../FunctionDimensionMappingProblem.java | 5 ----- .../mappingproblem/LinearMappingProblem.java | 4 ---- .../cilib/moo/archive/constrained/ArchiveTest.java | 20 -------------------- .../constrained/ConstrainedArchiveTest.java | 20 -------------------- .../solutionweighing/SolutionWeighingTest.java | 5 ----- .../sourceforge/cilib/problem/MOFitnessTest.java | 6 ------ 20 files changed, 0 insertions(+), 155 deletions(-) diff --git a/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgorithm.java b/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgorithm.java index 8ef8f51..837c577 100644 --- a/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgorithm.java +++ b/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgorithm.java @@ -264,10 +264,6 @@ public class MultistartOptimisationAlgorithm extends Algorithm implements Partic return null; } - public DomainRegistry getBehaviouralDomain() { - return null; - } - private OptimisationProblem target; } diff --git a/src/main/java/net/sourceforge/cilib/bioinf/rnaprediction/RNAOptimisationProblem.java b/src/main/java/net/sourceforge/cilib/bioinf/rnaprediction/RNAOptimisationProblem.java index 4f55cde..51e83c1 100644 --- a/src/main/java/net/sourceforge/cilib/bioinf/rnaprediction/RNAOptimisationProblem.java +++ b/src/main/java/net/sourceforge/cilib/bioinf/rnaprediction/RNAOptimisationProblem.java @@ -102,12 +102,4 @@ public class RNAOptimisationProblem extends OptimisationProblemAdapter { return null; } - /** - * {@inheritDoc} - */ - public DomainRegistry getBehaviouralDomain() { - // TODO Auto-generated method stub - return null; - } - } diff --git a/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/BinaryMSAProblem.java b/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/BinaryMSAProblem.java index 43a407d..7780f31 100644 --- a/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/BinaryMSAProblem.java +++ b/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/BinaryMSAProblem.java @@ -127,13 +127,6 @@ public class BinaryMSAProblem extends OptimisationProblemAdapter { /** * {@inheritDoc} */ - public DomainRegistry getBehaviouralDomain() { - return this.domainRegistry; - } - - /** - * {@inheritDoc} - */ protected Fitness calculateFitness(Type solution) { // solution = particule position vector Vector realValuedPosition = (Vector) solution; //System.out.println("Fitness for matches: "+alignmentCreator.getFitness(strings, realValuedPosition, gapsArray)); // debug purpose diff --git a/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/MSAProblem.java b/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/MSAProblem.java index 0192eac..2dc0f9b 100644 --- a/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/MSAProblem.java +++ b/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/MSAProblem.java @@ -86,10 +86,6 @@ public class MSAProblem extends OptimisationProblemAdapter { return gapPenaltyMethod; } - public DomainRegistry getBehaviouralDomain() { - return this.domainRegistry; - } - public OptimisationProblemAdapter getClone() { return this; } diff --git a/src/main/java/net/sourceforge/cilib/moo/criterion/CriterionBasedMOProblemAdapter.java b/src/main/java/net/sourceforge/cilib/moo/criterion/CriterionBasedMOProblemAdapter.java index c0c23ff..204179c 100644 --- a/src/main/java/net/sourceforge/cilib/moo/criterion/CriterionBasedMOProblemAdapter.java +++ b/src/main/java/net/sourceforge/cilib/moo/criterion/CriterionBasedMOProblemAdapter.java @@ -87,11 +87,6 @@ public class CriterionBasedMOProblemAdapter extends OptimisationProblemAdapter { } @Override - public DomainRegistry getBehaviouralDomain() { - return getActiveOptimisationProblem().getBehaviouralDomain(); - } - - @Override public DomainRegistry getDomain() { return getActiveOptimisationProblem().getDomain(); } diff --git a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkProblem.java b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkProblem.java index de82adf..c4e1541 100644 --- a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkProblem.java +++ b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkProblem.java @@ -106,10 +106,6 @@ public class NeuralNetworkProblem implements OptimisationProblem, Initializable return null; } - public DomainRegistry getBehaviouralDomain() { - return null; - } - public void setEvaluationStrategy(EvaluationMediator evaluationStrategy) { this.evaluationStrategy = evaluationStrategy; } diff --git a/src/main/java/net/sourceforge/cilib/problem/ClusteringProblem.java b/src/main/java/net/sourceforge/cilib/problem/ClusteringProblem.java index f490df0..ca19e98 100644 --- a/src/main/java/net/sourceforge/cilib/problem/ClusteringProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/ClusteringProblem.java @@ -207,16 +207,6 @@ public class ClusteringProblem extends OptimisationProblemAdapter { } /** - * Return the actual domain of the problem's dataset, i.e. NOT the duplicated domain - * string as used by the clustering fitness function. - * - * @return the {@link #domainRegistry} of this clustering problem - */ - public DomainRegistry getBehaviouralDomain() { - return domainRegistry; - } - - /** * Sets the domain of the dataset being clustered. Once this domain string is set * (changed), the domain of the {@link net.sourceforge.cilib.functions.clustering.ClusteringFitnessFunction} * is automatically {@link #regenerateDomain() regenerated}. diff --git a/src/main/java/net/sourceforge/cilib/problem/CooperativeOptimisationProblemAdapter.java b/src/main/java/net/sourceforge/cilib/problem/CooperativeOptimisationProblemAdapter.java index 42ed4ab..32c6d05 100644 --- a/src/main/java/net/sourceforge/cilib/problem/CooperativeOptimisationProblemAdapter.java +++ b/src/main/java/net/sourceforge/cilib/problem/CooperativeOptimisationProblemAdapter.java @@ -118,9 +118,4 @@ public class CooperativeOptimisationProblemAdapter extends OptimisationProblemAd return domainRegistry; } - public DomainRegistry getBehaviouralDomain() { - // QUESTION What exactly does the problem.getBehaviouralDomain() method return and what is - // really needed? - return domainRegistry; - } } diff --git a/src/main/java/net/sourceforge/cilib/problem/FunctionLearningProblem.java b/src/main/java/net/sourceforge/cilib/problem/FunctionLearningProblem.java index eac5b74..7a2583c 100644 --- a/src/main/java/net/sourceforge/cilib/problem/FunctionLearningProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/FunctionLearningProblem.java @@ -314,17 +314,4 @@ public class FunctionLearningProblem extends OptimisationProblemAdapter { return null; } - public DomainRegistry getBehaviouralDomain() { - // TODO Auto-generated method stub - return null; - } - - /* public void setNeuralNetwork(NN neuralNetwork) { - this.neuralNetwork = neuralNetwork; - domain = new Compound(neuralNetwork.getNumberOfWeights(), new Real(-1.0, 1.0)); - } - - public NN getNeuralNetwork() { - return neuralNetwork; - }*/ } diff --git a/src/main/java/net/sourceforge/cilib/problem/FunctionOptimisationProblem.java b/src/main/java/net/sourceforge/cilib/problem/FunctionOptimisationProblem.java index 66438f7..7ce45c4 100644 --- a/src/main/java/net/sourceforge/cilib/problem/FunctionOptimisationProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/FunctionOptimisationProblem.java @@ -90,14 +90,6 @@ public abstract class FunctionOptimisationProblem extends OptimisationProblemAda } /** - * - */ - public DomainRegistry getBehaviouralDomain() { -// return function.getBehavioralDomainRegistry(); - return null; - } - - /** * Returns the error (as a double for now) that the given solution has with respect to the actual optimum solution. * * @param solution the solution for which an error should be determined diff --git a/src/main/java/net/sourceforge/cilib/problem/MOOptimisationProblem.java b/src/main/java/net/sourceforge/cilib/problem/MOOptimisationProblem.java index ccc139f..2a3f720 100644 --- a/src/main/java/net/sourceforge/cilib/problem/MOOptimisationProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/MOOptimisationProblem.java @@ -84,11 +84,6 @@ public class MOOptimisationProblem implements OptimisationProblem, List<Optimisa } @Override - public DomainRegistry getBehaviouralDomain() { - throw new UnsupportedOperationException("This method is not implemented"); - } - - @Override public DataSetBuilder getDataSetBuilder() { throw new UnsupportedOperationException("This method is not implemented"); } diff --git a/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java b/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java index 454aaa9..1d567a6 100644 --- a/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java @@ -73,16 +73,6 @@ public interface OptimisationProblem extends Problem { /** - * Returns the domain component that describes the search space of the needed - * behavioral characteristics of the problem. This is mainly used for ECs, however, - * the use of behavioral parameters with PSO will be investigated. - * - * @return The domain of the behavioral component - */ - public DomainRegistry getBehaviouralDomain(); - - - /** * Get the associated {@link net.sourceforge.cilib.problem.dataset.DataSetBuilder}. * @return The currently associated {@link net.sourceforge.cilib.problem.dataset.DataSetBuilder}. */ diff --git a/src/main/java/net/sourceforge/cilib/problem/coevolution/CompetitiveCoevolutionProblemAdapter.java b/src/main/java/net/sourceforge/cilib/problem/coevolution/CompetitiveCoevolutionProblemAdapter.java index 4165153..166723b 100644 --- a/src/main/java/net/sourceforge/cilib/problem/coevolution/CompetitiveCoevolutionProblemAdapter.java +++ b/src/main/java/net/sourceforge/cilib/problem/coevolution/CompetitiveCoevolutionProblemAdapter.java @@ -77,10 +77,6 @@ public class CompetitiveCoevolutionProblemAdapter extends OptimisationProblemAda return new CompetitiveCoevolutionProblemAdapter(this); } - public DomainRegistry getBehaviouralDomain() { - return domain; - } - public DomainRegistry getDomain() { return domain; } diff --git a/src/main/java/net/sourceforge/cilib/problem/coevolution/GameLearningOptimizationProblem.java b/src/main/java/net/sourceforge/cilib/problem/coevolution/GameLearningOptimizationProblem.java index 1f012a8..159d5b4 100644 --- a/src/main/java/net/sourceforge/cilib/problem/coevolution/GameLearningOptimizationProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/coevolution/GameLearningOptimizationProblem.java @@ -68,14 +68,6 @@ public class GameLearningOptimizationProblem extends * {@inheritDoc} */ @Override - public DomainRegistry getBehaviouralDomain() { - return game.getDomainForPlayer(1); //player one is the player being optimized - } - - /** - * {@inheritDoc} - */ - @Override public DomainRegistry getDomain() { return game.getDomainForPlayer(1); //player one is the player being optimized } diff --git a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/FunctionDimensionMappingProblem.java b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/FunctionDimensionMappingProblem.java index 6677879..910140c 100755 --- a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/FunctionDimensionMappingProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/FunctionDimensionMappingProblem.java @@ -76,11 +76,6 @@ public class FunctionDimensionMappingProblem extends OptimisationProblemAdapter return function.getDomainRegistry(); } - public DomainRegistry getBehaviouralDomain() { - return function.getDomainRegistry(); - } - - /** * @return Returns the function. diff --git a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/LinearMappingProblem.java b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/LinearMappingProblem.java index 7ed790e..7fe8336 100644 --- a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/LinearMappingProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/LinearMappingProblem.java @@ -110,8 +110,4 @@ public class LinearMappingProblem extends MappingProblem { return null; } - public DomainRegistry getBehaviouralDomain() { - // TODO Auto-generated method stub - return null; - } } diff --git a/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ArchiveTest.java b/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ArchiveTest.java index 8a1a84a..8f4a325 100644 --- a/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ArchiveTest.java +++ b/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ArchiveTest.java @@ -75,11 +75,6 @@ public class ArchiveTest { } @Override - public DomainRegistry getBehaviouralDomain() { - return null; - } - - @Override public DomainRegistry getDomain() { return null; } @@ -105,11 +100,6 @@ public class ArchiveTest { } @Override - public DomainRegistry getBehaviouralDomain() { - return null; - } - - @Override public DomainRegistry getDomain() { return null; } @@ -135,11 +125,6 @@ public class ArchiveTest { } @Override - public DomainRegistry getBehaviouralDomain() { - return null; - } - - @Override public DomainRegistry getDomain() { return null; } @@ -165,11 +150,6 @@ public class ArchiveTest { } @Override - public DomainRegistry getBehaviouralDomain() { - return null; - } - - @Override public DomainRegistry getDomain() { return null; } diff --git a/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ConstrainedArchiveTest.java b/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ConstrainedArchiveTest.java index 8a8491f..87a845f 100644 --- a/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ConstrainedArchiveTest.java +++ b/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ConstrainedArchiveTest.java @@ -66,11 +66,6 @@ public class ConstrainedArchiveTest { } @Override - public DomainRegistry getBehaviouralDomain() { - return null; - } - - @Override public DomainRegistry getDomain() { return null; } @@ -96,11 +91,6 @@ public class ConstrainedArchiveTest { } @Override - public DomainRegistry getBehaviouralDomain() { - return null; - } - - @Override public DomainRegistry getDomain() { return null; } @@ -126,11 +116,6 @@ public class ConstrainedArchiveTest { } @Override - public DomainRegistry getBehaviouralDomain() { - return null; - } - - @Override public DomainRegistry getDomain() { return null; } @@ -156,11 +141,6 @@ public class ConstrainedArchiveTest { } @Override - public DomainRegistry getBehaviouralDomain() { - return null; - } - - @Override public DomainRegistry getDomain() { return null; } diff --git a/src/test/java/net/sourceforge/cilib/moo/archive/solutionweighing/SolutionWeighingTest.java b/src/test/java/net/sourceforge/cilib/moo/archive/solutionweighing/SolutionWeighingTest.java index 9d2ef20..0229f68 100644 --- a/src/test/java/net/sourceforge/cilib/moo/archive/solutionweighing/SolutionWeighingTest.java +++ b/src/test/java/net/sourceforge/cilib/moo/archive/solutionweighing/SolutionWeighingTest.java @@ -88,11 +88,6 @@ public class SolutionWeighingTest { } @Override - public DomainRegistry getBehaviouralDomain() { - return null; - } - - @Override public DataSetBuilder getDataSetBuilder() { return null; } diff --git a/src/test/java/net/sourceforge/cilib/problem/MOFitnessTest.java b/src/test/java/net/sourceforge/cilib/problem/MOFitnessTest.java index ae5d5d5..da5c624 100644 --- a/src/test/java/net/sourceforge/cilib/problem/MOFitnessTest.java +++ b/src/test/java/net/sourceforge/cilib/problem/MOFitnessTest.java @@ -96,12 +96,6 @@ public class MOFitnessTest { } @Override - public DomainRegistry getBehaviouralDomain() { - // TODO Auto-generated method stub - return null; - } - - @Override public DataSetBuilder getDataSetBuilder() { // TODO Auto-generated method stub return null; -- 1.6.4.2 |
From: Gary P. <gpa...@gm...> - 2009-08-31 06:04:26
|
Version 0.7.1.1 of CIlib has been released. This is a maintenance release that addresses some concurrency problems with multiple threads reading the same XML specification. Other than that, the release is no different to the 0.7.1 release, however, it is recommended to upgrade to 0.7.1.1 Regards, The CIlib team. |
From: Gary P. <gpa...@gm...> - 2009-08-24 08:51:20
|
Refactored the Algorithm hierarchy to revolve around interfaces and not abstract classes. The only remaining abstract class is the AbstractAlgorithm. Refer to Effective Java for a detailed description of this type of refactor. Signed-off-by: Gary Pampara <gpa...@gm...> --- .../cilib/algorithm/AbstractAlgorithm.java | 9 +---- .../net/sourceforge/cilib/algorithm/Algorithm.java | 8 ++++ .../cilib/algorithm/SingularAlgorithm.java | 23 +----------- .../algorithm/{Algorithm.java => Stoppable.java} | 36 +++--------------- .../population/MultiPopulationBasedAlgorithm.java | 3 +- .../population/PopulationBasedAlgorithm.java | 38 ++----------------- .../population/SinglePopulationBasedAlgorithm.java | 3 +- .../cilib/clustering/kmeans/KMeans.java | 3 +- .../cilib/coevolution/CoevolutionAlgorithm.java | 3 +- .../cilib/entity/visitor/TopologyVisitor.java | 8 ++-- src/main/java/net/sourceforge/cilib/hs/HS.java | 3 +- .../cilib/measurement/generic/Iterations.java | 2 +- .../foundation/EvaluationMediator.java | 3 +- .../foundation/NeuralNetworkController.java | 3 +- src/main/java/net/sourceforge/cilib/pso/PSO.java | 1 - .../net/sourceforge/cilib/pso/niching/Niche.java | 3 +- .../container/visitor/TopologyVisitorTest.java | 26 +------------- .../cilib/measurement/generic/IterationsTest.java | 32 +++++++++++----- .../cilib/measurement/single/DiameterTest.java | 33 +++++++++++------ 19 files changed, 87 insertions(+), 153 deletions(-) copy src/main/java/net/sourceforge/cilib/algorithm/{Algorithm.java => Stoppable.java} (55%) diff --git a/src/main/java/net/sourceforge/cilib/algorithm/AbstractAlgorithm.java b/src/main/java/net/sourceforge/cilib/algorithm/AbstractAlgorithm.java index 80d0784..04a02a7 100644 --- a/src/main/java/net/sourceforge/cilib/algorithm/AbstractAlgorithm.java +++ b/src/main/java/net/sourceforge/cilib/algorithm/AbstractAlgorithm.java @@ -39,7 +39,7 @@ import net.sourceforge.cilib.stoppingcondition.StoppingCondition; * </p> * @author Edwin Peer */ -public abstract class AbstractAlgorithm implements Algorithm, Runnable { +public abstract class AbstractAlgorithm implements Algorithm, Stoppable, Runnable { private static final long serialVersionUID = 7197544770653732632L; private List<StoppingCondition> stoppingConditions; private List<AlgorithmListener> algorithmListeners; @@ -99,12 +99,6 @@ public abstract class AbstractAlgorithm implements Algorithm, Runnable { optimisationProblem = copy.optimisationProblem.getClone(); } - /** - * {@inheritDoc} - */ - @Override - public abstract AbstractAlgorithm getClone(); - /** * Reset the {@linkplain Algorithm} internals if needed. @@ -348,6 +342,7 @@ public abstract class AbstractAlgorithm implements Algorithm, Runnable { * @param problem An implementation of the * {@link net.sourceforge.cilib.problem.OptimisationProblemAdapter} interface. */ + @Override public void setOptimisationProblem(OptimisationProblem problem) { this.optimisationProblem = problem; } diff --git a/src/main/java/net/sourceforge/cilib/algorithm/Algorithm.java b/src/main/java/net/sourceforge/cilib/algorithm/Algorithm.java index d49e5d2..fc4969b 100644 --- a/src/main/java/net/sourceforge/cilib/algorithm/Algorithm.java +++ b/src/main/java/net/sourceforge/cilib/algorithm/Algorithm.java @@ -57,4 +57,12 @@ public interface Algorithm extends Cloneable { * Not Needed>??>???????????? */ public int getIterations(); + + /** + * Set the optimisation problem to be solved. By default, the problem is <code>null</code>. + * That is, it is necessary to set the optimisation problem before calling {@link #initialise()}. + * @param problem An implementation of the + * {@link net.sourceforge.cilib.problem.OptimisationProblemAdapter} interface. + */ + public void setOptimisationProblem(OptimisationProblem problem); } diff --git a/src/main/java/net/sourceforge/cilib/algorithm/SingularAlgorithm.java b/src/main/java/net/sourceforge/cilib/algorithm/SingularAlgorithm.java index 166a1c9..4956447 100644 --- a/src/main/java/net/sourceforge/cilib/algorithm/SingularAlgorithm.java +++ b/src/main/java/net/sourceforge/cilib/algorithm/SingularAlgorithm.java @@ -28,27 +28,6 @@ package net.sourceforge.cilib.algorithm; * Examples of such algorithms will include <tt>KMeans</tt>, <tt>Gradient Decent</tt> etc. * */ -public abstract class SingularAlgorithm extends AbstractAlgorithm { - private static final long serialVersionUID = 8524134633474124524L; - - /** - * Create a new instance of {@linkplain SingularAlgorithm}. - */ - public SingularAlgorithm() { - } - - /** - * Create a copy of the provided instance. - * @param copy The instance to copy. - */ - public SingularAlgorithm(SingularAlgorithm copy) { - super(copy); - } - - /** - * {@inheritDoc} - */ - @Override - public abstract void algorithmIteration(); +public interface SingularAlgorithm extends Algorithm, Stoppable { } diff --git a/src/main/java/net/sourceforge/cilib/algorithm/Algorithm.java b/src/main/java/net/sourceforge/cilib/algorithm/Stoppable.java similarity index 55% copy from src/main/java/net/sourceforge/cilib/algorithm/Algorithm.java copy to src/main/java/net/sourceforge/cilib/algorithm/Stoppable.java index d49e5d2..b926c60 100644 --- a/src/main/java/net/sourceforge/cilib/algorithm/Algorithm.java +++ b/src/main/java/net/sourceforge/cilib/algorithm/Stoppable.java @@ -19,42 +19,18 @@ * 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.algorithm; -import net.sourceforge.cilib.problem.OptimisationProblem; -import net.sourceforge.cilib.problem.OptimisationSolution; -import net.sourceforge.cilib.util.Cloneable; +import net.sourceforge.cilib.stoppingcondition.StoppingCondition; /** * */ -public interface Algorithm extends Cloneable { - - public OptimisationSolution getBestSolution(); - - public void performIteration(); - - /** - * Not Needed>??>???????????? - */ - public void performInitialisation(); - - /** - * Not Needed>??>???????????? - */ - public void performUninitialisation(); - - public Iterable<OptimisationSolution> getSolutions(); - - public OptimisationProblem getOptimisationProblem(); +public interface Stoppable { - /** - * ???? Not needed? - */ - public void reset(); + public void addStoppingCondition(StoppingCondition condition); - /** - * Not Needed>??>???????????? - */ - public int getIterations(); + public void removeStoppingCondition(StoppingCondition condition); + } diff --git a/src/main/java/net/sourceforge/cilib/algorithm/population/MultiPopulationBasedAlgorithm.java b/src/main/java/net/sourceforge/cilib/algorithm/population/MultiPopulationBasedAlgorithm.java index a620770..46b6e21 100644 --- a/src/main/java/net/sourceforge/cilib/algorithm/population/MultiPopulationBasedAlgorithm.java +++ b/src/main/java/net/sourceforge/cilib/algorithm/population/MultiPopulationBasedAlgorithm.java @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.algorithm.initialisation.PopulationInitialisationStrategy; import net.sourceforge.cilib.cooperative.algorithmiterators.AlgorithmIterator; @@ -48,7 +49,7 @@ import net.sourceforge.cilib.entity.visitor.TopologyVisitor; * * @author Gary Pampara */ -public abstract class MultiPopulationBasedAlgorithm extends PopulationBasedAlgorithm implements Iterable<PopulationBasedAlgorithm> { +public abstract class MultiPopulationBasedAlgorithm extends AbstractAlgorithm implements PopulationBasedAlgorithm, Iterable<PopulationBasedAlgorithm> { private static final long serialVersionUID = -5311450612897848103L; protected List<PopulationBasedAlgorithm> subPopulationsAlgorithms; protected AlgorithmIterator<PopulationBasedAlgorithm> algorithmIterator; diff --git a/src/main/java/net/sourceforge/cilib/algorithm/population/PopulationBasedAlgorithm.java b/src/main/java/net/sourceforge/cilib/algorithm/population/PopulationBasedAlgorithm.java index e8f54c8..4984e05 100644 --- a/src/main/java/net/sourceforge/cilib/algorithm/population/PopulationBasedAlgorithm.java +++ b/src/main/java/net/sourceforge/cilib/algorithm/population/PopulationBasedAlgorithm.java @@ -21,50 +21,20 @@ */ package net.sourceforge.cilib.algorithm.population; -import java.util.List; -import net.sourceforge.cilib.algorithm.AbstractAlgorithm; +import net.sourceforge.cilib.algorithm.Algorithm; +import net.sourceforge.cilib.algorithm.Stoppable; import net.sourceforge.cilib.algorithm.initialisation.PopulationInitialisationStrategy; import net.sourceforge.cilib.entity.Entity; import net.sourceforge.cilib.entity.Topology; import net.sourceforge.cilib.entity.visitor.TopologyVisitor; -import net.sourceforge.cilib.problem.OptimisationSolution; /** * Base class for all algorithms that manage a collection of * {@linkplain Entity entities} in some manner. */ -public abstract class PopulationBasedAlgorithm extends AbstractAlgorithm { +public interface PopulationBasedAlgorithm extends Algorithm, Stoppable { - protected PopulationBasedAlgorithm() { - } - - protected PopulationBasedAlgorithm(PopulationBasedAlgorithm copy) { - super(copy); - } - - /** - * {@inheritDoc} - */ - @Override - public abstract PopulationBasedAlgorithm getClone(); - - /** - * {@inheritDoc} - */ - @Override - protected abstract void algorithmIteration(); - - /** - * {@inheritDoc} - */ - @Override - public abstract OptimisationSolution getBestSolution(); - - /** - * {@inheritDoc} - */ - @Override - public abstract List<OptimisationSolution> getSolutions(); + public PopulationBasedAlgorithm getClone(); /** * Get the current collection (population) of {@linkplain Entity entities}. diff --git a/src/main/java/net/sourceforge/cilib/algorithm/population/SinglePopulationBasedAlgorithm.java b/src/main/java/net/sourceforge/cilib/algorithm/population/SinglePopulationBasedAlgorithm.java index 03e10ec..bc1e525 100644 --- a/src/main/java/net/sourceforge/cilib/algorithm/population/SinglePopulationBasedAlgorithm.java +++ b/src/main/java/net/sourceforge/cilib/algorithm/population/SinglePopulationBasedAlgorithm.java @@ -21,6 +21,7 @@ */ package net.sourceforge.cilib.algorithm.population; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.initialisation.PopulationInitialisationStrategy; import net.sourceforge.cilib.entity.Entity; import net.sourceforge.cilib.entity.Topology; @@ -31,7 +32,7 @@ import net.sourceforge.cilib.entity.visitor.TopologyVisitor; * These types of algoruthms typically include PSO , EC, ACO etc. * @author Gary Pampara */ -public abstract class SinglePopulationBasedAlgorithm extends PopulationBasedAlgorithm { +public abstract class SinglePopulationBasedAlgorithm extends AbstractAlgorithm implements PopulationBasedAlgorithm { private static final long serialVersionUID = -4095104893057340895L; protected PopulationInitialisationStrategy<? extends Entity> initialisationStrategy; 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 7be5f1d..6422302 100644 --- a/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java +++ b/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java @@ -26,6 +26,7 @@ import java.util.Arrays; import java.util.Hashtable; import java.util.List; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.SingularAlgorithm; import net.sourceforge.cilib.math.Stats; import net.sourceforge.cilib.problem.OptimisationSolution; @@ -55,7 +56,7 @@ import net.sourceforge.cilib.util.calculator.StructuredTypeFitnessCalculator; * @author Theuns Cloete * @TODO: Check that removing the FitnessCalculator does not break the functionality of this class. */ -public class KMeans extends SingularAlgorithm { +public class KMeans extends AbstractAlgorithm implements SingularAlgorithm { private static final long serialVersionUID = -3301123926538450441L; private CentroidsInitialisationStrategy centroidsInitialisationStrategy = null; diff --git a/src/main/java/net/sourceforge/cilib/coevolution/CoevolutionAlgorithm.java b/src/main/java/net/sourceforge/cilib/coevolution/CoevolutionAlgorithm.java index dde4caa..f76896f 100755 --- a/src/main/java/net/sourceforge/cilib/coevolution/CoevolutionAlgorithm.java +++ b/src/main/java/net/sourceforge/cilib/coevolution/CoevolutionAlgorithm.java @@ -123,7 +123,8 @@ public class CoevolutionAlgorithm extends MultiPopulationBasedAlgorithm { public List<OptimisationSolution> getSolutions() { List<OptimisationSolution> solutions = new ArrayList<OptimisationSolution>(); for (PopulationBasedAlgorithm currentAlgorithm : this.getPopulations()) { - solutions.addAll(currentAlgorithm.getSolutions()); + for (OptimisationSolution solution : currentAlgorithm.getSolutions()) + solutions.add(solution); } return solutions; } diff --git a/src/main/java/net/sourceforge/cilib/entity/visitor/TopologyVisitor.java b/src/main/java/net/sourceforge/cilib/entity/visitor/TopologyVisitor.java index 8c4f77b..7c5a607 100644 --- a/src/main/java/net/sourceforge/cilib/entity/visitor/TopologyVisitor.java +++ b/src/main/java/net/sourceforge/cilib/entity/visitor/TopologyVisitor.java @@ -21,7 +21,7 @@ */ package net.sourceforge.cilib.entity.visitor; -import net.sourceforge.cilib.algorithm.Algorithm; +import net.sourceforge.cilib.algorithm.population.PopulationBasedAlgorithm; import net.sourceforge.cilib.container.visitor.Visitor; import net.sourceforge.cilib.entity.Entity; import net.sourceforge.cilib.entity.Topology; @@ -38,7 +38,7 @@ import net.sourceforge.cilib.util.EuclideanDistanceMeasure; */ public abstract class TopologyVisitor extends Visitor<Topology<? extends Entity>> { - protected Algorithm currentAlgorithm; + protected PopulationBasedAlgorithm currentAlgorithm; protected DistanceMeasure distanceMeasure; public TopologyVisitor() { @@ -66,11 +66,11 @@ public abstract class TopologyVisitor extends Visitor<Topology<? extends Entity> this.distanceMeasure = distanceMeasure; } - public Algorithm getCurrentAlgorithm() { + public PopulationBasedAlgorithm getCurrentAlgorithm() { return currentAlgorithm; } - public void setCurrentAlgorithm(Algorithm currentAlgorithm) { + public void setCurrentAlgorithm(PopulationBasedAlgorithm currentAlgorithm) { this.currentAlgorithm = currentAlgorithm; } diff --git a/src/main/java/net/sourceforge/cilib/hs/HS.java b/src/main/java/net/sourceforge/cilib/hs/HS.java index c6bfbdc..f4863dc 100644 --- a/src/main/java/net/sourceforge/cilib/hs/HS.java +++ b/src/main/java/net/sourceforge/cilib/hs/HS.java @@ -24,6 +24,7 @@ package net.sourceforge.cilib.hs; import java.util.Arrays; import java.util.List; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.SingularAlgorithm; import net.sourceforge.cilib.container.SortedList; import net.sourceforge.cilib.controlparameter.ConstantControlParameter; @@ -43,7 +44,7 @@ import net.sourceforge.cilib.type.types.container.Vector; * * @author Andries Engelbrecht */ -public class HS extends SingularAlgorithm { +public class HS extends AbstractAlgorithm implements SingularAlgorithm { private static final long serialVersionUID = 8019668923312811974L; private RandomNumber random1; private RandomNumber random2; diff --git a/src/main/java/net/sourceforge/cilib/measurement/generic/Iterations.java b/src/main/java/net/sourceforge/cilib/measurement/generic/Iterations.java index e9eac18..1c28849 100644 --- a/src/main/java/net/sourceforge/cilib/measurement/generic/Iterations.java +++ b/src/main/java/net/sourceforge/cilib/measurement/generic/Iterations.java @@ -64,7 +64,7 @@ public class Iterations implements Measurement { */ public Type getValue(Algorithm algorithm) { Int i = new Int(); - i.setInt(((AbstractAlgorithm)algorithm).getIterations()); + i.setInt(algorithm.getIterations()); return i; } diff --git a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/EvaluationMediator.java b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/EvaluationMediator.java index 0ed61b1..b699726 100644 --- a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/EvaluationMediator.java +++ b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/EvaluationMediator.java @@ -24,6 +24,7 @@ package net.sourceforge.cilib.neuralnetwork.foundation; import java.util.List; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.SingularAlgorithm; import net.sourceforge.cilib.neuralnetwork.foundation.epochstrategy.EmptyEpochStrategy; import net.sourceforge.cilib.neuralnetwork.foundation.epochstrategy.EpochStrategy; @@ -36,7 +37,7 @@ import net.sourceforge.cilib.type.types.container.TypeList; * @author stefanv * */ -public class EvaluationMediator extends SingularAlgorithm { +public class EvaluationMediator extends AbstractAlgorithm implements SingularAlgorithm { private static final long serialVersionUID = 1291326641087190123L; protected NNError[] prototypeError = null; protected NNError[] errorDg = null; diff --git a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkController.java b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkController.java index 39c2b30..23de501 100644 --- a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkController.java +++ b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkController.java @@ -24,6 +24,7 @@ package net.sourceforge.cilib.neuralnetwork.foundation; import java.io.IOException; import java.util.List; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.SingularAlgorithm; import net.sourceforge.cilib.neuralnetwork.foundation.postSimulation.PostMeasurementSuite; import net.sourceforge.cilib.problem.OptimisationProblem; @@ -35,7 +36,7 @@ import net.sourceforge.cilib.problem.Problem; * @deprecated This class is no longer viable - Please see {@linkplain EvaluationMediator} */ @Deprecated -public class NeuralNetworkController extends SingularAlgorithm { +public class NeuralNetworkController extends AbstractAlgorithm implements SingularAlgorithm { private static final long serialVersionUID = -904395696777716473L; protected NeuralNetworkProblem problem = null; protected NNError[] errorDt = null; diff --git a/src/main/java/net/sourceforge/cilib/pso/PSO.java b/src/main/java/net/sourceforge/cilib/pso/PSO.java index de5bbc0..88e0805 100644 --- a/src/main/java/net/sourceforge/cilib/pso/PSO.java +++ b/src/main/java/net/sourceforge/cilib/pso/PSO.java @@ -21,7 +21,6 @@ */ package net.sourceforge.cilib.pso; -import com.google.common.collect.Iterables; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/net/sourceforge/cilib/pso/niching/Niche.java b/src/main/java/net/sourceforge/cilib/pso/niching/Niche.java index d19509f..288d95c 100644 --- a/src/main/java/net/sourceforge/cilib/pso/niching/Niche.java +++ b/src/main/java/net/sourceforge/cilib/pso/niching/Niche.java @@ -73,7 +73,8 @@ public class Niche extends MultiPopulationBasedAlgorithm { this.mainSwarm.setOptimisationProblem(getOptimisationProblem()); - this.mainSwarm.initialise(); +// this.mainSwarm.initialise(); + this.mainSwarm.performInitialisation(); } diff --git a/src/test/java/net/sourceforge/cilib/container/visitor/TopologyVisitorTest.java b/src/test/java/net/sourceforge/cilib/container/visitor/TopologyVisitorTest.java index 6a462dd..3b0126f 100644 --- a/src/test/java/net/sourceforge/cilib/container/visitor/TopologyVisitorTest.java +++ b/src/test/java/net/sourceforge/cilib/container/visitor/TopologyVisitorTest.java @@ -21,24 +21,13 @@ */ package net.sourceforge.cilib.container.visitor; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; -import net.sourceforge.cilib.entity.Particle; -import net.sourceforge.cilib.entity.Topology; -import net.sourceforge.cilib.entity.visitor.RadiusVisitor; -import net.sourceforge.cilib.entity.visitor.TopologyVisitor; -import net.sourceforge.cilib.pso.PSO; -import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.integration.junit4.JUnit4Mockery; -import org.jmock.lib.legacy.ClassImposteriser; import org.junit.Test; public class TopologyVisitorTest { - private Mockery context = new JUnit4Mockery() {{ - setImposteriser(ClassImposteriser.INSTANCE); - }}; + private Mockery context = new JUnit4Mockery(); /** * Initialize a dummy algorithm and then test if the visitor knows @@ -47,19 +36,6 @@ public class TopologyVisitorTest { @SuppressWarnings("unchecked") @Test public void currentAlgorithmUsed() { - final Topology<Particle> topology = context.mock(Topology.class); - final TopologyVisitor visitor = new RadiusVisitor(); - - PSO pso = new PSO(); - pso.setTopology(topology); - - context.checking(new Expectations() {{ - one(topology).accept(visitor); - }}); - - pso.accept(visitor); - - assertThat(pso, is(visitor.getCurrentAlgorithm())); } } diff --git a/src/test/java/net/sourceforge/cilib/measurement/generic/IterationsTest.java b/src/test/java/net/sourceforge/cilib/measurement/generic/IterationsTest.java index e7b7557..05aef43 100644 --- a/src/test/java/net/sourceforge/cilib/measurement/generic/IterationsTest.java +++ b/src/test/java/net/sourceforge/cilib/measurement/generic/IterationsTest.java @@ -21,44 +21,56 @@ */ package net.sourceforge.cilib.measurement.generic; +import net.sourceforge.cilib.algorithm.population.PopulationBasedAlgorithm; import net.sourceforge.cilib.measurement.Measurement; -import net.sourceforge.cilib.pso.PSO; import net.sourceforge.cilib.type.types.Int; +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.jmock.integration.junit4.JMock; +import org.jmock.integration.junit4.JUnit4Mockery; import org.junit.Assert; import org.junit.Test; +import org.junit.runner.RunWith; import static org.hamcrest.CoreMatchers.is; /** * * @author Gary Pampara */ +@RunWith(JMock.class) public class IterationsTest { + private Mockery context = new JUnit4Mockery(); @Test public void iterationNumber() { - PSO pso = new PSO(); - - for (int i = 0; i < 10; i++) - pso.performIteration(); + final int expected = 1000; + final PopulationBasedAlgorithm algorithm = context.mock(PopulationBasedAlgorithm.class); + context.checking(new Expectations() {{ + oneOf(algorithm).getIterations(); will(returnValue(expected)); + }}); + Measurement m = new Iterations(); - Assert.assertEquals(pso.getIterations(), ((Int) m.getValue(pso)).getInt()); + Assert.assertEquals(expected, ((Int) m.getValue(algorithm)).getInt()); } @Test public void domain() { Iterations iterations = new Iterations(); - Assert.assertEquals(iterations.getDomain(), "Z"); } @Test public void resultType() { - PSO pso = new PSO(); - Measurement m = new Iterations(); + final PopulationBasedAlgorithm algorithm = context.mock(PopulationBasedAlgorithm.class); - Assert.assertThat(m.getValue(pso), is(Int.class)); + context.checking(new Expectations() {{ + ignoring(algorithm); + }}); + + Measurement m = new Iterations(); + Assert.assertThat(m.getValue(algorithm), is(Int.class)); } } diff --git a/src/test/java/net/sourceforge/cilib/measurement/single/DiameterTest.java b/src/test/java/net/sourceforge/cilib/measurement/single/DiameterTest.java index 475b5fa..6c14d45 100644 --- a/src/test/java/net/sourceforge/cilib/measurement/single/DiameterTest.java +++ b/src/test/java/net/sourceforge/cilib/measurement/single/DiameterTest.java @@ -21,24 +21,31 @@ */ package net.sourceforge.cilib.measurement.single; +import net.sourceforge.cilib.algorithm.population.PopulationBasedAlgorithm; import net.sourceforge.cilib.entity.EntityType; import net.sourceforge.cilib.entity.Particle; import net.sourceforge.cilib.entity.Topology; import net.sourceforge.cilib.entity.topologies.GBestTopology; import net.sourceforge.cilib.measurement.Measurement; -import net.sourceforge.cilib.pso.PSO; import net.sourceforge.cilib.pso.particle.StandardParticle; import net.sourceforge.cilib.type.types.Real; import net.sourceforge.cilib.util.Vectors; +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.jmock.integration.junit4.JMock; +import org.jmock.integration.junit4.JUnit4Mockery; import org.junit.Assert; import org.junit.Test; +import org.junit.runner.RunWith; /** * * @author Gary Pampara */ +@RunWith(JMock.class) public class DiameterTest { + private Mockery context = new JUnit4Mockery(); @Test public void simpleDiameter() { @@ -48,16 +55,18 @@ public class DiameterTest { p1.getProperties().put(EntityType.CANDIDATE_SOLUTION, Vectors.create(0.0, 0.0)); p2.getProperties().put(EntityType.CANDIDATE_SOLUTION, Vectors.create(2.0, 2.0)); - Topology<Particle> topology = new GBestTopology<Particle>(); + final Topology<Particle> topology = new GBestTopology<Particle>(); topology.add(p1); topology.add(p2); - PSO pso = new PSO(); - pso.setTopology(topology); + final PopulationBasedAlgorithm algorithm = context.mock(PopulationBasedAlgorithm.class); - Measurement m = new Diameter(); + context.checking(new Expectations() {{ + oneOf(algorithm).getTopology(); will(returnValue(topology)); + }}); - Assert.assertEquals(new Real(Math.sqrt(8)), m.getValue(pso)); + Measurement m = new Diameter(); + Assert.assertEquals(new Real(Math.sqrt(8)), m.getValue(algorithm)); } @Test @@ -72,18 +81,20 @@ public class DiameterTest { p3.getProperties().put(EntityType.CANDIDATE_SOLUTION, Vectors.create(1.5, 1.5)); p4.getProperties().put(EntityType.CANDIDATE_SOLUTION, Vectors.create(2.0, 2.0)); - Topology<Particle> topology = new GBestTopology<Particle>(); + final Topology<Particle> topology = new GBestTopology<Particle>(); topology.add(p1); topology.add(p2); topology.add(p3); topology.add(p4); - PSO pso = new PSO(); - pso.setTopology(topology); + final PopulationBasedAlgorithm algorithm = context.mock(PopulationBasedAlgorithm.class); + context.checking(new Expectations() {{ + oneOf(algorithm).getTopology(); will(returnValue(topology)); + }}); + Measurement m = new Diameter(); - - Assert.assertEquals(new Real(Math.sqrt(8)), m.getValue(pso)); + Assert.assertEquals(new Real(Math.sqrt(8)), m.getValue(algorithm)); } } -- 1.6.4 |
From: Gary P. <gpa...@gm...> - 2009-08-24 08:51:17
|
Simplify the unit tests by correctly using mocks and not needing to wire up a large object graph. Signed-off-by: Gary Pampara <gpa...@gm...> --- .../single/BestParticlePositionTest.java | 27 ++++++++++-------- .../cilib/measurement/single/FitnessTest.java | 26 +++++++++++------- .../cilib/measurement/single/SolutionTest.java | 28 +++++++++++-------- 3 files changed, 47 insertions(+), 34 deletions(-) diff --git a/src/test/java/net/sourceforge/cilib/measurement/single/BestParticlePositionTest.java b/src/test/java/net/sourceforge/cilib/measurement/single/BestParticlePositionTest.java index ec200fb..2255338 100644 --- a/src/test/java/net/sourceforge/cilib/measurement/single/BestParticlePositionTest.java +++ b/src/test/java/net/sourceforge/cilib/measurement/single/BestParticlePositionTest.java @@ -21,36 +21,39 @@ */ package net.sourceforge.cilib.measurement.single; -import net.sourceforge.cilib.entity.EntityType; -import net.sourceforge.cilib.entity.Particle; +import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.measurement.Measurement; import net.sourceforge.cilib.problem.InferiorFitness; -import net.sourceforge.cilib.pso.PSO; -import net.sourceforge.cilib.pso.particle.StandardParticle; +import net.sourceforge.cilib.problem.OptimisationSolution; import net.sourceforge.cilib.util.Vectors; +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.jmock.integration.junit4.JMock; +import org.jmock.integration.junit4.JUnit4Mockery; import org.junit.Assert; import org.junit.Test; +import org.junit.runner.RunWith; /** * * @author Gary Pampara */ +@RunWith(JMock.class) public class BestParticlePositionTest { + private Mockery mockery = new JUnit4Mockery(); @Test public void testBestParticlePositionDomain() { - Particle p = new StandardParticle(); - p.getProperties().put(EntityType.Particle.BEST_POSITION, Vectors.create(4.0)); - p.getProperties().put(EntityType.Particle.BEST_FITNESS, InferiorFitness.instance()); + final Algorithm algorithm = mockery.mock(Algorithm.class); + final OptimisationSolution mockSolution = new OptimisationSolution(Vectors.create(4.0), InferiorFitness.instance()); - PSO pso = new PSO(); - pso.getTopology().add(p); + mockery.checking(new Expectations() {{ + oneOf(algorithm).getBestSolution(); will(returnValue(mockSolution)); + }}); Measurement measurement = new BestParticlePosition(); - measurement.getValue(pso); - - Assert.assertEquals(p.getBestPosition().toString(), measurement.getValue(pso).toString()); + Assert.assertEquals("[4.0]", measurement.getValue(algorithm).toString()); } } diff --git a/src/test/java/net/sourceforge/cilib/measurement/single/FitnessTest.java b/src/test/java/net/sourceforge/cilib/measurement/single/FitnessTest.java index 26d0229..58b6093 100644 --- a/src/test/java/net/sourceforge/cilib/measurement/single/FitnessTest.java +++ b/src/test/java/net/sourceforge/cilib/measurement/single/FitnessTest.java @@ -21,34 +21,40 @@ */ package net.sourceforge.cilib.measurement.single; -import net.sourceforge.cilib.ec.EC; -import net.sourceforge.cilib.ec.Individual; -import net.sourceforge.cilib.entity.EntityType; -import net.sourceforge.cilib.entity.Topology; +import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.measurement.Measurement; import net.sourceforge.cilib.problem.MinimisationFitness; +import net.sourceforge.cilib.problem.OptimisationSolution; import net.sourceforge.cilib.type.types.Real; +import net.sourceforge.cilib.util.Vectors; +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.jmock.integration.junit4.JMock; +import org.jmock.integration.junit4.JUnit4Mockery; import org.junit.Assert; import org.junit.Test; +import org.junit.runner.RunWith; /** * * @author Gary Pampara */ +@RunWith(JMock.class) public class FitnessTest { + private Mockery mockery = new JUnit4Mockery(); @Test public void results() { - EC ec = new EC(); - Topology<Individual> topology = (Topology<Individual>) ec.getTopology(); + final Algorithm algorithm = mockery.mock(Algorithm.class); + final OptimisationSolution mockSolution = new OptimisationSolution(Vectors.create(1.0), new MinimisationFitness(0.0)); - Individual i = new Individual(); - i.getProperties().put(EntityType.FITNESS, new MinimisationFitness(0.0)); - topology.add(i); + mockery.checking(new Expectations() {{ + oneOf(algorithm).getBestSolution(); will(returnValue(mockSolution)); + }}); Measurement m = new Fitness(); - Assert.assertEquals(0.0, ((Real) m.getValue(ec)).getReal(), 0.00001); + Assert.assertEquals(0.0, ((Real) m.getValue(algorithm)).getReal(), 0.00001); } } diff --git a/src/test/java/net/sourceforge/cilib/measurement/single/SolutionTest.java b/src/test/java/net/sourceforge/cilib/measurement/single/SolutionTest.java index 013da6a..759cb8d 100644 --- a/src/test/java/net/sourceforge/cilib/measurement/single/SolutionTest.java +++ b/src/test/java/net/sourceforge/cilib/measurement/single/SolutionTest.java @@ -21,21 +21,24 @@ */ package net.sourceforge.cilib.measurement.single; -import net.sourceforge.cilib.ec.EC; -import net.sourceforge.cilib.ec.Individual; -import net.sourceforge.cilib.entity.EntityType; -import net.sourceforge.cilib.entity.Topology; +import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.measurement.Measurement; +import net.sourceforge.cilib.problem.InferiorFitness; +import net.sourceforge.cilib.problem.OptimisationSolution; import net.sourceforge.cilib.type.parser.DomainParser; import net.sourceforge.cilib.type.parser.ParseException; import net.sourceforge.cilib.type.types.StringType; import net.sourceforge.cilib.type.types.container.TypeList; -import net.sourceforge.cilib.type.types.container.Vector; import net.sourceforge.cilib.util.Vectors; +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.jmock.integration.junit4.JMock; +import org.jmock.integration.junit4.JUnit4Mockery; import org.junit.Assert; import org.junit.Test; +import org.junit.runner.RunWith; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -43,20 +46,21 @@ import static org.junit.Assert.assertTrue; * * @author Gary Pampara */ +@RunWith(JMock.class) public class SolutionTest { + private Mockery mockery = new JUnit4Mockery(); @Test public void result() { - Vector target = Vectors.create(1.0); - Individual i = new Individual(); - i.getProperties().put(EntityType.CANDIDATE_SOLUTION, target); + final Algorithm algorithm = mockery.mock(Algorithm.class); + final OptimisationSolution mockSolution = new OptimisationSolution(Vectors.create(1.0), InferiorFitness.instance()); - EC ec = new EC(); - Topology<Individual> topology = (Topology<Individual>) ec.getTopology(); - topology.add(i); + mockery.checking(new Expectations() {{ + oneOf(algorithm).getBestSolution(); will(returnValue(mockSolution)); + }}); Measurement m = new Solution(); - Assert.assertEquals(m.getValue(ec).toString(), target.toString()); + Assert.assertEquals(m.getValue(algorithm).toString(), mockSolution.getPosition().toString()); } @Test -- 1.6.4 |
From: Gary P. <gpa...@gm...> - 2009-08-24 08:51:10
|
The need to have an interface for Algorithm is very high. It promotes better unit testing as it can be mocked out successfully. Signed-off-by: Gary Pampara <gpa...@gm...> --- .../{Algorithm.java => AbstractAlgorithm.java} | 13 +- .../net/sourceforge/cilib/algorithm/Algorithm.java | 350 +------------------- .../algorithm/MultistartOptimisationAlgorithm.java | 10 +- .../cilib/algorithm/SingularAlgorithm.java | 2 +- .../population/PopulationBasedAlgorithm.java | 4 +- .../rnaprediction/RNAAccuracyMeasurement.java | 3 +- .../sequencealignment/AlignmentVisualizer.java | 2 +- .../DesiredMaximizationFitness.java | 5 +- .../net/sourceforge/cilib/boa/bee/OnlookerBee.java | 4 +- .../net/sourceforge/cilib/boa/bee/WorkerBee.java | 4 +- .../cilib/clustering/kmeans/KMeans.java | 3 +- .../ExponentiallyDecreasingControlParameter.java | 3 +- .../ExponentiallyIncreasingControlParameter.java | 3 +- .../LinearDecreasingControlParameter.java | 3 +- .../LinearIncreasingControlParameter.java | 3 +- .../splitstrategies/ImperfectSplitStrategy.java | 7 +- .../splitstrategies/IndexedSplitStrategy.java | 5 +- .../splitstrategies/PerfectSplitStrategy.java | 3 +- .../continuous/dynamic/moo/fda1/FDA1_g.java | 4 +- .../continuous/dynamic/moo/fda2/FDA2_h.java | 4 +- .../discrete/LongestCommonSubsequence.java | 8 +- .../games/random/FixedListSeedingStrategy.java | 4 +- .../games/random/RandomListSeedingStrategy.java | 4 +- .../cilib/measurement/generic/Iterations.java | 3 +- .../measurement/generic/PercentageComplete.java | 4 +- .../measurement/multiple/MultipleFitness.java | 3 +- .../measurement/multiple/MultipleSolutions.java | 3 +- .../measurement/single/ConvergedDimensions.java | 1 - .../measurement/single/FitnessEvaluations.java | 1 + .../AverageDiversityAroundAllEntities.java | 5 +- .../GBestCenterInitialisationStrategy.java | 4 +- .../SpatialCenterInitialisationStrategy.java | 4 +- .../normalisation/TopologyBasedNormalisation.java | 5 +- .../ArchivingIterationStrategy.java | 3 +- .../foundation/EvaluationMediator.java | 4 +- .../foundation/measurements/NNOutput.java | 3 +- .../postSimulation/PostMeasurementSuite.java | 4 +- .../FFNNEvaluationMediator.java | 3 +- .../SAILAEvaluationMediator.java | 3 +- .../IterationBasedChangeStrategy.java | 4 +- ...CoevolutionGameLearningOptimizationProblem.java | 5 +- .../pso/dynamic/ChargedVelocityUpdateStrategy.java | 4 +- .../ArchiveReevaluationResponseStrategy.java | 4 +- ...lutionParticleReevaluationResponseStrategy.java | 4 +- .../VEPSOGuideSelectionStrategy.java | 4 +- .../DominantGuideUpdateStrategy.java | 3 +- .../cilib/pso/particle/MultiObjectiveParticle.java | 4 +- .../DEPositionUpdateStrategy.java | 4 +- .../BareBonesDEVelocityUpdate.java | 4 +- .../CoherenceVelocityUpdate.java | 4 +- .../FDRVelocityUpdateStrategy.java | 6 +- .../FIPSVelocityUpdate.java | 4 +- .../GCVelocityUpdateStrategy.java | 6 +- .../sourceforge/cilib/simulator/Simulation.java | 5 +- .../net/sourceforge/cilib/simulator/Simulator.java | 5 +- .../cilib/stoppingcondition/MinimumDiversity.java | 3 +- .../sourceforge/cilib/util/ClusteringUtils.java | 3 +- .../calculator/EntityBasedFitnessCalculator.java | 3 +- .../calculator/PropertyBasedFitnessCalculator.java | 3 +- .../StructuredTypeFitnessCalculator.java | 3 +- .../recipes/RingBasedPopulationSelection.java | 4 +- .../cilib/algorithm/GenericAlgorithmTest.java | 10 +- 62 files changed, 146 insertions(+), 457 deletions(-) copy src/main/java/net/sourceforge/cilib/algorithm/{Algorithm.java => AbstractAlgorithm.java} (97%) diff --git a/src/main/java/net/sourceforge/cilib/algorithm/Algorithm.java b/src/main/java/net/sourceforge/cilib/algorithm/AbstractAlgorithm.java similarity index 97% copy from src/main/java/net/sourceforge/cilib/algorithm/Algorithm.java copy to src/main/java/net/sourceforge/cilib/algorithm/AbstractAlgorithm.java index dd307f4..80d0784 100644 --- a/src/main/java/net/sourceforge/cilib/algorithm/Algorithm.java +++ b/src/main/java/net/sourceforge/cilib/algorithm/AbstractAlgorithm.java @@ -27,7 +27,6 @@ import java.util.List; import net.sourceforge.cilib.problem.OptimisationProblem; import net.sourceforge.cilib.problem.OptimisationSolution; import net.sourceforge.cilib.stoppingcondition.StoppingCondition; -import net.sourceforge.cilib.util.Cloneable; /** * <p> @@ -40,7 +39,7 @@ import net.sourceforge.cilib.util.Cloneable; * </p> * @author Edwin Peer */ -public abstract class Algorithm implements Cloneable, Runnable { +public abstract class AbstractAlgorithm implements Algorithm, Runnable { private static final long serialVersionUID = 7197544770653732632L; private List<StoppingCondition> stoppingConditions; private List<AlgorithmListener> algorithmListeners; @@ -68,7 +67,7 @@ public abstract class Algorithm implements Cloneable, Runnable { * for the instance and initialises the needed containers needed for the different * {@linkplain AlgorithmEvent}s that are generated. */ - protected Algorithm() { + protected AbstractAlgorithm() { stoppingConditions = new ArrayList<StoppingCondition>(); algorithmListeners = new ArrayList<AlgorithmListener>(); @@ -80,7 +79,7 @@ public abstract class Algorithm implements Cloneable, Runnable { * Copy constructor. Create a deep copy of the provided instance and return it. * @param copy The instance to copy. */ - protected Algorithm(Algorithm copy) { + protected AbstractAlgorithm(AbstractAlgorithm copy) { stoppingConditions = new ArrayList<StoppingCondition>(); for (StoppingCondition stoppingCondition : copy.stoppingConditions) { StoppingCondition clone = stoppingCondition.getClone(); @@ -104,7 +103,7 @@ public abstract class Algorithm implements Cloneable, Runnable { * {@inheritDoc} */ @Override - public abstract Algorithm getClone(); + public abstract AbstractAlgorithm getClone(); /** @@ -280,8 +279,8 @@ public abstract class Algorithm implements Cloneable, Runnable { * Accessor for the top-level currently executing algorithm running in the current thread. * @return the instance of the algorithm that is running in the current thread. */ - public static Algorithm get() { - return currentAlgorithmStack.get().peek(); + public static AbstractAlgorithm get() { + return (AbstractAlgorithm) currentAlgorithmStack.get().peek(); } /** diff --git a/src/main/java/net/sourceforge/cilib/algorithm/Algorithm.java b/src/main/java/net/sourceforge/cilib/algorithm/Algorithm.java index dd307f4..d49e5d2 100644 --- a/src/main/java/net/sourceforge/cilib/algorithm/Algorithm.java +++ b/src/main/java/net/sourceforge/cilib/algorithm/Algorithm.java @@ -21,358 +21,40 @@ */ package net.sourceforge.cilib.algorithm; -import java.util.ArrayList; -import java.util.List; - import net.sourceforge.cilib.problem.OptimisationProblem; import net.sourceforge.cilib.problem.OptimisationSolution; -import net.sourceforge.cilib.stoppingcondition.StoppingCondition; import net.sourceforge.cilib.util.Cloneable; /** - * <p> - * All algorithms in CIlib should be subclasses of <code>Algorithm</code>. This class handles - * stopping criteria, events, threading and measurements. Subclasses of <code>Algorithm</code> - * must provide an implementation for <code>protected abstract void performIteration()</code>. If - * a subclass overrides {@link #initialise()} then it must call <code>super.initialise()</code>. - * Failure to do so will cause an {@linkplain InitialisationException} to be thrown when {@link #run()} - * is called. - * </p> - * @author Edwin Peer + * */ -public abstract class Algorithm implements Cloneable, Runnable { - private static final long serialVersionUID = 7197544770653732632L; - private List<StoppingCondition> stoppingConditions; - private List<AlgorithmListener> algorithmListeners; - private int iterations; - private volatile boolean running; - private boolean initialised; - - protected OptimisationProblem optimisationProblem; - - /** - * This {@linkplain ThreadLocal} variable maintains the stack of the currently - * executing algorithm. It is defined as a static member and as a result is not - * required to be marked as transient as static members are not allowed to be - * serializable according to the Java Specification. - */ - private static ThreadLocal<AlgorithmStack> currentAlgorithmStack = new ThreadLocal<AlgorithmStack>() { - @Override - protected AlgorithmStack initialValue() { - return new AlgorithmStack(); - } - }; - - /** - * Default constructor for {@linkplain Algorithm} classes. Sets up the correct state - * for the instance and initialises the needed containers needed for the different - * {@linkplain AlgorithmEvent}s that are generated. - */ - protected Algorithm() { - stoppingConditions = new ArrayList<StoppingCondition>(); - algorithmListeners = new ArrayList<AlgorithmListener>(); - - running = false; - initialised = false; - } - - /** - * Copy constructor. Create a deep copy of the provided instance and return it. - * @param copy The instance to copy. - */ - protected Algorithm(Algorithm copy) { - stoppingConditions = new ArrayList<StoppingCondition>(); - for (StoppingCondition stoppingCondition : copy.stoppingConditions) { - StoppingCondition clone = stoppingCondition.getClone(); - clone.setAlgorithm(this); - stoppingConditions.add(clone); - } - - algorithmListeners = new ArrayList<AlgorithmListener>(); - for (AlgorithmListener listen : copy.algorithmListeners) { - algorithmListeners.add(listen.getClone()); - } - - running = false; - initialised = false; - - if (copy.optimisationProblem != null) - optimisationProblem = copy.optimisationProblem.getClone(); - } - - /** - * {@inheritDoc} - */ - @Override - public abstract Algorithm getClone(); - - - /** - * Reset the {@linkplain Algorithm} internals if needed. - */ - public void reset() { - throw new UnsupportedOperationException("'reset()' method not implemented for '" + this.getClass().getName() + "'"); - } - - /** - * Initialises the algorithm. Must be called before {@link #run()} is called. - */ - public final void initialise() { - iterations = 0; - running = true; - initialised = true; - - if (stoppingConditions.isEmpty()) - throw new InitialisationException("No stopping conditions specified"); - - for (StoppingCondition stoppingCondition : stoppingConditions) - stoppingCondition.setAlgorithm(this); - - currentAlgorithmStack.get().push(this); - performInitialisation(); - currentAlgorithmStack.get().pop(); - } - - /** - * Perform the actions of the current {@linkplain Algorithm} for a single iteration. This - * method calls {@linkplain Algorithm#algorithmIteration()} after it performs some - * internal tasks by maintaining the stack of the currently executing algorithm instances. - */ - public final void performIteration() { - currentAlgorithmStack.get().push(this); - algorithmIteration(); - iterations++; - currentAlgorithmStack.get().pop(); - } - - /** - * The actual operations that the current {@linkplain Algorithm} performs within a single - * iteration. - */ - protected abstract void algorithmIteration(); - - /** - * Perform the needed initialisation required before the execution of the algorithm - * starts. - */ - public void performInitialisation() { - // subclasses can override the behaviour for this method - } - - /** - * Perform the needed unintialisation steps after the algorithm completes it's - * execution. - */ - public void performUninitialisation() { - // subclasses can override the behaviour for this method - } - - /** - * Executes the algorithm. - * @exception InitialisationException algorithm was not properly initialised. - */ - @Override - public void run() { - if (!initialised) { - throw new InitialisationException("Algorithm not initialised"); - } - - fireAlgorithmStarted(); - - currentAlgorithmStack.get().push(this); - - while (running && (!isFinished())) { - performIteration(); - fireIterationCompleted(); - } +public interface Algorithm extends Cloneable { - if (running) { - fireAlgorithmFinished(); - } - else { - fireAlgorithmTerminated(); - } + public OptimisationSolution getBestSolution(); - performUninitialisation(); + public void performIteration(); - currentAlgorithmStack.remove(); - } - - /** - * Adds a stopping condition. - * @param stoppingCondition A {@link net.sourceforge.cilib.stoppingcondition.StoppingCondition} - * to be added. - */ - public final void addStoppingCondition(StoppingCondition stoppingCondition) { - stoppingConditions.add(stoppingCondition); - } - - /** - * Removes a stopping condition. - * @param stoppingCondition The {@link net.sourceforge.cilib.stoppingcondition.StoppingCondition} - * to be removed. - */ - public final void removeStoppingCondition(StoppingCondition stoppingCondition) { - stoppingConditions.remove(stoppingCondition); - } - - /** - * Adds an algorithm event listener. Event listeners are notified at various stages during the - * execution of an algorithm. - * @param listener An {@link AlgorithmListener} to be added. - */ - public final void addAlgorithmListener(AlgorithmListener listener) { - algorithmListeners.add(listener); - } - - /** - * Removes an algorithm event listener. - * @param listener The {@link AlgorithmListener} to be removed. - */ - public final void removeAlgorithmListener(AlgorithmListener listener) { - algorithmListeners.remove(listener); - } - - /** - * Returns the number of iterations that have been performed by the algorihtm. - * @return The number of iterations. - */ - public final int getIterations() { - return iterations; - } - - /** - * Returns the percentage the algorithm is from completed (as a fraction). The percentage - * complete is calculated based on the stopping condition that is closest to finished. - * @return The percentage complete as a fraction. + /** + * Not Needed>??>???????????? */ - public final double getPercentageComplete() { - double percentageComplete = 0; - for (StoppingCondition condition : stoppingConditions) { - if (condition.getPercentageCompleted() > percentageComplete) { - percentageComplete = condition.getPercentageCompleted(); - } - } - return percentageComplete; - } + public void performInitialisation(); - /** - * Returns true if the algorithm has finished executing. - * @return true if the algorithm is finished + /** + * Not Needed>??>???????????? */ - public final boolean isFinished() { - for (StoppingCondition condition : stoppingConditions) { - if (condition.isCompleted()) { - return true; - } - } - return false; - } + public void performUninitialisation(); - /** - * Terminates the algorithm. - */ - public final void terminate() { - running = false; - } + public Iterable<OptimisationSolution> getSolutions(); - /** - * Accessor for the top-level currently executing algorithm running in the current thread. - * @return the instance of the algorithm that is running in the current thread. - */ - public static Algorithm get() { - return currentAlgorithmStack.get().peek(); - } + public OptimisationProblem getOptimisationProblem(); /** - * Static accessor to allow the current level of algorithm composition to be returned. - * @see AlgorithmStack#asList() - * @return An unmodifiable list of algorithms. + * ???? Not needed? */ - public static List<Algorithm> getAlgorithmList() { - return currentAlgorithmStack.get().asList(); - } + public void reset(); /** - * Get the current list of {@linkplain StoppingCondition} instances that are - * associated with the current {@linkplain Algorithm}. - * @return The list of {@linkplain StoppingCondition} instances associated with - * the current {@linkplain Algorithm}. + * Not Needed>??>???????????? */ - public List<StoppingCondition> getStoppingConditions() { - return this.stoppingConditions; - } - - /** - * Fire the {@linkplain AlgorithmEvent} to indicate that the {@linkplain Algorithm} - * has started execution. - */ - private void fireAlgorithmStarted() { - for (AlgorithmListener listener : algorithmListeners) { - listener.algorithmStarted(new AlgorithmEvent(this)); - } - } - - /** - * Fire the {@linkplain AlgorithmEvent} to indicate that the {@linkplain Algorithm} - * has finished execution. - */ - private void fireAlgorithmFinished() { - for (AlgorithmListener listener : algorithmListeners) { - listener.algorithmFinished(new AlgorithmEvent(this)); - } - } - - /** - * Fire the {@linkplain AlgorithmEvent} to indicate that the {@linkplain Algorithm} - * has been terminated. - */ - private void fireAlgorithmTerminated() { - for (AlgorithmListener listener : algorithmListeners) { - listener.algorithmTerminated(new AlgorithmEvent(this)); - } - } - - /** - * Fire the {@linkplain AlgorithmEvent} to indicate that the {@linkplain Algorithm} - * has completed an iteration. - */ - private void fireIterationCompleted() { - for (AlgorithmListener listener : algorithmListeners) { - listener.iterationCompleted(new AlgorithmEvent(this)); - } - } - - /** - * Set the optimisation problem to be solved. By default, the problem is <code>null</code>. - * That is, it is necessary to set the optimisation problem before calling {@link #initialise()}. - * @param problem An implementation of the - * {@link net.sourceforge.cilib.problem.OptimisationProblemAdapter} interface. - */ - public void setOptimisationProblem(OptimisationProblem problem) { - this.optimisationProblem = problem; - } - - /** - * Get the specified {@linkplain OptimisationProblem}. - * @return The specified {@linkplain OptimisationProblem}. - */ - public OptimisationProblem getOptimisationProblem() { - return this.optimisationProblem; - } - - /** - * Get the best current solution. This best solution is determined from the personal bests of the - * particles. - * @return The <code>OptimisationSolution</code> representing the best solution. - */ - public abstract OptimisationSolution getBestSolution(); - - /** - * Get the collection of best solutions. This result does not actually make sense in the normal - * PSO algorithm, but rather in a MultiObjective optimization. - * @return The <code>Collection<OptimisationSolution></code> containing the solutions. - */ - public abstract List<OptimisationSolution> getSolutions(); - + public int getIterations(); } diff --git a/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgorithm.java b/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgorithm.java index 8ef8f51..e875eb6 100644 --- a/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgorithm.java +++ b/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgorithm.java @@ -51,7 +51,7 @@ import net.sourceforge.cilib.type.types.Type; * * @author Edwin Peer */ -public class MultistartOptimisationAlgorithm extends Algorithm implements ParticipatingAlgorithm { +public class MultistartOptimisationAlgorithm extends AbstractAlgorithm implements ParticipatingAlgorithm { private static final long serialVersionUID = 1493525363256406120L; /** Creates a new instance of MultistartOptimisationAlgorithm. */ @@ -83,8 +83,8 @@ public class MultistartOptimisationAlgorithm extends Algorithm implements Partic * @param algorithm Any {@link OptimisationAlgorithm} that extends {@link Algorithm}. */ public void setTargetAlgorithm(Algorithm algorithm) { - optimisationAlgorithm = algorithm; - this.algorithm = (Algorithm) algorithm; + optimisationAlgorithm = (AbstractAlgorithm) algorithm; + this.algorithm = (AbstractAlgorithm) algorithm; this.algorithm.addStoppingCondition(singleIteration); } @@ -215,8 +215,8 @@ public class MultistartOptimisationAlgorithm extends Algorithm implements Partic return solutions; } - private Algorithm algorithm; - private Algorithm optimisationAlgorithm; + private AbstractAlgorithm algorithm; + private AbstractAlgorithm optimisationAlgorithm; private int restarts; private SingleIteration singleIteration; private MultistartProblemAdapter problem; diff --git a/src/main/java/net/sourceforge/cilib/algorithm/SingularAlgorithm.java b/src/main/java/net/sourceforge/cilib/algorithm/SingularAlgorithm.java index 195179e..166a1c9 100644 --- a/src/main/java/net/sourceforge/cilib/algorithm/SingularAlgorithm.java +++ b/src/main/java/net/sourceforge/cilib/algorithm/SingularAlgorithm.java @@ -28,7 +28,7 @@ package net.sourceforge.cilib.algorithm; * Examples of such algorithms will include <tt>KMeans</tt>, <tt>Gradient Decent</tt> etc. * */ -public abstract class SingularAlgorithm extends Algorithm { +public abstract class SingularAlgorithm extends AbstractAlgorithm { private static final long serialVersionUID = 8524134633474124524L; /** diff --git a/src/main/java/net/sourceforge/cilib/algorithm/population/PopulationBasedAlgorithm.java b/src/main/java/net/sourceforge/cilib/algorithm/population/PopulationBasedAlgorithm.java index bb81271..e8f54c8 100644 --- a/src/main/java/net/sourceforge/cilib/algorithm/population/PopulationBasedAlgorithm.java +++ b/src/main/java/net/sourceforge/cilib/algorithm/population/PopulationBasedAlgorithm.java @@ -22,7 +22,7 @@ package net.sourceforge.cilib.algorithm.population; import java.util.List; -import net.sourceforge.cilib.algorithm.Algorithm; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.initialisation.PopulationInitialisationStrategy; import net.sourceforge.cilib.entity.Entity; import net.sourceforge.cilib.entity.Topology; @@ -33,7 +33,7 @@ import net.sourceforge.cilib.problem.OptimisationSolution; * Base class for all algorithms that manage a collection of * {@linkplain Entity entities} in some manner. */ -public abstract class PopulationBasedAlgorithm extends Algorithm { +public abstract class PopulationBasedAlgorithm extends AbstractAlgorithm { protected PopulationBasedAlgorithm() { } diff --git a/src/main/java/net/sourceforge/cilib/bioinf/rnaprediction/RNAAccuracyMeasurement.java b/src/main/java/net/sourceforge/cilib/bioinf/rnaprediction/RNAAccuracyMeasurement.java index 8fe8fcf..05a701c 100644 --- a/src/main/java/net/sourceforge/cilib/bioinf/rnaprediction/RNAAccuracyMeasurement.java +++ b/src/main/java/net/sourceforge/cilib/bioinf/rnaprediction/RNAAccuracyMeasurement.java @@ -21,7 +21,6 @@ */ package net.sourceforge.cilib.bioinf.rnaprediction; -import java.util.Collection; import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.measurement.Measurement; @@ -47,7 +46,7 @@ public class RNAAccuracyMeasurement implements Measurement { } public Type getValue(Algorithm algorithm) { - Collection<OptimisationSolution> solutions = algorithm.getSolutions(); + Iterable<OptimisationSolution> solutions = algorithm.getSolutions(); StringBuilder sb = new StringBuilder(); //Iterator i = solutions.iterator(); for (OptimisationSolution solution : solutions) { diff --git a/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/AlignmentVisualizer.java b/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/AlignmentVisualizer.java index 364b91a..a449bd7 100644 --- a/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/AlignmentVisualizer.java +++ b/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/AlignmentVisualizer.java @@ -47,7 +47,7 @@ public class AlignmentVisualizer implements Measurement { String lineOfStars=""; fullyMatchedColumnCounter = 0; - ArrayList<String> as = new ArrayList<String>(((AlignmentCreator) ((MSAProblem) algorithm.getOptimisationProblem()).getAlignmentCreator()).getAlignment()); + ArrayList<String> as = new ArrayList<String>((((MSAProblem) algorithm.getOptimisationProblem()).getAlignmentCreator()).getAlignment()); //checks for fully matched columns if (fullColumns) { diff --git a/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/DesiredMaximizationFitness.java b/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/DesiredMaximizationFitness.java index 11aa0c1..2e91123 100644 --- a/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/DesiredMaximizationFitness.java +++ b/src/main/java/net/sourceforge/cilib/bioinf/sequencealignment/DesiredMaximizationFitness.java @@ -21,6 +21,7 @@ */ package net.sourceforge.cilib.bioinf.sequencealignment; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.stoppingcondition.StoppingCondition; @@ -33,7 +34,7 @@ import net.sourceforge.cilib.stoppingcondition.StoppingCondition; */ public class DesiredMaximizationFitness implements StoppingCondition { private static final long serialVersionUID = 6494553632698710933L; - private Algorithm algorithm; + private AbstractAlgorithm algorithm; private double desiredFitness; private int quitAnywayAfterIterations; @@ -69,7 +70,7 @@ public class DesiredMaximizationFitness implements StoppingCondition { } public void setAlgorithm(Algorithm algorithm) { - this.algorithm = algorithm; + this.algorithm = (AbstractAlgorithm) algorithm; } public int getQuitAnywayAfterIterations() { diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java b/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java index 15e3d02..56f614d 100644 --- a/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java +++ b/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java @@ -21,7 +21,7 @@ */ package net.sourceforge.cilib.boa.bee; -import net.sourceforge.cilib.algorithm.Algorithm; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.boa.ABC; @@ -68,7 +68,7 @@ public class OnlookerBee extends AbstractBee implements HoneyBee { */ @Override public void updatePosition() { - ABC algorithm = (ABC) Algorithm.get(); + ABC algorithm = (ABC) AbstractAlgorithm.get(); HoneyBee target = targetSelectionStrategy.select(algorithm.getWorkerBees()); while (target == this) { diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java b/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java index 33339d8..479201f 100644 --- a/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java +++ b/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java @@ -21,7 +21,7 @@ */ package net.sourceforge.cilib.boa.bee; -import net.sourceforge.cilib.algorithm.Algorithm; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.boa.ABC; import net.sourceforge.cilib.controlparameter.ConstantControlParameter; import net.sourceforge.cilib.controlparameter.ControlParameter; @@ -67,7 +67,7 @@ public class WorkerBee extends AbstractBee implements HoneyBee { */ @Override public void updatePosition() { - ABC algorithm = (ABC) Algorithm.get(); + ABC algorithm = (ABC) AbstractAlgorithm.get(); HoneyBee target = targetSelectionStrategy.select(algorithm.getWorkerBees()); while (target == this) { 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 8f85a73..7be5f1d 100644 --- a/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java +++ b/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java @@ -26,7 +26,6 @@ import java.util.Arrays; import java.util.Hashtable; import java.util.List; -import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.algorithm.SingularAlgorithm; import net.sourceforge.cilib.math.Stats; import net.sourceforge.cilib.problem.OptimisationSolution; @@ -85,7 +84,7 @@ public class KMeans extends SingularAlgorithm { * {@inheritDoc} */ @Override - public Algorithm getClone() { + public KMeans getClone() { return new KMeans(this); } diff --git a/src/main/java/net/sourceforge/cilib/controlparameter/ExponentiallyDecreasingControlParameter.java b/src/main/java/net/sourceforge/cilib/controlparameter/ExponentiallyDecreasingControlParameter.java index 47db47c..1693b1e 100644 --- a/src/main/java/net/sourceforge/cilib/controlparameter/ExponentiallyDecreasingControlParameter.java +++ b/src/main/java/net/sourceforge/cilib/controlparameter/ExponentiallyDecreasingControlParameter.java @@ -21,6 +21,7 @@ */ package net.sourceforge.cilib.controlparameter; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.Algorithm; /** @@ -60,7 +61,7 @@ public class ExponentiallyDecreasingControlParameter extends BoundedControlParam */ @Override public void update() { - double result = Math.exp((-1) * Algorithm.get().getPercentageComplete()); + double result = Math.exp((-1) * AbstractAlgorithm.get().getPercentageComplete()); this.parameter.setReal(result); } diff --git a/src/main/java/net/sourceforge/cilib/controlparameter/ExponentiallyIncreasingControlParameter.java b/src/main/java/net/sourceforge/cilib/controlparameter/ExponentiallyIncreasingControlParameter.java index d5a7dd1..43c15b7 100644 --- a/src/main/java/net/sourceforge/cilib/controlparameter/ExponentiallyIncreasingControlParameter.java +++ b/src/main/java/net/sourceforge/cilib/controlparameter/ExponentiallyIncreasingControlParameter.java @@ -21,6 +21,7 @@ */ package net.sourceforge.cilib.controlparameter; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.Algorithm; /** @@ -60,7 +61,7 @@ public class ExponentiallyIncreasingControlParameter extends BoundedControlParam */ @Override public void update() { - double result = Math.exp(Algorithm.get().getPercentageComplete() - 1); + double result = Math.exp(AbstractAlgorithm.get().getPercentageComplete() - 1); this.parameter.setReal(result); } diff --git a/src/main/java/net/sourceforge/cilib/controlparameter/LinearDecreasingControlParameter.java b/src/main/java/net/sourceforge/cilib/controlparameter/LinearDecreasingControlParameter.java index 84fc6d5..190ca5c 100644 --- a/src/main/java/net/sourceforge/cilib/controlparameter/LinearDecreasingControlParameter.java +++ b/src/main/java/net/sourceforge/cilib/controlparameter/LinearDecreasingControlParameter.java @@ -21,6 +21,7 @@ */ package net.sourceforge.cilib.controlparameter; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.Algorithm; /** @@ -60,7 +61,7 @@ public class LinearDecreasingControlParameter extends BoundedControlParameter { * {@inheritDoc} */ public void update() { - double result = getUpperBound() - (getUpperBound() - getLowerBound()) * Algorithm.get().getPercentageComplete(); + double result = getUpperBound() - (getUpperBound() - getLowerBound()) * AbstractAlgorithm.get().getPercentageComplete(); parameter.setReal(result); } diff --git a/src/main/java/net/sourceforge/cilib/controlparameter/LinearIncreasingControlParameter.java b/src/main/java/net/sourceforge/cilib/controlparameter/LinearIncreasingControlParameter.java index cf18d0b..3f3fb5e 100644 --- a/src/main/java/net/sourceforge/cilib/controlparameter/LinearIncreasingControlParameter.java +++ b/src/main/java/net/sourceforge/cilib/controlparameter/LinearIncreasingControlParameter.java @@ -21,6 +21,7 @@ */ package net.sourceforge.cilib.controlparameter; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.Algorithm; /** @@ -62,7 +63,7 @@ public class LinearIncreasingControlParameter extends BoundedControlParameter { * The update is done in an increasing manner. */ public void update() { - double result = getLowerBound() + (getUpperBound() - getLowerBound()) * Algorithm.get().getPercentageComplete(); + double result = getLowerBound() + (getUpperBound() - getLowerBound()) * AbstractAlgorithm.get().getPercentageComplete(); parameter.setReal(result); } diff --git a/src/main/java/net/sourceforge/cilib/cooperative/splitstrategies/ImperfectSplitStrategy.java b/src/main/java/net/sourceforge/cilib/cooperative/splitstrategies/ImperfectSplitStrategy.java index 48a2b17..c27b197 100644 --- a/src/main/java/net/sourceforge/cilib/cooperative/splitstrategies/ImperfectSplitStrategy.java +++ b/src/main/java/net/sourceforge/cilib/cooperative/splitstrategies/ImperfectSplitStrategy.java @@ -23,7 +23,6 @@ package net.sourceforge.cilib.cooperative.splitstrategies; import java.util.List; -import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.algorithm.InitialisationException; import net.sourceforge.cilib.algorithm.population.PopulationBasedAlgorithm; import net.sourceforge.cilib.cooperative.CooperativeEntity; @@ -54,7 +53,7 @@ public class ImperfectSplitStrategy extends IndexedSplitStrategy { int offset = 0; if (remainder == 0) { - for (Algorithm population : populations) { + for (PopulationBasedAlgorithm population : populations) { population.setOptimisationProblem(new CooperativeOptimisationProblemAdapter(problem, context, splitSize, offset)); offset += splitSize; } @@ -75,7 +74,7 @@ public class ImperfectSplitStrategy extends IndexedSplitStrategy { } for (int i = 0; i < populations.size(); ++i) { - Algorithm population = (Algorithm) populations.get(i); + PopulationBasedAlgorithm population = populations.get(i); offset = indices.get(i); int dimension; if ((i + 1) < indices.size()) @@ -83,7 +82,7 @@ public class ImperfectSplitStrategy extends IndexedSplitStrategy { else dimension = problem.getDomain().getDimension() - indices.get(i); // TODO check whether this cast is safe - ((Algorithm) population).setOptimisationProblem(new CooperativeOptimisationProblemAdapter(problem, context, dimension, offset)); + population.setOptimisationProblem(new CooperativeOptimisationProblemAdapter(problem, context, dimension, offset)); } } } diff --git a/src/main/java/net/sourceforge/cilib/cooperative/splitstrategies/IndexedSplitStrategy.java b/src/main/java/net/sourceforge/cilib/cooperative/splitstrategies/IndexedSplitStrategy.java index 228d402..a5ab93c 100644 --- a/src/main/java/net/sourceforge/cilib/cooperative/splitstrategies/IndexedSplitStrategy.java +++ b/src/main/java/net/sourceforge/cilib/cooperative/splitstrategies/IndexedSplitStrategy.java @@ -24,7 +24,6 @@ package net.sourceforge.cilib.cooperative.splitstrategies; import java.util.ArrayList; import java.util.List; -import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.algorithm.InitialisationException; import net.sourceforge.cilib.algorithm.population.PopulationBasedAlgorithm; import net.sourceforge.cilib.cooperative.CooperativeEntity; @@ -67,7 +66,7 @@ public class IndexedSplitStrategy implements SplitStrategy { throw new InitialisationException("Problem dimensionality should be equal to or greater than the number of cooperating populations."); for (int i = 0; i < populations.size(); ++i) { - Algorithm population = (Algorithm) populations.get(i); + PopulationBasedAlgorithm population = populations.get(i); int offset = indices.get(i); int dimension; if ((i + 1) < indices.size()) @@ -75,7 +74,7 @@ public class IndexedSplitStrategy implements SplitStrategy { else dimension = problem.getDomain().getDimension() - indices.get(i); // TODO check whether this cast is safe - ((Algorithm) population).setOptimisationProblem(new CooperativeOptimisationProblemAdapter(problem, context, dimension, offset)); + population.setOptimisationProblem(new CooperativeOptimisationProblemAdapter(problem, context, dimension, offset)); } } } diff --git a/src/main/java/net/sourceforge/cilib/cooperative/splitstrategies/PerfectSplitStrategy.java b/src/main/java/net/sourceforge/cilib/cooperative/splitstrategies/PerfectSplitStrategy.java index 3e053a5..28c17c9 100644 --- a/src/main/java/net/sourceforge/cilib/cooperative/splitstrategies/PerfectSplitStrategy.java +++ b/src/main/java/net/sourceforge/cilib/cooperative/splitstrategies/PerfectSplitStrategy.java @@ -23,7 +23,6 @@ package net.sourceforge.cilib.cooperative.splitstrategies; import java.util.List; -import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.algorithm.InitialisationException; import net.sourceforge.cilib.algorithm.population.PopulationBasedAlgorithm; import net.sourceforge.cilib.cooperative.CooperativeEntity; @@ -43,7 +42,7 @@ public class PerfectSplitStrategy implements SplitStrategy { throw new InitialisationException("A Problem with dimension " + problem.getDomain().getDimension() + " cannot be split into parts of equal size when using " + populations.size() + " populations"); int dimension = problem.getDomain().getDimension() / populations.size(); int offset = 0; - for (Algorithm population : populations) { + for (PopulationBasedAlgorithm population : populations) { // TODO check whether this cast is safe population.setOptimisationProblem(new CooperativeOptimisationProblemAdapter(problem, context, dimension, offset)); offset += dimension; diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/dynamic/moo/fda1/FDA1_g.java b/src/main/java/net/sourceforge/cilib/functions/continuous/dynamic/moo/fda1/FDA1_g.java index b753f71..5e0ed80 100755 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/dynamic/moo/fda1/FDA1_g.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/dynamic/moo/fda1/FDA1_g.java @@ -21,7 +21,7 @@ */ package net.sourceforge.cilib.functions.continuous.dynamic.moo.fda1; -import net.sourceforge.cilib.algorithm.Algorithm; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.functions.ContinuousFunction; import net.sourceforge.cilib.type.types.container.Vector; @@ -130,7 +130,7 @@ public class FDA1_g extends ContinuousFunction { */ @Override public Double evaluate(Vector input) { - this.tau = Algorithm.get().getIterations(); + this.tau = AbstractAlgorithm.get().getIterations(); double t = (1.0/(double)n_t)*Math.floor((double)this.tau/(double)this.tau_t); double G = Math.sin(0.5*Math.PI*t); diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/dynamic/moo/fda2/FDA2_h.java b/src/main/java/net/sourceforge/cilib/functions/continuous/dynamic/moo/fda2/FDA2_h.java index d949cb3..ba6f4e7 100755 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/dynamic/moo/fda2/FDA2_h.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/dynamic/moo/fda2/FDA2_h.java @@ -21,7 +21,7 @@ */ package net.sourceforge.cilib.functions.continuous.dynamic.moo.fda2; -import net.sourceforge.cilib.algorithm.Algorithm; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.functions.ContinuousFunction; import net.sourceforge.cilib.type.types.container.Vector; import net.sourceforge.cilib.problem.FunctionMinimisationProblem; @@ -209,7 +209,7 @@ public class FDA2_h extends ContinuousFunction { */ @Override public Double evaluate(Vector input) { - this.tau = Algorithm.get().getIterations(); + this.tau = AbstractAlgorithm.get().getIterations(); double t = (1.0/(double)n_t)*Math.floor((double)this.tau/(double)this.tau_t); double H = 0.75 + 0.7*(Math.sin(0.5*Math.PI*t)); diff --git a/src/main/java/net/sourceforge/cilib/functions/discrete/LongestCommonSubsequence.java b/src/main/java/net/sourceforge/cilib/functions/discrete/LongestCommonSubsequence.java index 7e9b33a..3707e7e 100644 --- a/src/main/java/net/sourceforge/cilib/functions/discrete/LongestCommonSubsequence.java +++ b/src/main/java/net/sourceforge/cilib/functions/discrete/LongestCommonSubsequence.java @@ -22,7 +22,7 @@ package net.sourceforge.cilib.functions.discrete; -import net.sourceforge.cilib.algorithm.Algorithm; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.population.PopulationBasedAlgorithm; import net.sourceforge.cilib.functions.DiscreteFunction; import net.sourceforge.cilib.problem.OptimisationProblem; @@ -76,7 +76,7 @@ public class LongestCommonSubsequence extends DiscreteFunction { * @return The shortest length */ private String getShortestString() { - PopulationBasedAlgorithm popAlgorithm = (PopulationBasedAlgorithm) Algorithm.get(); + PopulationBasedAlgorithm popAlgorithm = (PopulationBasedAlgorithm) AbstractAlgorithm.get(); OptimisationProblem problem = popAlgorithm.getOptimisationProblem(); TextDataSetBuilder dataSetBuilder = (TextDataSetBuilder) problem.getDataSetBuilder(); @@ -84,7 +84,7 @@ public class LongestCommonSubsequence extends DiscreteFunction { } private int getDataSetSize() { - PopulationBasedAlgorithm popAlgorithm = (PopulationBasedAlgorithm) Algorithm.get(); + PopulationBasedAlgorithm popAlgorithm = (PopulationBasedAlgorithm) AbstractAlgorithm.get(); OptimisationProblem problem = popAlgorithm.getOptimisationProblem(); TextDataSetBuilder dataSetBuilder = (TextDataSetBuilder) problem.getDataSetBuilder(); @@ -110,7 +110,7 @@ public class LongestCommonSubsequence extends DiscreteFunction { private int matches(Vector x) { - PopulationBasedAlgorithm popAlgorithm = (PopulationBasedAlgorithm) Algorithm.get(); + PopulationBasedAlgorithm popAlgorithm = (PopulationBasedAlgorithm) AbstractAlgorithm.get(); OptimisationProblem problem = popAlgorithm.getOptimisationProblem(); TextDataSetBuilder dataSetBuilder = (TextDataSetBuilder) problem.getDataSetBuilder(); diff --git a/src/main/java/net/sourceforge/cilib/games/random/FixedListSeedingStrategy.java b/src/main/java/net/sourceforge/cilib/games/random/FixedListSeedingStrategy.java index fba7f5e..f85d7b3 100644 --- a/src/main/java/net/sourceforge/cilib/games/random/FixedListSeedingStrategy.java +++ b/src/main/java/net/sourceforge/cilib/games/random/FixedListSeedingStrategy.java @@ -21,7 +21,7 @@ */ package net.sourceforge.cilib.games.random; -import net.sourceforge.cilib.algorithm.Algorithm; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; /** * This class is similar to the {@linkplain ListSeedingStrategy} but differs in the following way. @@ -79,7 +79,7 @@ public class FixedListSeedingStrategy extends RandomListSeedingStrategy { if(index >= maxIndex) index = minIndex; //index changes with algorithm iterations - int currentIteration = Algorithm.get().getIterations(); + int currentIteration = AbstractAlgorithm.get().getIterations(); if (currentIteration != changeIteration && currentIteration % iterationModulus == 0) { changeIteration = currentIteration; minIndex += useCount; diff --git a/src/main/java/net/sourceforge/cilib/games/random/RandomListSeedingStrategy.java b/src/main/java/net/sourceforge/cilib/games/random/RandomListSeedingStrategy.java index a55c9bc..ff767bf 100644 --- a/src/main/java/net/sourceforge/cilib/games/random/RandomListSeedingStrategy.java +++ b/src/main/java/net/sourceforge/cilib/games/random/RandomListSeedingStrategy.java @@ -23,7 +23,7 @@ package net.sourceforge.cilib.games.random; import java.util.ArrayList; -import net.sourceforge.cilib.algorithm.Algorithm; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.math.random.generator.Seeder; /** @@ -66,7 +66,7 @@ public class RandomListSeedingStrategy extends ListSeedingStrategy { * Check if the seed list needs to be randomised. If so, generate a new list of seeds */ protected void updateSeed(){ - int currentIteration = Algorithm.get().getIterations(); + int currentIteration = AbstractAlgorithm.get().getIterations(); if(currentIteration != changeIteration && currentIteration % iterationModulus == 0){ changeIteration = currentIteration; randomizeSeeds(seeds.size()); diff --git a/src/main/java/net/sourceforge/cilib/measurement/generic/Iterations.java b/src/main/java/net/sourceforge/cilib/measurement/generic/Iterations.java index cb3d91c..e9eac18 100644 --- a/src/main/java/net/sourceforge/cilib/measurement/generic/Iterations.java +++ b/src/main/java/net/sourceforge/cilib/measurement/generic/Iterations.java @@ -21,6 +21,7 @@ */ package net.sourceforge.cilib.measurement.generic; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.measurement.Measurement; import net.sourceforge.cilib.type.types.Int; @@ -63,7 +64,7 @@ public class Iterations implements Measurement { */ public Type getValue(Algorithm algorithm) { Int i = new Int(); - i.setInt(algorithm.getIterations()); + i.setInt(((AbstractAlgorithm)algorithm).getIterations()); return i; } diff --git a/src/main/java/net/sourceforge/cilib/measurement/generic/PercentageComplete.java b/src/main/java/net/sourceforge/cilib/measurement/generic/PercentageComplete.java index 6871341..2d40451 100644 --- a/src/main/java/net/sourceforge/cilib/measurement/generic/PercentageComplete.java +++ b/src/main/java/net/sourceforge/cilib/measurement/generic/PercentageComplete.java @@ -21,6 +21,7 @@ */ package net.sourceforge.cilib.measurement.generic; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.measurement.Measurement; import net.sourceforge.cilib.type.types.Real; @@ -49,7 +50,8 @@ public class PercentageComplete implements Measurement { } public Type getValue(Algorithm algorithm) { - return new Real(algorithm.getPercentageComplete()); + AbstractAlgorithm alg = (AbstractAlgorithm) algorithm; + return new Real(alg.getPercentageComplete()); } } diff --git a/src/main/java/net/sourceforge/cilib/measurement/multiple/MultipleFitness.java b/src/main/java/net/sourceforge/cilib/measurement/multiple/MultipleFitness.java index ee03830..82dc010 100644 --- a/src/main/java/net/sourceforge/cilib/measurement/multiple/MultipleFitness.java +++ b/src/main/java/net/sourceforge/cilib/measurement/multiple/MultipleFitness.java @@ -21,7 +21,6 @@ */ package net.sourceforge.cilib.measurement.multiple; -import java.util.Collection; import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.measurement.Measurement; @@ -89,7 +88,7 @@ public class MultipleFitness implements Measurement { return fitnessValues.toArray();*/ Vector fitnessValues = new Vector(); - Collection<OptimisationSolution> solutions = algorithm.getSolutions(); + Iterable<OptimisationSolution> solutions = algorithm.getSolutions(); for (OptimisationSolution solution : solutions) { Double fitness = solution.getFitness().getValue(); diff --git a/src/main/java/net/sourceforge/cilib/measurement/multiple/MultipleSolutions.java b/src/main/java/net/sourceforge/cilib/measurement/multiple/MultipleSolutions.java index 7eb41f7..f4de0ed 100644 --- a/src/main/java/net/sourceforge/cilib/measurement/multiple/MultipleSolutions.java +++ b/src/main/java/net/sourceforge/cilib/measurement/multiple/MultipleSolutions.java @@ -21,7 +21,6 @@ */ package net.sourceforge.cilib.measurement.multiple; -import java.util.List; import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.measurement.Measurement; @@ -56,7 +55,7 @@ public class MultipleSolutions implements Measurement { public Type getValue(Algorithm algorithm) { Vector v = new Vector(); - List<OptimisationSolution> solutions = algorithm.getSolutions(); + Iterable<OptimisationSolution> solutions = algorithm.getSolutions(); for (OptimisationSolution solution : solutions) { v.append((Vector) solution.getPosition()); diff --git a/src/main/java/net/sourceforge/cilib/measurement/single/ConvergedDimensions.java b/src/main/java/net/sourceforge/cilib/measurement/single/ConvergedDimensions.java index 1d56a41..80065fb 100644 --- a/src/main/java/net/sourceforge/cilib/measurement/single/ConvergedDimensions.java +++ b/src/main/java/net/sourceforge/cilib/measurement/single/ConvergedDimensions.java @@ -100,7 +100,6 @@ public class ConvergedDimensions implements Measurement { * @throws ParseException if the provided {@code String} cannot be parsed. */ public void setTargetSolution(String stringRepresentation) throws ParseException { - System.out.println("Setting the target solition to: " + stringRepresentation); this.targetSolution = (Vector) DomainParser.parse(stringRepresentation); } diff --git a/src/main/java/net/sourceforge/cilib/measurement/single/FitnessEvaluations.java b/src/main/java/net/sourceforge/cilib/measurement/single/FitnessEvaluations.java index 336d09c..a2b0a2d 100644 --- a/src/main/java/net/sourceforge/cilib/measurement/single/FitnessEvaluations.java +++ b/src/main/java/net/sourceforge/cilib/measurement/single/FitnessEvaluations.java @@ -21,6 +21,7 @@ */ package net.sourceforge.cilib.measurement.single; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.measurement.Measurement; import net.sourceforge.cilib.type.types.Int; diff --git a/src/main/java/net/sourceforge/cilib/measurement/single/diversity/AverageDiversityAroundAllEntities.java b/src/main/java/net/sourceforge/cilib/measurement/single/diversity/AverageDiversityAroundAllEntities.java index 169c567..7c52288 100644 --- a/src/main/java/net/sourceforge/cilib/measurement/single/diversity/AverageDiversityAroundAllEntities.java +++ b/src/main/java/net/sourceforge/cilib/measurement/single/diversity/AverageDiversityAroundAllEntities.java @@ -23,7 +23,7 @@ package net.sourceforge.cilib.measurement.single.diversity; import java.util.Iterator; -import net.sourceforge.cilib.algorithm.Algorithm; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.population.PopulationBasedAlgorithm; import net.sourceforge.cilib.entity.Entity; import net.sourceforge.cilib.type.types.Real; @@ -45,8 +45,7 @@ public class AverageDiversityAroundAllEntities extends Diversity { * {@inheritDoc} */ public Type getValue() { - - PopulationBasedAlgorithm algorithm = (PopulationBasedAlgorithm) Algorithm.get(); + PopulationBasedAlgorithm algorithm = (PopulationBasedAlgorithm) AbstractAlgorithm.get(); int numberOfEntities = algorithm.getTopology().size(); Iterator<? extends Entity> populationCenterIterator = algorithm.getTopology().iterator(); diff --git a/src/main/java/net/sourceforge/cilib/measurement/single/diversity/centerinitialisationstrategies/GBestCenterInitialisationStrategy.java b/src/main/java/net/sourceforge/cilib/measurement/single/diversity/centerinitialisationstrategies/GBestCenterInitialisationStrategy.java index 6e7cbf0..a4cb746 100644 --- a/src/main/java/net/sourceforge/cilib/measurement/single/diversity/centerinitialisationstrategies/GBestCenterInitialisationStrategy.java +++ b/src/main/java/net/sourceforge/cilib/measurement/single/diversity/centerinitialisationstrategies/GBestCenterInitialisationStrategy.java @@ -21,7 +21,7 @@ */ package net.sourceforge.cilib.measurement.single.diversity.centerinitialisationstrategies; -import net.sourceforge.cilib.algorithm.Algorithm; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.population.PopulationBasedAlgorithm; import net.sourceforge.cilib.type.types.container.Vector; @@ -32,7 +32,7 @@ public class GBestCenterInitialisationStrategy extends CenterInitialisationStrat @Override public Vector getCenter() { - PopulationBasedAlgorithm algorithm = (PopulationBasedAlgorithm) Algorithm.get(); + PopulationBasedAlgorithm algorithm = (PopulationBasedAlgorithm) AbstractAlgorithm.get(); return (Vector) algorithm.getTopology().getBestEntity().getCandidateSolution(); } diff --git a/src/main/java/net/sourceforge/cilib/measurement/single/diversity/centerinitialisationstrategies/SpatialCenterInitialisationStrategy.java b/src/main/java/net/sourceforge/cilib/measurement/single/diversity/centerinitialisationstrategies/SpatialCenterInitialisationStrategy.java index 8e92169..10074e8 100644 --- a/src/main/java/net/sourceforge/cilib/measurement/single/diversity/centerinitialisationstrategies/SpatialCenterInitialisationStrategy.java +++ b/src/main/java/net/sourceforge/cilib/measurement/single/diversity/centerinitialisationstrategies/SpatialCenterInitialisationStrategy.java @@ -23,7 +23,7 @@ package net.sourceforge.cilib.measurement.single.diversity.centerinitialisations import java.util.Iterator; -import net.sourceforge.cilib.algorithm.Algorithm; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.population.PopulationBasedAlgorithm; import net.sourceforge.cilib.entity.Entity; import net.sourceforge.cilib.type.types.container.Vector; @@ -35,7 +35,7 @@ public class SpatialCenterInitialisationStrategy extends CenterInitialisationStr @Override public Vector getCenter() { - PopulationBasedAlgorithm algorithm = (PopulationBasedAlgorithm) Algorithm.get(); + PopulationBasedAlgorithm algorithm = (PopulationBasedAlgorithm) AbstractAlgorithm.get(); int numberOfEntities = algorithm.getTopology().size();//getPopulationSize(); Iterator<? extends Entity> averageIterator = algorithm.getTopology().iterator(); diff --git a/src/main/java/net/sourceforge/cilib/measurement/single/diversity/normalisation/TopologyBasedNormalisation.java b/src/main/java/net/sourceforge/cilib/measurement/single/diversity/normalisation/TopologyBasedNormalisation.java index 04981d0..5ebb10c 100644 --- a/src/main/java/net/sourceforge/cilib/measurement/single/diversity/normalisation/TopologyBasedNormalisation.java +++ b/src/main/java/net/sourceforge/cilib/measurement/single/diversity/normalisation/TopologyBasedNormalisation.java @@ -21,8 +21,9 @@ */ package net.sourceforge.cilib.measurement.single.diversity.normalisation; -import net.sourceforge.cilib.algorithm.Algorithm; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.population.PopulationBasedAlgorithm; +import net.sourceforge.cilib.entity.Topology; import net.sourceforge.cilib.entity.visitor.DiameterVisitor; import net.sourceforge.cilib.entity.visitor.TopologyVisitor; @@ -46,7 +47,7 @@ public class TopologyBasedNormalisation extends NormalisationParameter { */ @Override public double getValue() { - PopulationBasedAlgorithm algorithm = (PopulationBasedAlgorithm) Algorithm.get(); + PopulationBasedAlgorithm algorithm = (PopulationBasedAlgorithm) AbstractAlgorithm.get(); visitor.setDistanceMeasure(distanceMeasure); algorithm.accept(visitor); this.normalisationParameter = (Double) visitor.getResult(); diff --git a/src/main/java/net/sourceforge/cilib/moo/iterationstrategies/ArchivingIterationStrategy.java b/src/main/java/net/sourceforge/cilib/moo/iterationstrategies/ArchivingIterationStrategy.java index 124747d..768b16c 100644 --- a/src/main/java/net/sourceforge/cilib/moo/iterationstrategies/ArchivingIterationStrategy.java +++ b/src/main/java/net/sourceforge/cilib/moo/iterationstrategies/ArchivingIterationStrategy.java @@ -24,6 +24,7 @@ package net.sourceforge.cilib.moo.iterationstrategies; import java.util.ArrayList; import java.util.List; +import net.sourceforge.cilib.algorithm.AbstractAlgorithm; import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.algorithm.population.IterationStrategy; import net.sourceforge.cilib.algorithm.population.PopulationBasedAlgorithm; @@ -72,7 +73,7 @@ public class ArchivingIterationStrategy<E extends PopulationBasedAlgorithm> impl } protected void updateArchive(Topology<? extends Entity> population) { - Algorithm topLevelAlgorithm = Algorithm.getAlgorithmList().get(0); + Algorithm topLevelAlgorithm = AbstractAlgorithm.getAlgorithmList().get(0); List<OptimisationSolution> optimisationSolutions = new ArrayList<OptimisationSolution>(); for (Entity entity : population) { Type solution = entity.getCandidateSolution().getClone(); diff --git a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/EvaluationMediator.java b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/EvaluationMediator.java index 6173f89..0ed61b1 100644 --- a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/EvaluationMediator.java +++ b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/EvaluationMediator.java @@ -24,13 +24,11 @@ package net.sourceforge.cilib.neuralnetwork.foundation; import java.util.List; -import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.algorithm.SingularAlgorithm; import net.sourceforge.cilib.neuralnetwork.foundation.epochstrategy.EmptyEpochStrategy; import net.sourceforge.cilib.neuralnetwork.foundation.epochstrategy.EpochStrategy; import net.sourceforge.cilib.problem.OptimisationSolution; import net.sourceforge.cilib.type.types.container.TypeList; -import net.sourceforge.cilib.type.types.container.Vector; @@ -258,7 +256,7 @@ public class EvaluationMediator extends SingularAlgorithm { } @Override - public Al... [truncated message content] |
From: Gary P. <gpa...@gm...> - 2009-08-14 07:02:19
|
Version 0.7.1 of CIlib has been released. Changes include: * PSO: - Addition of Constriction velocity update enabling the Constriction PSO. * DE: - Added rand-to-best-selection. * Measurements: - Bound violation measurements have been included. * Types: - Immutable Matrix class added. * General: - Enabled "unique" selection in Selection<E>. - Corrections to various Function classes. - Function<F, T> interface is now generic. Defining the types that the Function converts "from" and "to". - Default ordering for Entity classes is now a "natural ordering" from smallest to largest. - Better usage of Random number generation instances. - Removed ambiguous getPopulationSize() methods. - Generalized the Initialization strategies. - Parser generated DomainParser. DomainParser is now based on a grammar. Head on over to http://www.cilib.net. |
From: Gary P. <gpa...@gm...> - 2009-08-13 06:46:23
|
Added another method for the Matrix.times() operation. Matrix.multiply() defers to Matrix.times() Signed-off-by: Gary Pampara <gpa...@gm...> --- .../cilib/type/types/container/Matrix.java | 22 ++++++++++++++++--- 1 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java b/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java index 913ff7f..807f7ff 100644 --- a/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java +++ b/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java @@ -142,6 +142,20 @@ public final class Matrix implements Type { * The result of this operation is a new immutable matrix. * @param b The {@code Matrix} to to multiply the current {@code Matrix} with. * @return A new {@code Matrix} representing the result of the multiplication. + * @see Matrix#times(net.sourceforge.cilib.type.types.container.Matrix) + */ + public Matrix multiply(Matrix b) { + return this.times(b); + } + + /** + * Perform multiplication on the current {@code Matrix} and the provided {@code Matrix}. + * Naturally, matrix multiplication can only be performed on matricies that adhere + * to the required matrix multiplication rules. + * <p> + * The result of this operation is a new immutable matrix. + * @param b The {@code Matrix} to to multiply the current {@code Matrix} with. + * @return A new {@code Matrix} representing the result of the multiplication. */ public Matrix times(Matrix b) { Preconditions.checkArgument(this.getRows() == b.getColumns(), "Illegal matrix dimensions for matrix multiplication."); @@ -169,9 +183,9 @@ public final class Matrix implements Type { } /** - * + * Perform a rotation on the provided matrix by the specified {@code angle}. * @param angle The rotation angle defined in radians. - * @return + * @return A rotated {@code Matrix}, which is a new instance. */ public Matrix rotate(double angle) { Matrix rotation = new Matrix(2, 2); @@ -184,8 +198,8 @@ public final class Matrix implements Type { } /** - * - * @return + * Obtain the determinant of the current matrix. + * @return The determinant value. */ public double determinant() { return contents[0][0]*contents[1][1] - contents[1][0]*contents[0][1]; -- 1.6.4 |
From: Gary P. <gpa...@gm...> - 2009-08-13 06:46:21
|
Added the option of obtaining a list of permutations for a list and to create a LU decomposition matrix in order to get the determinant of a n x n matrix class. Signed-off-by: Gary Pampara <gpa...@gm...> --- .../java/net/sourceforge/cilib/math/Maths.java | 104 +++++++++++++++ .../problem/dataset/MatrixDataSetBuilder.java | 2 +- .../problem/mappingproblem/MappingProblem.java | 2 +- .../cilib/type/types/container/Matrix.java | 134 +++++++++++++++++--- .../java/net/sourceforge/cilib/math/MathsTest.java | 67 ++++++---- .../cilib/type/types/container/MatrixTest.java | 65 +++++----- 6 files changed, 299 insertions(+), 75 deletions(-) diff --git a/src/main/java/net/sourceforge/cilib/math/Maths.java b/src/main/java/net/sourceforge/cilib/math/Maths.java index fce85e5..db2e489 100644 --- a/src/main/java/net/sourceforge/cilib/math/Maths.java +++ b/src/main/java/net/sourceforge/cilib/math/Maths.java @@ -21,6 +21,9 @@ */ package net.sourceforge.cilib.math; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; import net.sourceforge.cilib.math.random.generator.MersenneTwister; import net.sourceforge.cilib.math.random.generator.Random; @@ -91,6 +94,107 @@ public final class Maths { return factorial(n) / factorial(n-r); } + public static <T> Iterator<List<T>> permutation(final List<T> input, final int number) { + return new Iterator<List<T>>() { + private List<T> internalList = new ArrayList<T>(input); // Keep our own copy + private int n = input.size(); + private int m = number; + private int[] index = initialize(); + private boolean hasMore = true; + + @Override + public boolean hasNext() { + return this.hasMore; + } + + @Override + public List<T> next() { + if (!this.hasMore){ + return null; + } + List<T> list = new ArrayList<T>(this.m); + for (int i = 0; i < this.m; i++) { + int thisIndexI = this.index[i]; + T element = internalList.get(thisIndexI); + list.add(element); + } + moveIndex(); + return list; + } + + @Override + public void remove() { + throw new UnsupportedOperationException("Not supported yet."); + } + + private int[] initialize() { + if (!(this.n >= m && m >= 0)) + throw new IllegalStateException("Permutation error! n >= m"); + + int[] tmp = new int[this.n]; + for (int i = 0; i < this.n; i++) { + tmp[i] = i; + } + + reverseAfter(tmp, m - 1); + return tmp; + } + + /** + * Reverse the index elements to the right of the specified index. + */ + private void reverseAfter(int[] indicies, int i) { + int start = i + 1; + int end = this.n - 1; + while (start < end) { + int t = indicies[start]; + indicies[start] = indicies[end]; + indicies[end] = t; + start++; + end--; + } + } + + private void moveIndex(){ + // find the index of the first element that dips + int i = rightmostDip(); + if (i < 0) { + this.hasMore = false; + return; + } + + // find the least greater element to the right of the dip + int leastToRightIndex = i + 1; + for (int j = i + 2; j < this.n; j++){ + if (this.index[j] < this.index[leastToRightIndex] && this.index[j] > this.index[i]) { + leastToRightIndex = j; + } + } + + // switch dip element with least greater element to its right + int t = this.index[i]; + this.index[i] = this.index[leastToRightIndex]; + this.index[leastToRightIndex] = t; + + if (this.m - 1 > i) { + // reverse the elements to the right of the dip + reverseAfter(this.index, i); + // reverse the elements to the right of m - 1 + reverseAfter(this.index, this.m - 1); + } + } + + private int rightmostDip() { + for (int i = this.n - 2; i >= 0; i--){ + if (this.index[i] < this.index[i+1]){ + return i; + } + } + return -1; + } + }; + } + /** * Determine if a "flip" would occur given the provided probability value. * @param probability The provided probability value. This value must be in [0,1] diff --git a/src/main/java/net/sourceforge/cilib/problem/dataset/MatrixDataSetBuilder.java b/src/main/java/net/sourceforge/cilib/problem/dataset/MatrixDataSetBuilder.java index 43d97ea..2712b29 100644 --- a/src/main/java/net/sourceforge/cilib/problem/dataset/MatrixDataSetBuilder.java +++ b/src/main/java/net/sourceforge/cilib/problem/dataset/MatrixDataSetBuilder.java @@ -81,7 +81,7 @@ public class MatrixDataSetBuilder extends BinaryDataSetBuilder { if (m <= 0) throw new IllegalStateException("Need to have a positive number as the input dimensions"); - matrixBuilder = Matrix.builder().rows(numvectors).columns(m); + matrixBuilder = Matrix.builder().dimensions(numvectors, m); if (tok.nextToken() != StreamTokenizer.TT_NUMBER) throw new IllegalStateException("Expected an integer number as the third token in the dataset"); diff --git a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingProblem.java b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingProblem.java index 71a6f73..57d529f 100644 --- a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingProblem.java @@ -195,7 +195,7 @@ public abstract class MappingProblem extends OptimisationProblemAdapter { MatrixDataSetBuilder matrixDataSetBuilder = (MatrixDataSetBuilder) dataSetBuilder; inputs = matrixDataSetBuilder.getMatrix(); - Matrix.Builder matrixBuilder = Matrix.builder().rows(numvectors).columns(numvectors); + Matrix.Builder matrixBuilder = Matrix.builder().dimensions(numvectors, numvectors); for(int i = 0; i < numvectors; i++) { for(int j = 0; j < i; j++) { diff --git a/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java b/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java index 807f7ff..12ca4db 100644 --- a/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java +++ b/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java @@ -198,11 +198,22 @@ public final class Matrix implements Type { } /** - * Obtain the determinant of the current matrix. + * Obtain the determinant of the current matrix. The determinant is obtained + * by creating a LU decomposition matrix. The determinant is then calculated by: + * <p> + * <pre> + * \begin{equation} + * \mbox{det($A$)} = |L| \dot |U| + * \end{equation} + * </pre> + * where |L| = 1 and |U| is the product of the diagonal elements. * @return The determinant value. */ public double determinant() { - return contents[0][0]*contents[1][1] - contents[1][0]*contents[0][1]; + Preconditions.checkState(isSquare(), "Cannot obtain determinant of a non-square matrix"); + + LUDecomposition decomposition = new LUDecomposition(this); + return decomposition.determinant(); } /** @@ -260,22 +271,19 @@ public final class Matrix implements Type { } /** - * Define the number of rows that the built up {@code Matrix} will contain. - * @param rows The required number of rows. - * @return The current {@code Builder}. + * Define the dimensions (rows and coloums) that the bult up {@code Matrix} will + * contain. + * @param rows The number of rows. + * @param columns The number of columns. + * @return The current {@code Builder) + * @throws IllegalArgumentException if {@code rows} or {@code columns} are less than 1. */ - public Builder rows(int rows) { - this.rowNumber = rows; - return this; - } + public Builder dimensions(int rows, int columns) { + Preconditions.checkArgument(rows >= 1); + Preconditions.checkArgument(columns >= 1); - /** - * Define the number of coloumns that the built up {@code Matrix} will contain. - * @param colummns The required number of columns. - * @return The current {@code Builder}. - */ - public Builder columns(int colummns) { - this.colNumber = colummns; + this.rowNumber = rows; + this.colNumber = columns; return this; } @@ -410,4 +418,98 @@ public final class Matrix implements Type { return y; } } + + /** + * This class is an implementation of the Doolittle / Crout algorithms. + * <p> + * Please refer to <a href=http://en.wikipedia.org/wiki/LU_decomposition#Doolittle_algorithm> + * the Wikipedia entry</a> for more information. + * <p> + * Additional help and code was obtained from the JAMA project (which seems to + * be stagnant) and from the commons-math. + */ + private static final class LUDecomposition { + private double[][] lu; + + private int m; + private int n; + private int pivsign; + private int[] piv; + + private LUDecomposition(Matrix matrix) { + m = matrix.getRows(); + n = matrix.getColumns(); + pivsign = 1; + + lu = new double[m][n]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + lu[i][j] = matrix.contents[i][j]; + } + } + + piv = new int[m]; + for (int i = 0; i < m; i++) + piv[i] = i; + + double[] LUrowi; + double[] LUcolj = new double[m]; + + // Outer-loop + for (int j = 0; j < n; j++) { + // Make a copy of the j-th column. + for (int i = 0; i < m; i++) { + LUcolj[i] = lu[i][j]; + } + + // Apply previous transformations + for (int i = 0; i < m; i++) { + LUrowi = lu[i]; + + int kmax = Math.min(i, j); + double s = 0.0; + for (int k = 0; k < kmax; k++) { + s += LUrowi[k]*LUcolj[k]; + } + + LUcolj[i] -= s; + LUrowi[j] = LUcolj[i]; + } + + // Find the pivot and exchange if needed + int p = j; + for (int i = j+1; i < m; i++) { + if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) { + p = i; + } + } + + if (p != j) { + for (int k = 0; k < n; k++) { + double t = lu[p][k]; lu[p][k] = lu[j][k]; lu[j][k] = t; + } + int k = piv[p]; piv[p] = piv[j]; piv[j] = k; + pivsign = -pivsign; + } + + // Compute multipliers. + if (j < m & lu[j][j] != 0.0) { + for (int i = j+1; i < m; i++) { + lu[i][j] /= lu[j][j]; + } + } + } + } + + public double determinant() { + Preconditions.checkState(m == n, "Matrix must be square."); + + double d = Integer.valueOf(pivsign).doubleValue(); + for (int j = 0; j < n; j++) { + d *= lu[j][j]; + } + + return d; + } + } } diff --git a/src/test/java/net/sourceforge/cilib/math/MathsTest.java b/src/test/java/net/sourceforge/cilib/math/MathsTest.java index 96f98e1..a774623 100644 --- a/src/test/java/net/sourceforge/cilib/math/MathsTest.java +++ b/src/test/java/net/sourceforge/cilib/math/MathsTest.java @@ -21,10 +21,15 @@ */ package net.sourceforge.cilib.math; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import org.junit.Assert; import org.junit.Test; +import static org.hamcrest.CoreMatchers.is; + /** * @@ -39,38 +44,50 @@ public class MathsTest { @Test public void testFactorial() { - assertEquals(1.0, Maths.factorial(0.0), Double.MIN_NORMAL); - assertEquals(1.0, Maths.factorial(1.0), Double.MIN_NORMAL); - assertEquals(6.0, Maths.factorial(3), Double.MIN_NORMAL); - assertEquals(720.0, Maths.factorial(6), Double.MIN_NORMAL); - assertEquals(9.33262154439441E157, Maths.factorial(100), Double.MIN_NORMAL); + Assert.assertEquals(1.0, Maths.factorial(0.0), Double.MIN_NORMAL); + Assert.assertEquals(1.0, Maths.factorial(1.0), Double.MIN_NORMAL); + Assert.assertEquals(6.0, Maths.factorial(3), Double.MIN_NORMAL); + Assert.assertEquals(720.0, Maths.factorial(6), Double.MIN_NORMAL); + Assert.assertEquals(9.33262154439441E157, Maths.factorial(100), Double.MIN_NORMAL); } @Test public void testCombination() { - assertEquals(792.0, Maths.combination(12, 5), Double.MIN_NORMAL); + Assert.assertEquals(792.0, Maths.combination(12, 5), Double.MIN_NORMAL); + } - try { - Maths.combination(-1, -5); - fail("Invalid input!"); - } - catch (Exception e) {} + @Test(expected=IllegalArgumentException.class) + public void combinationInvalidN() { + Maths.combination(-1, 5); + } - try { - Maths.combination(-1, 5); - fail("Invalid input!"); - } - catch (Exception e) {} + @Test(expected=IllegalArgumentException.class) + public void combinationInvalidR() { + Maths.combination(1, -5); + } - try { - Maths.combination(1, -5); - fail("Invalid input!"); + @Test + public void combinationSpecialCase() { + Assert.assertEquals(1.0, Maths.combination(0, 0), Double.MIN_NORMAL); + Assert.assertEquals(1.0, Maths.combination(1, 0), Double.MIN_NORMAL); + Assert.assertEquals(1.0, Maths.combination(1, 1), Double.MIN_NORMAL); + } + + @Test + public void listPermutation() { + List<Integer> numbers = Arrays.asList(1, 2); + List<List<Integer>> permutationList = new ArrayList<List<Integer>>(); + + for (Iterator<List<Integer>> permutations = Maths.permutation(numbers, 2); permutations.hasNext(); ) { + permutationList.add(permutations.next()); } - catch (Exception e) {} - assertEquals(1.0, Maths.combination(0, 0), Double.MIN_NORMAL); - assertEquals(1.0, Maths.combination(1, 0), Double.MIN_NORMAL); - assertEquals(1.0, Maths.combination(1, 1), Double.MIN_NORMAL); + Assert.assertThat(permutationList.size(), is(2)); + + List<Integer> expected1 = Arrays.asList(1, 2); + List<Integer> expected2 = Arrays.asList(2, 1); + Assert.assertTrue(permutationList.contains(expected1)); + Assert.assertTrue(permutationList.contains(expected2)); } } diff --git a/src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java b/src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java index 0c2c98e..498951d 100644 --- a/src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java +++ b/src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java @@ -35,29 +35,29 @@ public class MatrixTest { @Test(expected=IllegalArgumentException.class) public void constructionZeroRow() { - Matrix.builder().rows(0).build(); + Matrix.builder().dimensions(0, 1).build(); } @Test(expected=IllegalArgumentException.class) public void constructionZeroColumn() { - Matrix.builder().columns(0).build(); + Matrix.builder().dimensions(1, 0).build(); } @Test public void square() { - Matrix a = Matrix.builder().rows(2).columns(2).build(); + Matrix a = Matrix.builder().dimensions(2, 2).build(); Assert.assertTrue(a.isSquare()); } @Test public void notSquare() { - Matrix a = Matrix.builder().rows(3).columns(4).build(); + Matrix a = Matrix.builder().dimensions(3, 4).build(); Assert.assertFalse(a.isSquare()); } @Test public void valueAt() { - Matrix a = Matrix.builder().rows(1).columns(2) + Matrix a = Matrix.builder().dimensions(1, 2) .addRow(1.0, 2.0) .build(); @@ -67,13 +67,13 @@ public class MatrixTest { @Test(expected=IndexOutOfBoundsException.class) public void invalidValueOf() { - Matrix a = Matrix.builder().rows(1).columns(1).build(); + Matrix a = Matrix.builder().dimensions(1, 1).build(); a.valueAt(1, 2); } @Test public void getRow() { - Matrix a = Matrix.builder().rows(2).columns(2) + Matrix a = Matrix.builder().dimensions(2, 2) .addRow(1.0, 1.0) .addRow(2.0, 2.0) .build(); @@ -86,23 +86,23 @@ public class MatrixTest { @Test public void rowNumber() { - Matrix a = Matrix.builder().rows(4).columns(5).build(); + Matrix a = Matrix.builder().dimensions(4, 5).build(); Assert.assertThat(a.getRows(), is(4)); } @Test public void columnNumber() { - Matrix a = Matrix.builder().rows(5).columns(8).build(); + Matrix a = Matrix.builder().dimensions(5, 8).build(); Assert.assertThat(a.getColumns(), is(8)); } @Test public void addition() { - Matrix a = Matrix.builder().rows(2).columns(2) + Matrix a = Matrix.builder().dimensions(2, 2) .addRow(1.0, 2.0) .addRow(3.0, 4.0) .build(); - Matrix b = Matrix.builder().rows(2).columns(2) + Matrix b = Matrix.builder().dimensions(2, 2) .addRow(1.0, 2.0) .addRow(3.0, 4.0) .build(); @@ -115,18 +115,18 @@ public class MatrixTest { @Test(expected=IllegalArgumentException.class) public void invalidAddition() { - Matrix a = Matrix.builder().rows(3).columns(2).build(); - Matrix b = Matrix.builder().rows(1).columns(2).build(); + Matrix a = Matrix.builder().dimensions(3, 2).build(); + Matrix b = Matrix.builder().dimensions(1, 2).build(); a.plus(b); } @Test public void subtraction() { - Matrix a = Matrix.builder().rows(2).columns(2) + Matrix a = Matrix.builder().dimensions(2, 2) .addRow(2.0, 4.0) .addRow(6.0, 8.0) .build(); - Matrix b = Matrix.builder().rows(2).columns(2) + Matrix b = Matrix.builder().dimensions(2, 2) .addRow(1.0, 2.0) .addRow(3.0, 4.0) .build(); @@ -139,18 +139,18 @@ public class MatrixTest { @Test(expected=IllegalArgumentException.class) public void invalidSubtraction() { - Matrix a = Matrix.builder().rows(2).columns(2).build(); - Matrix b = Matrix.builder().rows(2).columns(3).build(); + Matrix a = Matrix.builder().dimensions(2, 2).build(); + Matrix b = Matrix.builder().dimensions(2, 3).build(); a.minus(b); } @Test public void multiplication() { - Matrix a = Matrix.builder().rows(2).columns(2) + Matrix a = Matrix.builder().dimensions(2, 2) .addRow(2.0, 4.0) .addRow(6.0, 8.0) .build(); - Matrix b = Matrix.builder().rows(2).columns(2) + Matrix b = Matrix.builder().dimensions(2, 2) .addRow(1.0, 2.0) .addRow(3.0, 4.0) .build(); @@ -163,7 +163,7 @@ public class MatrixTest { @Test public void squareTranspose() { - Matrix a = Matrix.builder().rows(2).columns(2) + Matrix a = Matrix.builder().dimensions(2, 2) .addRow(2.0, 4.0) .addRow(6.0, 8.0) .build(); @@ -176,7 +176,7 @@ public class MatrixTest { @Test public void transposeRowVector() { - Matrix a = Matrix.builder().rows(1).columns(2) + Matrix a = Matrix.builder().dimensions(1, 2) .addRow(2.0, 4.0) .build(); @@ -188,7 +188,7 @@ public class MatrixTest { @Test public void transposeColumnVector() { - Matrix a = Matrix.builder().rows(2).columns(1) + Matrix a = Matrix.builder().dimensions(2, 1) .addRow(2.0) .addRow(4.0) .build(); @@ -201,7 +201,7 @@ public class MatrixTest { @Test public void identity() { - Matrix identity = Matrix.builder().rows(4).columns(4).identity().build(); + Matrix identity = Matrix.builder().dimensions(4, 4).identity().build(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { @@ -215,7 +215,7 @@ public class MatrixTest { public void rotation() { double angle = Math.PI / 4.0; - Matrix matrix = Matrix.builder().rows(2).columns(2).addRow(1.0, 1.0).addRow(1.0, 1.0).build(); + Matrix matrix = Matrix.builder().dimensions(2, 2).addRow(1.0, 1.0).addRow(1.0, 1.0).build(); Matrix result = matrix.rotate(angle); Assert.assertThat(result.valueAt(0, 0), is(1.414213562373095)); @@ -226,18 +226,19 @@ public class MatrixTest { @Test public void determinant() { - Matrix matrix = Matrix.builder().rows(2).columns(2).addRow(1.0, 1.0).addRow(1.0, 1.0).build(); - Assert.assertThat(matrix.determinant(), is(0.0)); + Matrix matrix = Matrix.builder().dimensions(3, 3).addRow(2.0, 1.0, 0.0).addRow(1.0, 2.0, -1.0).addRow(3.0, 2.0, 1.0).build(); + double value = matrix.determinant(); + Assert.assertEquals(4.0, value, 0.00001); } @Test(expected=IllegalStateException.class) public void invalidIdentity() { - Matrix.builder().rows(2).columns(5).identity().build(); + Matrix.builder().dimensions(2, 5).identity().build(); } @Test public void uniquePositionSetting() { - Matrix a = Matrix.builder().rows(2).columns(2) + Matrix a = Matrix.builder().dimensions(2, 2) .valueAt(0, 0, 3.0) .build(); @@ -250,8 +251,8 @@ public class MatrixTest { @Test public void equal() { Matrix.Builder builder = Matrix.builder(); - Matrix a = builder.rows(1).columns(1).valueAt(0, 0, 2.0).build(); - Matrix b = builder.rows(1).columns(1).valueAt(0, 0, 2.0).build(); + Matrix a = builder.dimensions(1, 1).valueAt(0, 0, 2.0).build(); + Matrix b = builder.dimensions(1, 1).valueAt(0, 0, 2.0).build(); Assert.assertTrue(a.equals(b)); } @@ -259,8 +260,8 @@ public class MatrixTest { @Test public void hash() { Matrix.Builder builder = Matrix.builder(); - Matrix a = builder.rows(1).columns(1).valueAt(0, 0, 2.0).build(); - Matrix b = builder.rows(1).columns(1).valueAt(0, 0, 2.0).build(); + Matrix a = builder.dimensions(1, 1).valueAt(0, 0, 2.0).build(); + Matrix b = builder.dimensions(1, 1).valueAt(0, 0, 2.0).build(); Assert.assertTrue(a.hashCode() == b.hashCode()); } -- 1.6.4 |
From: Gary P. <gpa...@gm...> - 2009-08-13 06:46:17
|
The current implementation of the rotation and the determinant. These implementations are restricted to 2-dimensions at the moment. Plans to extend this to n-dimensions is planned. Signed-off-by: Gary Pampara <gpa...@gm...> --- pom.xml | 5 ---- .../cilib/type/types/container/Matrix.java | 23 ++++++++++++++++++++ .../cilib/type/types/container/MatrixTest.java | 19 ++++++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index bf3b9f4..fcc9dff 100644 --- a/pom.xml +++ b/pom.xml @@ -163,11 +163,6 @@ </configuration> </plugin> <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <version>2.4.2</version> - </plugin> - <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>javacc-maven-plugin</artifactId> <version>2.5</version> diff --git a/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java b/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java index f42abb6..913ff7f 100644 --- a/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java +++ b/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java @@ -169,6 +169,29 @@ public final class Matrix implements Type { } /** + * + * @param angle The rotation angle defined in radians. + * @return + */ + public Matrix rotate(double angle) { + Matrix rotation = new Matrix(2, 2); + rotation.contents[0][0] = Math.cos(angle); + rotation.contents[0][1] = -Math.sin(angle); + rotation.contents[1][0] = Math.sin(angle); + rotation.contents[1][1] = Math.cos(angle); + + return this.times(rotation); + } + + /** + * + * @return + */ + public double determinant() { + return contents[0][0]*contents[1][1] - contents[1][0]*contents[0][1]; + } + + /** * {@inheritDoc} */ @Override diff --git a/src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java b/src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java index 6144707..0c2c98e 100644 --- a/src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java +++ b/src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java @@ -211,6 +211,25 @@ public class MatrixTest { } } + @Test + public void rotation() { + double angle = Math.PI / 4.0; + + Matrix matrix = Matrix.builder().rows(2).columns(2).addRow(1.0, 1.0).addRow(1.0, 1.0).build(); + Matrix result = matrix.rotate(angle); + + Assert.assertThat(result.valueAt(0, 0), is(1.414213562373095)); + Assert.assertThat(result.valueAt(0, 1), is(1.1102230246251565E-16)); + Assert.assertThat(result.valueAt(1, 0), is(1.414213562373095)); + Assert.assertThat(result.valueAt(1, 1), is(1.1102230246251565E-16)); + } + + @Test + public void determinant() { + Matrix matrix = Matrix.builder().rows(2).columns(2).addRow(1.0, 1.0).addRow(1.0, 1.0).build(); + Assert.assertThat(matrix.determinant(), is(0.0)); + } + @Test(expected=IllegalStateException.class) public void invalidIdentity() { Matrix.builder().rows(2).columns(5).identity().build(); -- 1.6.4 |
From: Gary P. <gpa...@gm...> - 2009-08-13 06:46:13
|
The operations on a Matrix, result in a new Matrix instance. This class builds on this idea and provides an immutable matrix implementation that is an instance of Type, but is implemented using a double[][] for speed. Signed-off-by: Gary Pampara <gpa...@gm...> --- pom.xml | 6 + .../net/sourceforge/cilib/container/Matrix.java | 204 ----------- .../problem/dataset/MatrixDataSetBuilder.java | 18 +- .../mappingproblem/CurvilinearCompEvaluator.java | 6 +- .../mappingproblem/CurvilinearDistEvaluator.java | 6 +- .../problem/mappingproblem/KruskalEvaluator.java | 8 +- .../mappingproblem/LinearMappingProblem.java | 10 +- .../problem/mappingproblem/MappingEvaluator.java | 4 +- .../problem/mappingproblem/MappingProblem.java | 130 +------ .../cilib/type/types/container/Matrix.java | 376 ++++++++++++++++++++ .../java/net/sourceforge/cilib/util/Vectors.java | 13 +- .../sourceforge/cilib/container/MatrixTest.java | 197 ---------- .../cilib/type/types/container/MatrixTest.java | 249 +++++++++++++ 13 files changed, 692 insertions(+), 535 deletions(-) delete mode 100644 src/main/java/net/sourceforge/cilib/container/Matrix.java create mode 100644 src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java delete mode 100644 src/test/java/net/sourceforge/cilib/container/MatrixTest.java create mode 100644 src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java diff --git a/pom.xml b/pom.xml index 07fa70d..bf3b9f4 100644 --- a/pom.xml +++ b/pom.xml @@ -126,6 +126,11 @@ <artifactId>commons-math</artifactId> <version>1.1</version> </dependency> + <dependency> + <groupId>com.google.collections</groupId> + <artifactId>google-collections</artifactId> + <version>1.0-rc2</version> + </dependency> </dependencies> <build> <defaultGoal>package</defaultGoal> @@ -308,3 +313,4 @@ </plugins> </reporting> </project> + diff --git a/src/main/java/net/sourceforge/cilib/container/Matrix.java b/src/main/java/net/sourceforge/cilib/container/Matrix.java deleted file mode 100644 index 1119584..0000000 --- a/src/main/java/net/sourceforge/cilib/container/Matrix.java +++ /dev/null @@ -1,204 +0,0 @@ -/** - * Copyright (C) 2003 - 2009 - * 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.container; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Vector; - -import net.sourceforge.cilib.util.Cloneable; - -/** - * Representation of a <code>Matrix</code>, with the rows and the columns represented - * as a 2D array. The 2D array has been implemented as a Object array as the needed - * data stored within the Matrix is variable. - * - * @author Gary Pampara - * @param <E> The parameterized type. - */ -@Deprecated -public class Matrix<E> implements Cloneable { - private static final long serialVersionUID = 4621194915276987567L; - - private ArrayList< ArrayList<E> > data; // This is the ArrayList of the 1st dimension - private int rows; - private int cols; - - /** - * Create a new <code>Matrix</code> object with dimensions: rows x columns. - * @param rows The number of rows the <code>Matrix</code> should contain. - * @param cols The number of columns the <code>Matrix</code> should contain. - */ - public Matrix(int rows, int cols) { - if (rows == 0 || cols == 0) { - throw new IllegalArgumentException("Cannot create a Matrix with row or column dimension < 1"); - } - - this.rows = rows; - this.cols = cols; - - data = new ArrayList< ArrayList<E> >(); - - for (int i = 0; i < rows; i++) { - ArrayList<E> tmp = new ArrayList<E>(); - - for (int j = 0; j < cols; j++) { - tmp.add(null); - } - - data.add(tmp); - } - } - - - /** - * Copy constructor. - * @param copy The instance to copy. - */ - public Matrix(Matrix<E> copy) { - rows = copy.rows; - cols = copy.cols; - - data = new ArrayList<ArrayList<E>>(); - - for (ArrayList<E> item : data) { - ArrayList<E> cloneList = new ArrayList<E>(); - - for (E j : item) - cloneList.add(j); - } - } - - - /** - * {@inheritDoc} - */ - public Matrix<E> getClone() { - return new Matrix<E>(this); - } - - /** - * Place an <code>Object</code> at a point (row, column) within the <code>Matrix</code>. - * @param row The row where the needed item is located - * @param col The column where the needed item is located - * @param object The <code>Object</code> to place the <code>Matrix</code> at prosition (row, column) - */ - public void set(int row, int col, E object) { - if ((row >= rows || col >= cols) && (row >= 0 || col >= 0)) - throw new IndexOutOfBoundsException("Cannot set item at out of bounds index"); - - ArrayList<E> tmp = data.get(row); - tmp.set(col, object); - } - - /** - * Return the current item within the grid, located at (row, column). - * @param row The row where the needed item is located - * @param col The column where the needed item is located - * @return The <code>Object</code> within the <code>Matrix</code> at position (row, column) - */ - public E get(int row, int col) { - if ((row >= rows || col >= cols) && (row >= 0 || col >= 0)) - throw new IndexOutOfBoundsException("Cannot acces element - index out of bounds"); - - return data.get(row).get(col); - } - - /** - * Get the number of columns in the <code>Matrix</code>. - * @return The number of columns in the <code>Matrix</code>. - */ - public int getColumnCount() { - return cols; - } - - /** - * Get the number of rows in the <code>Matrix</code>. - * @return The number of rows in the <code>Matrix</code>. - */ - public int getRowCount() { - return rows; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean equals(Object obj) { - return false; - } - - /** - * {@inheritDoc} - */ - @Override - public int hashCode() { - return super.hashCode(); - } - - /** - * Clear the current <code>Matrix</code> of it's internal state. - */ - public void clear() { - data = null; - data = new ArrayList< ArrayList<E> >(); - - for (int i = 0; i < rows; i++) { - ArrayList<E> tmp = new ArrayList<E>(); - - for (int j = 0; j < cols; j++) - tmp.add(null); - - data.add(tmp); - } - } - - /** - * Get a <code>Vector</code> representing the row within the <code>Matrix</code> at the given index. - * @param row The row index of the row to be returned, indexed from 0. - * @return A <code>Vector</code> representing the row within the <code>Matrix</code>. - */ - public Collection<E> getRow(int row) { - ArrayList<E> tmp = new ArrayList<E>(); - - for (int i = 0; i < cols; i++) { - tmp.add(this.get(row, i)); - } - - return tmp; - } - - /** - * Get a <code>Vector</code> representing the column within the <code>Matrix</code> at the given index. - * @param col The column index of the row to be returned, indexed from 0. - * @return A <code>Vector</code> representing the column within the <code>Matrix</code>. - */ - public Collection<E> getColumn(int col) { - Collection<E> tmp = new Vector<E>(); - - for (int i = 0; i < rows; i++) - tmp.add(this.get(i, col)); - - return tmp; - } - -} diff --git a/src/main/java/net/sourceforge/cilib/problem/dataset/MatrixDataSetBuilder.java b/src/main/java/net/sourceforge/cilib/problem/dataset/MatrixDataSetBuilder.java index 8b9b7f1..43d97ea 100644 --- a/src/main/java/net/sourceforge/cilib/problem/dataset/MatrixDataSetBuilder.java +++ b/src/main/java/net/sourceforge/cilib/problem/dataset/MatrixDataSetBuilder.java @@ -25,8 +25,9 @@ import java.io.EOFException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StreamTokenizer; - -import net.sourceforge.cilib.container.Matrix; +import java.util.ArrayList; +import java.util.List; +import net.sourceforge.cilib.type.types.container.Matrix; /** * TODO: This needs to implement the reading of a matrix as needed by MappingProblem. @@ -35,7 +36,7 @@ import net.sourceforge.cilib.container.Matrix; public class MatrixDataSetBuilder extends BinaryDataSetBuilder { private static final long serialVersionUID = 1141280214032774956L; - private Matrix<Double> matrix; + private Matrix matrix; private int numvectors = 0; private int m = -1; private int d = -1; @@ -57,6 +58,7 @@ public class MatrixDataSetBuilder extends BinaryDataSetBuilder { @Override public void initialise() { + Matrix.Builder matrixBuilder = null; try { InputStream is = this.getDataSet(0).getInputStream(); @@ -79,7 +81,7 @@ public class MatrixDataSetBuilder extends BinaryDataSetBuilder { if (m <= 0) throw new IllegalStateException("Need to have a positive number as the input dimensions"); - matrix = new Matrix<Double>(numvectors, m); + matrixBuilder = Matrix.builder().rows(numvectors).columns(m); if (tok.nextToken() != StreamTokenizer.TT_NUMBER) throw new IllegalStateException("Expected an integer number as the third token in the dataset"); @@ -93,6 +95,7 @@ public class MatrixDataSetBuilder extends BinaryDataSetBuilder { throw new IllegalStateException("Output dimension must be less than input dimension"); for (int i = 0; i < numvectors; i++) { + List<Double> rowVector = new ArrayList<Double>(); for (int j = 0; j < m; j++) { int tok_ret = tok.nextToken(); while (tok_ret != StreamTokenizer.TT_NUMBER) { @@ -106,20 +109,23 @@ public class MatrixDataSetBuilder extends BinaryDataSetBuilder { } } - matrix.set(i, j, tok.nval); + rowVector.add(tok.nval); } + matrixBuilder.addRow(rowVector); } } catch (Exception e) { throw new RuntimeException(e); } + + matrix = matrixBuilder.build(); } /** * Get the constructed {@see net.sourceforge.cilib.container.Matrix Matrix}. * @return The current {@code Matrix} instance. */ - public Matrix<Double> getMatrix() { + public Matrix getMatrix() { return this.matrix; } diff --git a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearCompEvaluator.java b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearCompEvaluator.java index dd414ef..c16d435 100644 --- a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearCompEvaluator.java +++ b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearCompEvaluator.java @@ -21,9 +21,9 @@ */ package net.sourceforge.cilib.problem.mappingproblem; -import net.sourceforge.cilib.container.Matrix; import net.sourceforge.cilib.problem.Fitness; import net.sourceforge.cilib.problem.MinimisationFitness; +import net.sourceforge.cilib.type.types.container.Matrix; /** @@ -42,14 +42,14 @@ public class CurvilinearCompEvaluator implements MappingEvaluator { * * @author jkroon */ - public Fitness evaluateMapping(Matrix<Double> dist) { + public Fitness evaluateMapping(Matrix dist) { int numvect = prob.getNumInputVectors(); double res = 0.0; for(int i = 0; i < numvect; i++) for(int j = i + 1; j < numvect; j++) { double inp = prob.getDistanceInputVect(i, j); - double tmp = inp - dist.get(i, j); + double tmp = inp - dist.valueAt(i, j); res += tmp * tmp * f(inp); } diff --git a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearDistEvaluator.java b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearDistEvaluator.java index 0a3bed9..e213059 100644 --- a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearDistEvaluator.java +++ b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearDistEvaluator.java @@ -21,9 +21,9 @@ */ package net.sourceforge.cilib.problem.mappingproblem; -import net.sourceforge.cilib.container.Matrix; import net.sourceforge.cilib.problem.Fitness; import net.sourceforge.cilib.problem.MinimisationFitness; +import net.sourceforge.cilib.type.types.container.Matrix; /** * Implements the Curvilinear Distance function for evaluating the @@ -41,14 +41,14 @@ public class CurvilinearDistEvaluator implements MappingEvaluator { * * @author jkroon */ - public Fitness evaluateMapping(Matrix<Double> d) { + public Fitness evaluateMapping(Matrix d) { int numvect = prob.getNumInputVectors(); double res = 0.0; for(int i = 0; i < numvect; i++) for(int j = i + 1; j < numvect; j++) { double inp = dist.getDistance(i, j); - double tmp = inp - d.get(i, j); + double tmp = inp - d.valueAt(i, j); res += tmp * tmp * f(inp); } diff --git a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/KruskalEvaluator.java b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/KruskalEvaluator.java index df5daec..676d053 100644 --- a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/KruskalEvaluator.java +++ b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/KruskalEvaluator.java @@ -21,9 +21,9 @@ */ package net.sourceforge.cilib.problem.mappingproblem; -import net.sourceforge.cilib.container.Matrix; import net.sourceforge.cilib.problem.Fitness; import net.sourceforge.cilib.problem.MinimisationFitness; +import net.sourceforge.cilib.type.types.container.Matrix; /** * Implements the Kruskal stress function for evaluating the fitness of the MappingProblem. @@ -40,7 +40,7 @@ public class KruskalEvaluator implements MappingEvaluator { * * @author jkroon */ - public Fitness evaluateMapping(Matrix<Double> dist) { + public Fitness evaluateMapping(Matrix dist) { double above = 0.0; double below = 0.0; @@ -49,11 +49,11 @@ public class KruskalEvaluator implements MappingEvaluator { for(int i = 0; i < numvect; i++) { for(int j = i + 1; j < numvect; j++) { double inp_dist = prob.getDistanceInputVect(i, j); - double tmp = inp_dist - dist.get(i, j); + double tmp = inp_dist - dist.valueAt(i, j); above += tmp * tmp; // below += inp_dist * inp_dist; - below += dist.get(i, j) * dist.get(i, j); + below += dist.valueAt(i, j) * dist.valueAt(i, j); } } diff --git a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/LinearMappingProblem.java b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/LinearMappingProblem.java index 34b33bf..7ed790e 100644 --- a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/LinearMappingProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/LinearMappingProblem.java @@ -21,8 +21,8 @@ */ package net.sourceforge.cilib.problem.mappingproblem; -import net.sourceforge.cilib.container.Matrix; import net.sourceforge.cilib.type.DomainRegistry; +import net.sourceforge.cilib.type.types.container.Matrix; import net.sourceforge.cilib.type.types.container.Vector; /** @@ -75,7 +75,7 @@ public class LinearMappingProblem extends MappingProblem { * * @author jkroon */ - protected final void performMapping(Matrix<Double> input, Vector matrix, Matrix<Double> output) { + protected final void performMapping(Matrix input, Vector matrix, Matrix output) { int outputDimension = getOutputDim(); // D int inputDimension = getInputDim(); // M int numberOfVectors = getNumInputVectors(); // N @@ -83,11 +83,11 @@ public class LinearMappingProblem extends MappingProblem { for(int v = 0; v < numberOfVectors; v++) { int base = 0; for(int d = 0; d < outputDimension; d++) { - output.set(v, d, 0.0); +// output.set(v, d, 0.0); for(int m = 0; m < inputDimension; m++) { - double value = matrix.getReal(base+m) * input.get(v, m); + double value = matrix.getReal(base+m) * input.valueAt(v, m); //output[v][d] += matrix[base + m] * input[v][m]; - output.set(v, d, value); +// output.set(v, d, value); } base += inputDimension; } diff --git a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingEvaluator.java b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingEvaluator.java index c777793..3d4dae4 100644 --- a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingEvaluator.java +++ b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingEvaluator.java @@ -21,8 +21,8 @@ */ package net.sourceforge.cilib.problem.mappingproblem; -import net.sourceforge.cilib.container.Matrix; import net.sourceforge.cilib.problem.Fitness; +import net.sourceforge.cilib.type.types.container.Matrix; /** * Class that actually evaluates a given Mapping. This is to allow using @@ -40,7 +40,7 @@ public interface MappingEvaluator { * * @author jkroon */ - public Fitness evaluateMapping(Matrix<Double> dist); + public Fitness evaluateMapping(Matrix dist); /** * Gets called when attached to a MappingProblem. This is to allow diff --git a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingProblem.java b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingProblem.java index b868357..71a6f73 100644 --- a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingProblem.java @@ -21,12 +21,12 @@ */ package net.sourceforge.cilib.problem.mappingproblem; -import net.sourceforge.cilib.container.Matrix; import net.sourceforge.cilib.problem.Fitness; import net.sourceforge.cilib.problem.OptimisationProblemAdapter; import net.sourceforge.cilib.problem.dataset.DataSetBuilder; import net.sourceforge.cilib.problem.dataset.MatrixDataSetBuilder; import net.sourceforge.cilib.type.types.Type; +import net.sourceforge.cilib.type.types.container.Matrix; import net.sourceforge.cilib.type.types.container.Vector; import net.sourceforge.cilib.util.DistanceMeasure; import net.sourceforge.cilib.util.EuclideanDistanceMeasure; @@ -47,8 +47,8 @@ public abstract class MappingProblem extends OptimisationProblemAdapter { private int outputDimension = -1; private int inputDimension = -1; private int numvectors = -1; - private Matrix<Double> inputs = null; - private Matrix<Double> inpDistMatrix = null; + private Matrix inputs = null; + private Matrix inpDistMatrix = null; private MappingEvaluator evaluator = null; private DistanceMeasure distanceMeasure = null; @@ -76,19 +76,23 @@ public abstract class MappingProblem extends OptimisationProblemAdapter { protected final Fitness calculateFitness(Type solution) { Vector matrix = (Vector) solution; - Matrix<Double> distmatrix = new Matrix<Double>(numvectors, numvectors); - Matrix<Double> outputs = new Matrix<Double>(numvectors, outputDimension); + Matrix distmatrix = null; +// new Matrix<Double>(numvectors, numvectors); + Matrix outputs = null; +// new Matrix<Double>(numvectors, outputDimension); performMapping(inputs, matrix, outputs); matrix = null; + Matrix.Builder builder = Matrix.builder(); + for(int a = 0; a < numvectors; a++) { - distmatrix.set(a, a, 0.0); +// distmatrix.set(a, a, 0.0); for(int b = 0; b < a; b++) { double distance = this.distanceMeasure.distance(outputs.getRow(a), outputs.getRow(b)); - distmatrix.set(a, b, distance); - distmatrix.set(b, a, distance); +// distmatrix.set(a, b, distance); +// distmatrix.set(b, a, distance); } } @@ -112,7 +116,7 @@ public abstract class MappingProblem extends OptimisationProblemAdapter { * * @author jkroon */ - protected abstract void performMapping(Matrix<Double> inputs, Vector distmatrix, Matrix<Double> outputs); + protected abstract void performMapping(Matrix inputs, Vector distmatrix, Matrix outputs); /** @@ -127,32 +131,6 @@ public abstract class MappingProblem extends OptimisationProblemAdapter { /** - * Returns the DomainComponent representing this mapping. The actual - * ^ depends on the mapping scheme, so your mapping scheme will need - * to override getMatrixSize(). - * - * (-1000,1000) might not be sufficient. Atm there is no way to - * alter this other than changing it here. - * - * @return An instance of DomainComponent as explained above. - * - * @author jkroon - */ - /*public final DomainComponent getDomain() { - if(domain == null) - domain = ComponentFactory.instance().newComponent("R(-1000,1000)^" + getMatrixSize()); - - return domain; - }*/ - /*public final Domain getDomain() { - if (domain == null) { - domain = Domain.getInstance(); - } - return domain; - }*/ - - - /** * Gets the value of M, the input dimension. * * @return The current value of M. @@ -214,90 +192,22 @@ public abstract class MappingProblem extends OptimisationProblemAdapter { public void setDataSetBuilder(DataSetBuilder dataSetBuilder) { super.setDataSetBuilder(dataSetBuilder); - MatrixDataSetBuilder matrixBuilder = (MatrixDataSetBuilder) dataSetBuilder; - inputs = matrixBuilder.getMatrix(); + MatrixDataSetBuilder matrixDataSetBuilder = (MatrixDataSetBuilder) dataSetBuilder; + inputs = matrixDataSetBuilder.getMatrix(); - inpDistMatrix = new Matrix<Double>(numvectors, numvectors); + Matrix.Builder matrixBuilder = Matrix.builder().rows(numvectors).columns(numvectors); for(int i = 0; i < numvectors; i++) { - inpDistMatrix.set(i, i, 0.0); for(int j = 0; j < i; j++) { double distance = this.distanceMeasure.distance(inputs.getRow(i), inputs.getRow(j)); - this.inpDistMatrix.set(i, j, distance); - this.inpDistMatrix.set(j, i, distance); + matrixBuilder.valueAt(i, j, distance); + matrixBuilder.valueAt(j, i, distance); } } + inpDistMatrix = matrixBuilder.build(); } - /*this.dataSetBuilder = dataSetBuilder; - - try { - InputStream is = this.dataSetBuilder.getDataSet(0).getInputStream(); - - StreamTokenizer tok = new StreamTokenizer(new InputStreamReader(is)); - - if(tok.nextToken() != StreamTokenizer.TT_NUMBER) - throw new IllegalStateException("Expected an integer number as the first token in the dataset"); - - numvectors = (int)tok.nval; - - if(numvectors <= 0) - throw new IllegalStateException("Must have a positive number of vectors in input file"); - - if(tok.nextToken() != StreamTokenizer.TT_NUMBER) - throw new IllegalStateException("Expected an integer number as the second token in the dataset"); - - M = (int)tok.nval; - - if(M <= 0) - throw new IllegalStateException("Need to have a positive number as the input dimensions"); - - inputs = new double[numvectors][M]; - - if(tok.nextToken() != StreamTokenizer.TT_NUMBER) - throw new IllegalStateException("Expected an integer number as the third token in the dataset"); - - D = (int)tok.nval; - - if(D <= 0) - throw new IllegalStateException("Need to have a positive number as the input dimensions"); - - if(!(D <= M)) - throw new IllegalStateException("Output dimension must be less than input dimension"); - - for(int i = 0; i < numvectors; i++) { - for(int m = 0; m < M; m++) { - int tok_ret = tok.nextToken(); - while(tok_ret != StreamTokenizer.TT_NUMBER) - { - switch(tok_ret) { - case StreamTokenizer.TT_EOF: - throw new EOFException(); - case StreamTokenizer.TT_WORD: - throw new IllegalStateException("Only numerical input expected (line " + tok.lineno() + ")"); - } - } - - inputs[i][m] = tok.nval; - - } - } - } - catch(Exception e) - { - throw new RuntimeException(e); - } - - inp_distmatrix = new double[numvectors][numvectors]; - for(int i = 0; i < numvectors; i++) { - inp_distmatrix[i][i] = 0.0; - for(int j = 0; j < i; j++) - inp_distmatrix[i][j] = inp_distmatrix[j][i] = - calcDistance(inputs[i], inputs[j]); - } - }*/ - /** * Retrieve the distance between the two given input vectors. * @@ -309,7 +219,7 @@ public abstract class MappingProblem extends OptimisationProblemAdapter { * @author jkroon */ public final double getDistanceInputVect(int i1, int i2) { - return inpDistMatrix.get(i2, i1); + return inpDistMatrix.valueAt(i2, i1); } diff --git a/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java b/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java new file mode 100644 index 0000000..f42abb6 --- /dev/null +++ b/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java @@ -0,0 +1,376 @@ +/** + * Copyright (C) 2003 - 2009 + * 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.type.types.container; + +import com.google.common.base.Preconditions; +import com.google.common.collect.Iterables; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import net.sourceforge.cilib.type.types.Type; +import net.sourceforge.cilib.util.Vectors; + +/** + * Representation of a Matrix. This class is immutable with the intention that + * all opertions on a Matrix will result in a new resulting Matrix. + */ +public final class Matrix implements Type { + private static final long serialVersionUID = 7726056815026772629L; + + private final double[][] contents; + + private Matrix(int x, int y) { + Preconditions.checkArgument(x > 0, "Zero row length does not make sense."); + Preconditions.checkArgument(y > 0, "Zero column length does not make sense."); + + this.contents = new double[x][y]; + } + + /** + * Determine if the {@code Matrix} is square. In other words, if the number + * of rows and columns are the same. + * @return {@code true} if the matrix is square, {@code false} otherwise. + */ + public boolean isSquare() { + Preconditions.checkState(this.contents.length >= 1); + return (contents.length == contents[0].length) ? true : false; + } + + /** + * Obtain the current value within the matrix at the provided co-ordinates. + * @param row The row to lookup, indexed from 0. + * @param col The column to lookup, indexed from 0. + * @return The value located at the position {@code [row][col]}. + */ + public double valueAt(int row, int col) { + return this.contents[row][col]; + } + + /** + * Obtain the row vector for the given row, indexed from 0. + * @param row The row number to obtain. + * @return A {@code Vector} representing the row. + */ + public Vector getRow(int row) { + List<Double> rowList = new ArrayList<Double>(this.contents[row].length); + + for (double d : this.contents[row]) + rowList.add(d); + + return Vectors.create(rowList); + } + + /** + * Get the number of rows within the matrix. + * @return The number of rows. + */ + public int getRows() { + return this.contents.length; + } + + /** + * Get the number of columns within the matrix. + * @return The number of columns. + */ + public int getColumns() { + return this.contents[0].length; + } + + /** + * Apply the addition operation on the current matrix and the provided + * matrix. The result is a new matrix. + * @param b The matrix to add. + * @return A new {@code Matrix} representing the result of the addition. + */ + public final Matrix plus(final Matrix b) { + Preconditions.checkArgument((this.getRows() == b.getRows()) && (this.getColumns() == b.getColumns()), + "Illegal matrix dimensions for matrix addition."); + + Matrix result = new Matrix(this.getRows(), this.getColumns()); + for (int i = 0; i < getRows(); i++) { + for (int j = 0; j < getColumns(); j++) { + result.contents[i][j] = this.contents[i][j] + b.contents[i][j]; + } + } + return result; + } + + /** + * Apply the subtration operation on the current matrix and the provided + * matrix. The result is a new matrix. + * @param b The matrix to subtract. + * @return A new {@code Matrix} representing the result of the subtraction. + */ + public final Matrix minus(final Matrix b) { + Preconditions.checkArgument((this.getRows() == b.getRows()) && (this.getColumns() == b.getColumns()), + "Illegal matrix dimensions for matrix subtraction."); + + Matrix result = new Matrix(this.getRows(), this.getColumns()); + for (int i = 0; i < getRows(); i++) { + for (int j = 0; j < getColumns(); j++) { + result.contents[i][j] = this.contents[i][j] - b.contents[i][j]; + } + } + return result; + } + + /** + * Perform multiplication on the current {@code Matrix} and the provided {@code Matrix}. + * Naturally, matrix multiplication can only be performed on matricies that adhere + * to the required matrix multiplication rules. + * <p> + * The result of this operation is a new immutable matrix. + * @param b The {@code Matrix} to to multiply the current {@code Matrix} with. + * @return A new {@code Matrix} representing the result of the multiplication. + */ + public Matrix times(Matrix b) { + Preconditions.checkArgument(this.getRows() == b.getColumns(), "Illegal matrix dimensions for matrix multiplication."); + + Matrix result = new Matrix(this.getRows(), b.getColumns()); + for (int i = 0; i < result.getColumns(); i++) { + for (int j = 0; j < result.getRows(); j++) { + for (int k = 0; k < this.getRows(); k++) + result.contents[i][j] += this.contents[i][k] * b.contents[k][j]; + } + } + return result; + } + + /** + * Obtain the transposition of the current {@code Matrix} instance. + * @return A new {@code Matrix} that is the transpose of the current {@code Matrix}. + */ + public Matrix transpose() { + Matrix result = new Matrix(this.getColumns(), this.getRows()); + for (int i = 0; i < this.getRows(); i++) + for (int j = 0; j < this.getColumns(); j++) + result.contents[j][i] = this.contents[i][j]; + return result; + } + + /** + * {@inheritDoc} + */ + @Override + public Type getClone() { + throw new UnsupportedOperationException("Cloning a Matrix is not possible."); + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + + if (getClass() != obj.getClass()) { + return false; + } + + final Matrix other = (Matrix) obj; + return Arrays.deepEquals(this.contents, other.contents); + } + + @Override + public int hashCode() { + int hash = 0; + + for (double[] array : this.contents) + hash += Arrays.hashCode(array); + + return hash; + } + + /** + * Obtain a builder for {@code Matrix} instances. + * @return A {@link Matrix.Builder} instance. + */ + public static Builder builder() { + return new Builder(); + } + + /** + * A builder object to help with the construction of {@link Matrix} instances. + */ + public static final class Builder { + private int rowNumber; + private int colNumber; + private List<List<Double>> rows; + private List<DataPoint> tuples; + private boolean identity; + + private Builder() { + reset(); + } + + /** + * Define the number of rows that the built up {@code Matrix} will contain. + * @param rows The required number of rows. + * @return The current {@code Builder}. + */ + public Builder rows(int rows) { + this.rowNumber = rows; + return this; + } + + /** + * Define the number of coloumns that the built up {@code Matrix} will contain. + * @param colummns The required number of columns. + * @return The current {@code Builder}. + */ + public Builder columns(int colummns) { + this.colNumber = colummns; + return this; + } + + /** + * Add a row vector, for inclusion in the built up {@code Matrix}. + * @param columnValues The values for the columns. + * @return the current {@code Builder}. + * @throws IllegalArgumentException if the {@code columnValues} are not the same + * dimensions / length that is expected. + */ + public Builder addRow(Double... columnValues) { + Preconditions.checkArgument(columnValues.length == this.colNumber, + "Cannot add a row with a differing column length. Expected: " + this.colNumber + ", got: " + columnValues.length); + + List<Double> rowVector = Arrays.asList(columnValues); + this.rows.add(rowVector); + return this; + } + + /** + * Add a row vector, for inclusion in the built up {@code Matrix}. + * @param iterable The values for the columns. + * @return the current {@code Builder}. + * @throws IllegalArgumentException if the {@code columnValues} are not the same + * dimensions / length that is expected. + */ + public Builder addRow(Iterable<Double> iterable) { + List<Double> list = new ArrayList<Double>(); + Iterables.addAll(list, iterable); + this.rows.add(list); + return this; + } + + /** + * Define that the built up {@code Matrix} should be an identity {@code Matrix}. + * All added row vectors or position values will be discarded if the built up {@code Matrix} + * is to be an identity {@code Matrix}. + * @return The current {@code Builder}. + */ + public Builder identity() { + Preconditions.checkState(this.rowNumber == this.colNumber, "Identity on non-sqaure matrix is not allowed."); + this.identity = true; + return this; + } + + /** + * Define that at a specific value for a defined grid point within the built + * up {@code Matrix}. + * <p> + * This operation will override any values specified by a row vector addition. + * @param row The row number, indexed from 0. + * @param col The column number, indexed from 0. + * @param value The value to be set at the defined location. + * @return The curret {@code Builder}. + */ + public Builder valueAt(int row, int col, double value) { + this.tuples.add(new DataPoint(row, col, value)); + return this; + } + + /** + * Reset the builder into a clean state. + */ + private void reset() { + this.rowNumber = 0; + this.colNumber = 0; + this.rows = new ArrayList<List<Double>>(); + this.tuples = new ArrayList<DataPoint>(); + this.identity = false; + } + + /** + * Build the {@code Matrix} instance, based on the currently defined builder. + * @return A new immutable {@code Matrix} instance. + */ + public Matrix build() { + Matrix matrix = new Matrix(rowNumber, colNumber); + + if (identity) { + for (int i = 0; i < rowNumber; i++) { + for (int j = 0; j < colNumber; j++) { + matrix.contents[i][j] = (i == j) ? 1.0 : 0.0; + } + } + + return matrix; + } + + if (this.rows.size() >= 1) { + for (int i = 0; i < rowNumber; i++) { + for (int j = 0; j < colNumber; j++) { + matrix.contents[i][j] = this.rows.get(i).get(j); + } + } + } + + if (this.tuples.size() >= 0) { + for (DataPoint tuple : this.tuples) { + matrix.contents[tuple.getX()][tuple.getY()] = tuple.getValue(); + } + } + + reset(); // Reset the builder to the default state, so that it may be used again, if needed. + + return matrix; + } + } + + /** + * Class defining a [row, col, value] tuple for building up of a {@code Matrix}. + */ + private static final class DataPoint { + private int x; + private int y; + private double value; + + public DataPoint(int x, int y, double value) { + this.x = x; + this.y = y; + this.value = value; + } + + public double getValue() { + return value; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + } +} diff --git a/src/main/java/net/sourceforge/cilib/util/Vectors.java b/src/main/java/net/sourceforge/cilib/util/Vectors.java index 35679e8..36a7dab 100644 --- a/src/main/java/net/sourceforge/cilib/util/Vectors.java +++ b/src/main/java/net/sourceforge/cilib/util/Vectors.java @@ -21,6 +21,7 @@ */ package net.sourceforge.cilib.util; +import java.util.Arrays; import net.sourceforge.cilib.type.types.Numeric; import net.sourceforge.cilib.type.types.Real; import net.sourceforge.cilib.type.types.Type; @@ -83,9 +84,19 @@ public final class Vectors { * @return The created {@linkplain Vector} object, containing the provided list of items. */ public static <T extends Number> Vector create(T... result) { + return create(Arrays.asList(result)); + } + + /** + * Create a {@code Vector} from the provided {@code Iterable}. + * @param <T> The number type. + * @param iterable The iterable of data elements. + * @return A {@code Vector} of the provided objects. + */ + public static <T extends Number> Vector create(Iterable<T> iterable) { Vector vector = new Vector(); - for (T element : result) + for (T element : iterable) vector.add(new Real(element.doubleValue())); return vector; diff --git a/src/test/java/net/sourceforge/cilib/container/MatrixTest.java b/src/test/java/net/sourceforge/cilib/container/MatrixTest.java deleted file mode 100644 index d4cba40..0000000 --- a/src/test/java/net/sourceforge/cilib/container/MatrixTest.java +++ /dev/null @@ -1,197 +0,0 @@ -/** - * Copyright (C) 2003 - 2009 - * 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.container; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.fail; - -import java.util.Collection; -import java.util.Iterator; - -import org.junit.Test; - - - -/** - * This Unit test tests all the needed operations of the Matrix class. - * - * @author Gary Pampara - */ -public class MatrixTest { - - @Test - public void testMatrixCreation() { - Matrix<Double> m = new Matrix<Double>(3, 3); - assertEquals(3, m.getColumnCount()); - assertEquals(3, m.getRowCount()); - } - - @Test(expected = IllegalArgumentException.class) - public void testMatrixExceptionCreation() { - new Matrix<Double>(0, 0); - } - - @Test - public void testDataMatrixInputOutputOperation() { - Matrix<Integer> m = new Matrix<Integer>(10, 5); - - for (int i = 0; i < m.getRowCount(); i++) { - for (int j = 0; j < m.getColumnCount(); j++) { - int tmp = i*j; - m.set(i, j, tmp); - assertSame(tmp, m.get(i, j)); - assertEquals(tmp, m.get(i, j).intValue()); - } - } - } - - @Test - public void testNullGet() { - Matrix<Integer> m = new Matrix<Integer>(5, 5); - - for (int i = 0; i < m.getRowCount(); i++) { - for (int j = 0; j < m.getColumnCount(); j++) { - assertEquals(null, m.get(i, j)); - } - } - } - - @Test - public void testOutOfBoundsSetOperation() { - Matrix<Double> m = new Matrix<Double>(2, 2); - try { - m.set(-1, 1, null); - } - catch (IndexOutOfBoundsException i1) { - try { - m.set(1, -1, null); - } - catch (IndexOutOfBoundsException i2) { - try { - m.set(0, 2, null); - } - catch (IndexOutOfBoundsException i3) { - try { - m.set(2, 0, null); - } - catch (IndexOutOfBoundsException i4) { - return; - } - } - } - } - fail("Boundary cases fail on the Matrix set operation"); - } - - @Test - public void testOutOfBoundsGetOperation() { - Matrix<Double> m = new Matrix<Double>(2, 2); - // Get operation - try { - m.get(-1, 1); - } - catch (IndexOutOfBoundsException i) { - try { - m.get(1, -1); - } - catch (IndexOutOfBoundsException i2) { - try { - m.get(0, 2); - } - catch (IndexOutOfBoundsException i3) { - try { - m.get(2, 0); - } - catch (IndexOutOfBoundsException i4) { - return; - } - } - } - } - fail("Boundary cases fail on the Matrix get operation"); - } - - @Test - public void testClearOperation() { - Matrix<Double> m = new Matrix<Double>(2, 2); - - m.set(0, 0, new Double(5.0)); - m.set(0, 1, new Double(4.0)); - m.set(1, 0, new Double(3.0)); - m.set(1, 1, new Double(2.0)); - - m.clear(); - - assertEquals(null, m.get(0, 0)); - assertEquals(null, m.get(0, 1)); - assertEquals(null, m.get(1, 0)); - assertEquals(null, m.get(1, 1)); - } - - @Test - public void testGetRow() { - Matrix<Double> m = new Matrix<Double>(2, 2); - - m.set(0, 0, new Double(5.0)); - m.set(0, 1, new Double(4.0)); - m.set(1, 0, new Double(3.0)); - m.set(1, 1, new Double(2.0)); - - Collection<Double> c1 = m.getRow(0); - Collection<Double> c2 = m.getRow(1); - - Iterator<Double> i1 = c1.iterator(); - Iterator<Double> i2 = c2.iterator(); - - for (int i = 0; i < m.getColumnCount(); i++) { - if (i1.hasNext()) assertEquals(m.get(0, i), i1.next()); - else fail(); - - if (i2.hasNext()) assertEquals(m.get(1, i), i2.next()); - else fail(); - } - } - - @Test - public void testGetColumn() { - Matrix<Double> m = new Matrix<Double>(2, 2); - - m.set(0, 0, new Double(5.0)); - m.set(0, 1, new Double(4.0)); - m.set(1, 0, new Double(3.0)); - m.set(1, 1, new Double(2.0)); - - Collection<Double> c1 = m.getColumn(0); - Collection<Double> c2 = m.getColumn(1); - - Iterator<Double> i1 = c1.iterator(); - Iterator<Double> i2 = c2.iterator(); - - for (int i = 0; i < m.getColumnCount(); i++) { - if (i1.hasNext()) assertEquals(m.get(i, 0), i1.next()); - else fail(); - if (i2.hasNext()) assertEquals(m.get(i, 1), i2.next()); - else fail(); - } - } -} diff --git a/src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java b/src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java new file mode 100644 index 0000000..6144707 --- /dev/null +++ b/src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java @@ -0,0 +1,249 @@ +/** + * Copyright (C) 2003 - 2009 + * 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.type.types.container; + +import net.sourceforge.cilib.util.Vectors; +import org.junit.Assert; +import org.junit.Test; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.equalTo; + +/** + * + */ +public class MatrixTest { + + @Test(expected=IllegalArgumentException.class) + public void constructionZeroRow() { + Matrix.builder().rows(0).build(); + } + + @Test(expected=IllegalArgumentException.class) + public void constructionZeroColumn() { + Matrix.builder().columns(0).build(); + } + + @Test + public void square() { + Matrix a = Matrix.builder().rows(2).columns(2).build(); + Assert.assertTrue(a.isSquare()); + } + + @Test + public void notSquare() { + Matrix a = Matrix.builder().rows(3).columns(4).build(); + Assert.assertFalse(a.isSquare()); + } + + @Test + public void valueAt() { + Matrix a = Matrix.builder().rows(1).columns(2) + .addRow(1.0, 2.0) + .build(); + + Assert.assertThat(a.valueAt(0, 0), is(1.0)); + Assert.assertThat(a.valueAt(0, 1), is(2.0)); + } + + @Test(expected=IndexOutOfBoundsException.class) + public void invalidValueOf() { + Matrix a = Matrix.builder().rows(1).columns(1).build(); + a.valueAt(1, 2); + } + + @Test + public void getRow() { + Matrix a = Matrix.builder().rows(2).columns(2) + .addRow(1.0, 1.0) + .addRow(2.0, 2.0) + .build(); + + Vector row = a.getRow(0); + + Assert.assertThat(row.getReal(0), is(1.0)); + Assert.assertThat(row.getReal(1), is(1.0)); + } + + @Test + public void rowNumber() { + Matrix a = Matrix.builder().rows(4).columns(5).build(); + Assert.assertThat(a.getRows(), is(4)); + } + + @Test + public void columnNumber() { + Matrix a = Matrix.builder().rows(5).columns(8).build(); + Assert.assertThat(a.getColumns(), is(8)); + } + + @Test + public void addition() { + Matrix a = Matrix.builder().rows(2).columns(2) + .addRow(1.0, 2.0) + .addRow(3.0, 4.0) + .build(); + Matrix b = Matrix.builder().rows(2).columns(2) + .addRow(1.0, 2.0) + .addRow(3.0, 4.0) + .build(); + + Matrix c = a.plus(b); + + Assert.assertThat(c.getRow(0), equalTo(Vectors.create(2.0, 4.0))); + Assert.assertThat(c.getRow(1), equalTo(Vectors.create(6.0, 8.0))); + } + + @Test(expected=IllegalArgumentException.class) + public void invalidAddition() { + Matrix a = Matrix.builder().rows(3).columns(2).build(); + Matrix b = Matrix.builder().rows(1).columns(2).build(); + a.plus(b); + } + + @Test + public void subtraction() { + Matrix a = Matrix.builder().rows(2).columns(2) + .addRow(2.0, 4.0) + .addRow(6.0, 8.0) + .build(); + Matrix b = Matrix.builder().rows(2).columns(2) + .addRow(1.0, 2.0) + .addRow(3.0, 4.0) + .build(); + + Matrix c = a.minus(b); + + Assert.assertThat(c.getRow(0), equalTo(Vectors.create(1.0, 2.0))); + Assert.assertThat(c.getRow(1), equalTo(Vectors.create(3.0, 4.0))); + } + + @Test(expected=IllegalArgumentException.class) + public void invalidSubtraction() { + Matrix a = Matrix.builder().rows(2).columns(2).build(); + Matrix b = Matrix.builder().rows(2).columns(3).build(); + a.minus(b); + } + + @Test + public void multiplication() { + Matrix a = Matrix.builder().rows(2).columns(2) + .addRow(2.0, 4.0) + .addRow(6.0, 8.0) + .build(); + Matrix b = Matrix.builder().rows(2).columns(2) + .addRow(1.0, 2.0) + .addRow(3.0, 4.0) + .build(); + + Matrix c = a.times(b); + + Assert.assertThat(c.getRow(0), equalTo(Vectors.create(14.0, 20.0))); + Assert.assertThat(c.getRow(1), equalTo(Vectors.create(30.0, 44.0))); + } + + @Test + public void squareTranspose() { + Matrix a = Matrix.builder().rows(2).columns(2) + .addRow(2.0, 4.0) + .addRow(6.0, 8.0) + .build(); + + Matrix c = a.transpose(); + + Assert.assertThat(c.getRow(0), equalTo(Vectors.create(2.0, 6.0))); + Assert.assertThat(c.getRow(1), equalTo(Vectors.create(4.0, 8.0))); + } + + @Test + public void transposeRowVector() { + Matrix a = Matrix.builder().rows(1).columns(2) + .addRow(2.0, 4.0) + .build(); + + Matrix c = a.transpose(); + + Assert.assertThat(c.getRows(), is(2)); + Assert.assertThat(c.getColumns(), is(1)); + } + + @Test + public void transposeColumnVector() { + Matrix a = Matrix.builder().rows(2).columns(1) + .addRow(2.0) + .addRow(4.0) + .build(); + + Matrix c = a.transpose(); + + Assert.assertThat(c.getRows(), is(1)); + Assert.assertThat(c.getColumns(), is(2)); + } + + @Test + public void identity() { + Matrix identity = Matrix.builder().rows(4).columns(4).identity().build(); + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + if (i == j) Assert.assertThat(identity.valueAt(i, j), is(1.0)); + else Assert.assertThat(identity.valueAt(i, j), is(0.0)); + } + } + } + + @Test(expected=IllegalStateException.class) + public void invalidIdentity() { + Matrix.builder().rows(2).columns(5).identity().build(); + } + + @Test + public void uniquePositionSetting() { + Matrix a = Matrix.builder().rows(2).columns(2) + .valueAt(0, 0, 3.0) + .build(); + + Assert.assertThat(a.valueAt(0, 0), is(3.0)); + Assert.assertThat(a.valueAt(0, 1), is(0.0)); + Assert.assertThat(a.valueAt(1, 0), is(0.0)); + Assert.assertThat(a.valueAt(1, 1), is(0.0)); + } + + @Test + public void equal() { + Matrix.Builder builder = Matrix.builder(); + Matrix a = builder.rows(1).columns(1).valueAt(0, 0, 2.0).build(); + Matrix b = builder.rows(1).columns(1).valueAt(0, 0, 2.0).build(); + + Assert.assertTrue(a.equals(b)); + } + + @Test + public void hash() { + Matrix.Builder builder = Matrix.builder(); + Matrix a = builder.rows(1).columns(1).valueAt(0, 0, 2.0).build(); + Matrix b = builder.rows(1).columns(1).valueAt(0, 0, 2.0).build(); + + Assert.assertTrue(a.hashCode() == b.hashCode()); + } + +} -- 1.6.4 |
From: Gary P. <gpa...@gm...> - 2009-08-13 06:46:12
|
The second revision of the Immutable Matrix type. Added the ability to obtain permutations of a list and the determinant of a Matrix. |
From: Gary P. <gpa...@gm...> - 2009-08-07 14:20:47
|
Hi all, CIlib now is hosting a phpbb forum for additional discussions. Please head to http://forums.cilib.net and register an account. Regards, Gary |
From: Theuns C. <the...@gm...> - 2009-08-05 19:07:02
|
Gary, Wiehann and myself have discussed this a bit and I will try to summarise it here: Algorithm.get() is legacy code that everyone was comfortable with to the extent that it now consumes CIlib. Algorithm.get() is bad because it breaks testability and it is also not a complete solution for what we sometimes want to achieve. Sometimes we want to get hold of the sub-algorithm so that we can get hold of the sub-problem; this is possible. But other times we want to get hold of the main problem, whilst executing the sub-algorithm; this is not possible. Sometimes we use Algorithm.get() to get hold of the topology with entities. And sometimes we just use Algorithm.get() so that we can know how many iterations have been executed. What we have learnt from CIlib Algorithms so far, especially MultiPopulationBasedAlgorithms, is that an Algorithm can be a composite of other Algorithms that usually results in some tree structure. Two things should ring your bells: 1. Composite design pattern. 2. Tree -> visitor design pattern; different configurable visitors depending on what you want to achieve. Also, the Algorithm class is bloated, because it has state that deals with things like the number of iterations, stopping conditions and whether the "algorithm" is still running or not. These are all things that are related to a simulation rather than an algorithm. We thought of making Algorithm an interface and moving these extra things into a separate Simulation class. This shouldn't be too difficult and might even be done before we tackle the Algorithm.get() issue. The CIlib population still needs to explore more of the search space to find the optimal solution. Regards -- Theuns On Wed, Aug 5, 2009 at 9:17 AM, Gary Pampara<gpa...@gm...> wrote: > I should mention that ideally I'm looking to remove Algorithm.get() and access > it in a more dependency injected fashion. In other words, have the Algorithm > given to me. > > Regards, > Gary > > On Wednesday 05 August 2009 09:14:06 Gary Pampara wrote: >> Hi all, >> >> The static access to Algorithm.get() is seriously annoying as it breaks >> testability of the code. >> >> I'm asking for suggestions on how to resolve this correctly. I know that >> the method is convenient, but it's not a healthy relationship to have. At >> the moment, I'm struggling to test the updates to ControlParameter due to >> the tight coupling that the Algorithm.get() method introduces. >> >> Looking forward to you ideas! >> >> Regards, >> Gary |
From: Gary P. <gpa...@gm...> - 2009-08-05 07:18:00
|
I should mention that ideally I'm looking to remove Algorithm.get() and access it in a more dependency injected fashion. In other words, have the Algorithm given to me. Regards, Gary On Wednesday 05 August 2009 09:14:06 Gary Pampara wrote: > Hi all, > > The static access to Algorithm.get() is seriously annoying as it breaks > testability of the code. > > I'm asking for suggestions on how to resolve this correctly. I know that > the method is convenient, but it's not a healthy relationship to have. At > the moment, I'm struggling to test the updates to ControlParameter due to > the tight coupling that the Algorithm.get() method introduces. > > Looking forward to you ideas! > > Regards, > Gary > > --------------------------------------------------------------------------- >--- Let Crystal Reports handle the reporting - Free Crystal Reports 2008 > 30-Day trial. Simplify your report design, integration and deployment - and > focus on what you do best, core application coding. Discover what's new > with Crystal Reports now. http://p.sf.net/sfu/bobj-july > _______________________________________________ > cilib-devel mailing list > cil...@li... > https://lists.sourceforge.net/lists/listinfo/cilib-devel |
From: Gary P. <gpa...@gm...> - 2009-08-05 07:14:24
|
Hi all, The static access to Algorithm.get() is seriously annoying as it breaks testability of the code. I'm asking for suggestions on how to resolve this correctly. I know that the method is convenient, but it's not a healthy relationship to have. At the moment, I'm struggling to test the updates to ControlParameter due to the tight coupling that the Algorithm.get() method introduces. Looking forward to you ideas! Regards, Gary |
From: Gary P. <gpa...@gm...> - 2009-08-04 07:32:20
|
Seems like there are two scenarios for this: 1. The fitness evaluations need to be counted 2. The number of fitness updates need to be maintained. As a result of the above, (2) will need to be implemented. (1) seems valid though. Thoughts? On Friday 31 July 2009 10:31:27 Gary Pampara wrote: > Chatted to Leo. > > There are exceptions when it comes to dynamic environments. Positions that > have not changed that need to be re-evaluated based on an environment > change should not count as a fitness evaluation. > > Will adjust the patch to cater for such situations. |