[MATH-854] fill throws clause for genetics package.

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1385297 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Thomas Neidhart 2012-09-16 16:05:57 +00:00
parent ef8beb8b2b
commit 1a9e32ab8f
20 changed files with 109 additions and 54 deletions

View File

@ -38,7 +38,7 @@ public abstract class AbstractListChromosome<T> extends Chromosome {
* @param representation inner representation of the chromosome * @param representation inner representation of the chromosome
* @throws InvalidRepresentationException iff the <code>representation</code> can not represent a valid chromosome * @throws InvalidRepresentationException iff the <code>representation</code> can not represent a valid chromosome
*/ */
public AbstractListChromosome(final List<T> representation) { public AbstractListChromosome(final List<T> representation) throws InvalidRepresentationException {
checkValidity(representation); checkValidity(representation);
this.representation = Collections.unmodifiableList(new ArrayList<T> (representation)); this.representation = Collections.unmodifiableList(new ArrayList<T> (representation));
} }
@ -46,8 +46,9 @@ public abstract class AbstractListChromosome<T> extends Chromosome {
/** /**
* Constructor. * Constructor.
* @param representation inner representation of the chromosome * @param representation inner representation of the chromosome
* @throws InvalidRepresentationException iff the <code>representation</code> can not represent a valid chromosome
*/ */
public AbstractListChromosome(final T[] representation) { public AbstractListChromosome(final T[] representation) throws InvalidRepresentationException {
this(Arrays.asList(representation)); this(Arrays.asList(representation));
} }

View File

@ -34,7 +34,7 @@ public abstract class BinaryChromosome extends AbstractListChromosome<Integer> {
* @param representation list of {0,1} values representing the chromosome * @param representation list of {0,1} values representing the chromosome
* @throws InvalidRepresentationException iff the <code>representation</code> can not represent a valid chromosome * @throws InvalidRepresentationException iff the <code>representation</code> can not represent a valid chromosome
*/ */
public BinaryChromosome(List<Integer> representation) { public BinaryChromosome(List<Integer> representation) throws InvalidRepresentationException {
super(representation); super(representation);
} }
@ -43,7 +43,7 @@ public abstract class BinaryChromosome extends AbstractListChromosome<Integer> {
* @param representation array of {0,1} values representing the chromosome * @param representation array of {0,1} values representing the chromosome
* @throws InvalidRepresentationException iff the <code>representation</code> can not represent a valid chromosome * @throws InvalidRepresentationException iff the <code>representation</code> can not represent a valid chromosome
*/ */
public BinaryChromosome(Integer[] representation) { public BinaryChromosome(Integer[] representation) throws InvalidRepresentationException {
super(representation); super(representation);
} }
@ -51,8 +51,7 @@ public abstract class BinaryChromosome extends AbstractListChromosome<Integer> {
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
protected void checkValidity(List<Integer> chromosomeRepresentation) protected void checkValidity(List<Integer> chromosomeRepresentation) throws InvalidRepresentationException {
throws InvalidRepresentationException {
for (int i : chromosomeRepresentation) { for (int i : chromosomeRepresentation) {
if (i < 0 || i >1) { if (i < 0 || i >1) {
throw new InvalidRepresentationException(LocalizedFormats.INVALID_BINARY_DIGIT, throw new InvalidRepresentationException(LocalizedFormats.INVALID_BINARY_DIGIT,
@ -75,9 +74,6 @@ public abstract class BinaryChromosome extends AbstractListChromosome<Integer> {
return rList; return rList;
} }
/**
* {@inheritDoc}
*/
@Override @Override
protected boolean isSame(Chromosome another) { protected boolean isSame(Chromosome another) {
// type check // type check

View File

@ -37,7 +37,7 @@ public class BinaryMutation implements MutationPolicy {
* @return the mutated chromosome. * @return the mutated chromosome.
* @throws MathIllegalArgumentException if <code>original</code> is not an instance of {@link BinaryChromosome}. * @throws MathIllegalArgumentException if <code>original</code> is not an instance of {@link BinaryChromosome}.
*/ */
public Chromosome mutate(Chromosome original) { public Chromosome mutate(Chromosome original) throws MathIllegalArgumentException {
if (!(original instanceof BinaryChromosome)) { if (!(original instanceof BinaryChromosome)) {
throw new MathIllegalArgumentException(LocalizedFormats.INVALID_BINARY_CHROMOSOME); throw new MathIllegalArgumentException(LocalizedFormats.INVALID_BINARY_CHROMOSOME);
} }

View File

@ -16,6 +16,8 @@
*/ */
package org.apache.commons.math3.genetics; package org.apache.commons.math3.genetics;
import org.apache.commons.math3.exception.MathIllegalArgumentException;
/** /**
* Policy used to create a pair of new chromosomes by performing a crossover * Policy used to create a pair of new chromosomes by performing a crossover
* operation on a source pair of chromosomes. * operation on a source pair of chromosomes.
@ -31,6 +33,7 @@ public interface CrossoverPolicy {
* @param first the first chromosome. * @param first the first chromosome.
* @param second the second chromosome. * @param second the second chromosome.
* @return the pair of new chromosomes that resulted from the crossover. * @return the pair of new chromosomes that resulted from the crossover.
* @throws MathIllegalArgumentException if the given chromosomes are not compatible with this {@link CrossoverPolicy}
*/ */
ChromosomePair crossover(Chromosome first, Chromosome second); ChromosomePair crossover(Chromosome first, Chromosome second) throws MathIllegalArgumentException;
} }

View File

@ -95,9 +95,14 @@ public class CycleCrossover<T> implements CrossoverPolicy {
/** /**
* {@inheritDoc} * {@inheritDoc}
*
* @throws MathIllegalArgumentException if the chromosomes are not an instance of {@link AbstractListChromosome}
* @throws DimensionMismatchException if the length of the two chromosomes is different
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public ChromosomePair crossover(final Chromosome first, final Chromosome second) { public ChromosomePair crossover(final Chromosome first, final Chromosome second)
throws DimensionMismatchException, MathIllegalArgumentException {
if (!(first instanceof AbstractListChromosome<?> && second instanceof AbstractListChromosome<?>)) { if (!(first instanceof AbstractListChromosome<?> && second instanceof AbstractListChromosome<?>)) {
throw new MathIllegalArgumentException(LocalizedFormats.INVALID_FIXED_LENGTH_CHROMOSOME); throw new MathIllegalArgumentException(LocalizedFormats.INVALID_FIXED_LENGTH_CHROMOSOME);
} }
@ -112,7 +117,9 @@ public class CycleCrossover<T> implements CrossoverPolicy {
* @return the pair of new chromosomes that resulted from the crossover * @return the pair of new chromosomes that resulted from the crossover
* @throws DimensionMismatchException if the length of the two chromosomes is different * @throws DimensionMismatchException if the length of the two chromosomes is different
*/ */
protected ChromosomePair mate(final AbstractListChromosome<T> first, final AbstractListChromosome<T> second) { protected ChromosomePair mate(final AbstractListChromosome<T> first, final AbstractListChromosome<T> second)
throws DimensionMismatchException {
final int length = first.getLength(); final int length = first.getLength();
if (length != second.getLength()) { if (length != second.getLength()) {
throw new DimensionMismatchException(second.getLength(), length); throw new DimensionMismatchException(second.getLength(), length);

View File

@ -19,6 +19,9 @@ package org.apache.commons.math3.genetics;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import org.apache.commons.math3.exception.NotPositiveException;
import org.apache.commons.math3.exception.NullArgumentException;
import org.apache.commons.math3.exception.NumberIsTooLargeException;
import org.apache.commons.math3.exception.OutOfRangeException; import org.apache.commons.math3.exception.OutOfRangeException;
import org.apache.commons.math3.exception.util.LocalizedFormats; import org.apache.commons.math3.exception.util.LocalizedFormats;
import org.apache.commons.math3.util.FastMath; import org.apache.commons.math3.util.FastMath;
@ -41,13 +44,18 @@ public class ElitisticListPopulation extends ListPopulation {
* @param chromosomes list of chromosomes in the population * @param chromosomes list of chromosomes in the population
* @param populationLimit maximal size of the population * @param populationLimit maximal size of the population
* @param elitismRate how many best chromosomes will be directly transferred to the next generation [in %] * @param elitismRate how many best chromosomes will be directly transferred to the next generation [in %]
* @throws NullArgumentException if the list of chromosomes is {@code null}
* @throws NotPositiveException if the population limit is not a positive number (&lt; 1)
* @throws NumberIsTooLargeException if the list of chromosomes exceeds the population limit
* @throws OutOfRangeException if the elitism rate is outside the [0, 1] range * @throws OutOfRangeException if the elitism rate is outside the [0, 1] range
*/ */
public ElitisticListPopulation(final List<Chromosome> chromosomes, public ElitisticListPopulation(final List<Chromosome> chromosomes, final int populationLimit,
final int populationLimit, final double elitismRate)
final double elitismRate) { throws NullArgumentException, NotPositiveException, NumberIsTooLargeException, OutOfRangeException {
super(chromosomes, populationLimit); super(chromosomes, populationLimit);
setElitismRate(elitismRate); setElitismRate(elitismRate);
} }
/** /**
@ -55,11 +63,15 @@ public class ElitisticListPopulation extends ListPopulation {
* *
* @param populationLimit maximal size of the population * @param populationLimit maximal size of the population
* @param elitismRate how many best chromosomes will be directly transferred to the next generation [in %] * @param elitismRate how many best chromosomes will be directly transferred to the next generation [in %]
* @throws NotPositiveException if the population limit is not a positive number (&lt; 1)
* @throws OutOfRangeException if the elitism rate is outside the [0, 1] range * @throws OutOfRangeException if the elitism rate is outside the [0, 1] range
*/ */
public ElitisticListPopulation(final int populationLimit, final double elitismRate) { public ElitisticListPopulation(final int populationLimit, final double elitismRate)
throws NotPositiveException, OutOfRangeException {
super(populationLimit); super(populationLimit);
setElitismRate(elitismRate); setElitismRate(elitismRate);
} }
/** /**
@ -90,7 +102,7 @@ public class ElitisticListPopulation extends ListPopulation {
* @param elitismRate how many best chromosomes will be directly transferred to the next generation [in %] * @param elitismRate how many best chromosomes will be directly transferred to the next generation [in %]
* @throws OutOfRangeException if the elitism rate is outside the [0, 1] range * @throws OutOfRangeException if the elitism rate is outside the [0, 1] range
*/ */
public void setElitismRate(final double elitismRate) { public void setElitismRate(final double elitismRate) throws OutOfRangeException {
if (elitismRate < 0 || elitismRate > 1) { if (elitismRate < 0 || elitismRate > 1) {
throw new OutOfRangeException(LocalizedFormats.ELITISM_RATE, elitismRate, 0, 1); throw new OutOfRangeException(LocalizedFormats.ELITISM_RATE, elitismRate, 0, 1);
} }

View File

@ -43,7 +43,7 @@ public class FixedElapsedTime implements StoppingCondition {
* @param maxTime maximum number of seconds generations are allowed to evolve * @param maxTime maximum number of seconds generations are allowed to evolve
* @throws NumberIsTooSmallException if the provided time is &lt; 0 * @throws NumberIsTooSmallException if the provided time is &lt; 0
*/ */
public FixedElapsedTime(final long maxTime) { public FixedElapsedTime(final long maxTime) throws NumberIsTooSmallException {
this(maxTime, TimeUnit.SECONDS); this(maxTime, TimeUnit.SECONDS);
} }
@ -54,7 +54,7 @@ public class FixedElapsedTime implements StoppingCondition {
* @param unit {@link TimeUnit} of the maxTime argument * @param unit {@link TimeUnit} of the maxTime argument
* @throws NumberIsTooSmallException if the provided time is &lt; 0 * @throws NumberIsTooSmallException if the provided time is &lt; 0
*/ */
public FixedElapsedTime(final long maxTime, final TimeUnit unit) { public FixedElapsedTime(final long maxTime, final TimeUnit unit) throws NumberIsTooSmallException {
if (maxTime < 0) { if (maxTime < 0) {
throw new NumberIsTooSmallException(maxTime, 0, true); throw new NumberIsTooSmallException(maxTime, 0, true);
} }

View File

@ -39,7 +39,7 @@ public class FixedGenerationCount implements StoppingCondition {
* @param maxGenerations number of generations to evolve * @param maxGenerations number of generations to evolve
* @throws NumberIsTooSmallException if the number of generations is &lt; 1 * @throws NumberIsTooSmallException if the number of generations is &lt; 1
*/ */
public FixedGenerationCount(final int maxGenerations) { public FixedGenerationCount(final int maxGenerations) throws NumberIsTooSmallException {
if (maxGenerations <= 0) { if (maxGenerations <= 0) {
throw new NumberIsTooSmallException(maxGenerations, 1, true); throw new NumberIsTooSmallException(maxGenerations, 1, true);
} }

View File

@ -69,7 +69,7 @@ public class GeneticAlgorithm {
final double crossoverRate, final double crossoverRate,
final MutationPolicy mutationPolicy, final MutationPolicy mutationPolicy,
final double mutationRate, final double mutationRate,
final SelectionPolicy selectionPolicy) { final SelectionPolicy selectionPolicy) throws OutOfRangeException {
if (crossoverRate < 0 || crossoverRate > 1) { if (crossoverRate < 0 || crossoverRate > 1) {
throw new OutOfRangeException(LocalizedFormats.CROSSOVER_RATE, throw new OutOfRangeException(LocalizedFormats.CROSSOVER_RATE,

View File

@ -48,7 +48,7 @@ public abstract class ListPopulation implements Population {
* @param populationLimit maximal size of the population * @param populationLimit maximal size of the population
* @throws NotPositiveException if the population limit is not a positive number (&lt; 1) * @throws NotPositiveException if the population limit is not a positive number (&lt; 1)
*/ */
public ListPopulation(final int populationLimit) { public ListPopulation(final int populationLimit) throws NotPositiveException {
this(Collections.<Chromosome> emptyList(), populationLimit); this(Collections.<Chromosome> emptyList(), populationLimit);
} }
@ -63,7 +63,9 @@ public abstract class ListPopulation implements Population {
* @throws NotPositiveException if the population limit is not a positive number (&lt; 1) * @throws NotPositiveException if the population limit is not a positive number (&lt; 1)
* @throws NumberIsTooLargeException if the list of chromosomes exceeds the population limit * @throws NumberIsTooLargeException if the list of chromosomes exceeds the population limit
*/ */
public ListPopulation(final List<Chromosome> chromosomes, final int populationLimit) { public ListPopulation(final List<Chromosome> chromosomes, final int populationLimit)
throws NullArgumentException, NotPositiveException, NumberIsTooLargeException {
if (chromosomes == null) { if (chromosomes == null) {
throw new NullArgumentException(); throw new NullArgumentException();
} }
@ -91,7 +93,9 @@ public abstract class ListPopulation implements Population {
* @deprecated use {@link #addChromosomes(Collection)} instead * @deprecated use {@link #addChromosomes(Collection)} instead
*/ */
@Deprecated @Deprecated
public void setChromosomes(final List<Chromosome> chromosomes) { public void setChromosomes(final List<Chromosome> chromosomes)
throws NullArgumentException, NumberIsTooLargeException {
if (chromosomes == null) { if (chromosomes == null) {
throw new NullArgumentException(); throw new NullArgumentException();
} }
@ -109,7 +113,7 @@ public abstract class ListPopulation implements Population {
* @throws NumberIsTooLargeException if the population would exceed the population limit when * @throws NumberIsTooLargeException if the population would exceed the population limit when
* adding this chromosome * adding this chromosome
*/ */
public void addChromosomes(final Collection<Chromosome> chromosomeColl) { public void addChromosomes(final Collection<Chromosome> chromosomeColl) throws NumberIsTooLargeException {
if (chromosomes.size() + chromosomeColl.size() > populationLimit) { if (chromosomes.size() + chromosomeColl.size() > populationLimit) {
throw new NumberIsTooLargeException(LocalizedFormats.LIST_OF_CHROMOSOMES_BIGGER_THAN_POPULATION_SIZE, throw new NumberIsTooLargeException(LocalizedFormats.LIST_OF_CHROMOSOMES_BIGGER_THAN_POPULATION_SIZE,
chromosomes.size(), populationLimit, false); chromosomes.size(), populationLimit, false);
@ -140,7 +144,7 @@ public abstract class ListPopulation implements Population {
* @throws NumberIsTooLargeException if the population would exceed the {@code populationLimit} after * @throws NumberIsTooLargeException if the population would exceed the {@code populationLimit} after
* adding this chromosome * adding this chromosome
*/ */
public void addChromosome(final Chromosome chromosome) { public void addChromosome(final Chromosome chromosome) throws NumberIsTooLargeException {
if (chromosomes.size() >= populationLimit) { if (chromosomes.size() >= populationLimit) {
throw new NumberIsTooLargeException(LocalizedFormats.LIST_OF_CHROMOSOMES_BIGGER_THAN_POPULATION_SIZE, throw new NumberIsTooLargeException(LocalizedFormats.LIST_OF_CHROMOSOMES_BIGGER_THAN_POPULATION_SIZE,
chromosomes.size(), populationLimit, false); chromosomes.size(), populationLimit, false);
@ -179,7 +183,7 @@ public abstract class ListPopulation implements Population {
* @throws NumberIsTooSmallException if the new population size is smaller than the current number * @throws NumberIsTooSmallException if the new population size is smaller than the current number
* of chromosomes in the population * of chromosomes in the population
*/ */
public void setPopulationLimit(final int populationLimit) { public void setPopulationLimit(final int populationLimit) throws NotPositiveException, NumberIsTooSmallException {
if (populationLimit <= 0) { if (populationLimit <= 0) {
throw new NotPositiveException(LocalizedFormats.POPULATION_LIMIT_NOT_POSITIVE, populationLimit); throw new NotPositiveException(LocalizedFormats.POPULATION_LIMIT_NOT_POSITIVE, populationLimit);
} }

View File

@ -16,6 +16,8 @@
*/ */
package org.apache.commons.math3.genetics; package org.apache.commons.math3.genetics;
import org.apache.commons.math3.exception.MathIllegalArgumentException;
/** /**
* Algorithm used to mutate a chromosome. * Algorithm used to mutate a chromosome.
* *
@ -28,6 +30,7 @@ public interface MutationPolicy {
* Mutate the given chromosome. * Mutate the given chromosome.
* @param original the original chromosome. * @param original the original chromosome.
* @return the mutated chromosome. * @return the mutated chromosome.
* @throws MathIllegalArgumentException if the given chromosome is not compatible with this {@link MutationPolicy}
*/ */
Chromosome mutate(Chromosome original); Chromosome mutate(Chromosome original) throws MathIllegalArgumentException;
} }

View File

@ -64,7 +64,7 @@ public class NPointCrossover<T> implements CrossoverPolicy {
* @param crossoverPoints the number of crossover points * @param crossoverPoints the number of crossover points
* @throws NotStrictlyPositiveException if the number of {@code crossoverPoints} is not strictly positive * @throws NotStrictlyPositiveException if the number of {@code crossoverPoints} is not strictly positive
*/ */
public NPointCrossover(final int crossoverPoints) { public NPointCrossover(final int crossoverPoints) throws NotStrictlyPositiveException {
if (crossoverPoints <= 0) { if (crossoverPoints <= 0) {
throw new NotStrictlyPositiveException(crossoverPoints); throw new NotStrictlyPositiveException(crossoverPoints);
} }
@ -105,7 +105,9 @@ public class NPointCrossover<T> implements CrossoverPolicy {
* @throws DimensionMismatchException if the length of the two chromosomes is different * @throws DimensionMismatchException if the length of the two chromosomes is different
*/ */
@SuppressWarnings("unchecked") // OK because of instanceof checks @SuppressWarnings("unchecked") // OK because of instanceof checks
public ChromosomePair crossover(final Chromosome first, final Chromosome second) { public ChromosomePair crossover(final Chromosome first, final Chromosome second)
throws DimensionMismatchException, MathIllegalArgumentException {
if (!(first instanceof AbstractListChromosome<?> && second instanceof AbstractListChromosome<?>)) { if (!(first instanceof AbstractListChromosome<?> && second instanceof AbstractListChromosome<?>)) {
throw new MathIllegalArgumentException(LocalizedFormats.INVALID_FIXED_LENGTH_CHROMOSOME); throw new MathIllegalArgumentException(LocalizedFormats.INVALID_FIXED_LENGTH_CHROMOSOME);
} }
@ -122,7 +124,9 @@ public class NPointCrossover<T> implements CrossoverPolicy {
* @throws NumberIsTooLargeException if the number of crossoverPoints is too large for the actual chromosomes * @throws NumberIsTooLargeException if the number of crossoverPoints is too large for the actual chromosomes
*/ */
private ChromosomePair mate(final AbstractListChromosome<T> first, private ChromosomePair mate(final AbstractListChromosome<T> first,
final AbstractListChromosome<T> second) { final AbstractListChromosome<T> second)
throws DimensionMismatchException, NumberIsTooLargeException {
final int length = first.getLength(); final int length = first.getLength();
if (length != second.getLength()) { if (length != second.getLength()) {
throw new DimensionMismatchException(second.getLength(), length); throw new DimensionMismatchException(second.getLength(), length);

View File

@ -76,7 +76,9 @@ public class OnePointCrossover<T> implements CrossoverPolicy {
* @throws DimensionMismatchException if the length of the two chromosomes is different * @throws DimensionMismatchException if the length of the two chromosomes is different
*/ */
@SuppressWarnings("unchecked") // OK because of instanceof checks @SuppressWarnings("unchecked") // OK because of instanceof checks
public ChromosomePair crossover(final Chromosome first, final Chromosome second) { public ChromosomePair crossover(final Chromosome first, final Chromosome second)
throws DimensionMismatchException, MathIllegalArgumentException {
if (! (first instanceof AbstractListChromosome<?> && second instanceof AbstractListChromosome<?>)) { if (! (first instanceof AbstractListChromosome<?> && second instanceof AbstractListChromosome<?>)) {
throw new MathIllegalArgumentException(LocalizedFormats.INVALID_FIXED_LENGTH_CHROMOSOME); throw new MathIllegalArgumentException(LocalizedFormats.INVALID_FIXED_LENGTH_CHROMOSOME);
} }
@ -93,7 +95,7 @@ public class OnePointCrossover<T> implements CrossoverPolicy {
* @throws DimensionMismatchException if the length of the two chromosomes is different * @throws DimensionMismatchException if the length of the two chromosomes is different
*/ */
private ChromosomePair crossover(final AbstractListChromosome<T> first, private ChromosomePair crossover(final AbstractListChromosome<T> first,
final AbstractListChromosome<T> second) { final AbstractListChromosome<T> second) throws DimensionMismatchException {
final int length = first.getLength(); final int length = first.getLength();
if (length != second.getLength()) { if (length != second.getLength()) {
throw new DimensionMismatchException(second.getLength(), length); throw new DimensionMismatchException(second.getLength(), length);

View File

@ -62,9 +62,15 @@ public class OrderedCrossover<T> implements CrossoverPolicy {
/** /**
* {@inheritDoc} * {@inheritDoc}
*
* @throws MathIllegalArgumentException iff one of the chromosomes is
* not an instance of {@link AbstractListChromosome}
* @throws DimensionMismatchException if the length of the two chromosomes is different
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public ChromosomePair crossover(final Chromosome first, final Chromosome second) { public ChromosomePair crossover(final Chromosome first, final Chromosome second)
throws DimensionMismatchException, MathIllegalArgumentException {
if (!(first instanceof AbstractListChromosome<?> && second instanceof AbstractListChromosome<?>)) { if (!(first instanceof AbstractListChromosome<?> && second instanceof AbstractListChromosome<?>)) {
throw new MathIllegalArgumentException(LocalizedFormats.INVALID_FIXED_LENGTH_CHROMOSOME); throw new MathIllegalArgumentException(LocalizedFormats.INVALID_FIXED_LENGTH_CHROMOSOME);
} }
@ -79,7 +85,9 @@ public class OrderedCrossover<T> implements CrossoverPolicy {
* @return the pair of new chromosomes that resulted from the crossover * @return the pair of new chromosomes that resulted from the crossover
* @throws DimensionMismatchException if the length of the two chromosomes is different * @throws DimensionMismatchException if the length of the two chromosomes is different
*/ */
protected ChromosomePair mate(final AbstractListChromosome<T> first, final AbstractListChromosome<T> second) { protected ChromosomePair mate(final AbstractListChromosome<T> first, final AbstractListChromosome<T> second)
throws DimensionMismatchException {
final int length = first.getLength(); final int length = first.getLength();
if (length != second.getLength()) { if (length != second.getLength()) {
throw new DimensionMismatchException(second.getLength(), length); throw new DimensionMismatchException(second.getLength(), length);

View File

@ -16,6 +16,8 @@
*/ */
package org.apache.commons.math3.genetics; package org.apache.commons.math3.genetics;
import org.apache.commons.math3.exception.NumberIsTooLargeException;
/** /**
* A collection of chromosomes that facilitates generational evolution. * A collection of chromosomes that facilitates generational evolution.
@ -45,10 +47,10 @@ public interface Population extends Iterable<Chromosome> {
/** /**
* Add the given chromosome to the population. * Add the given chromosome to the population.
* @param chromosome the chromosome to add. * @param chromosome the chromosome to add.
* @throws org.apache.commons.math3.exception.NumberIsTooLargeException if the population would exceed * @throws NumberIsTooLargeException if the population would exceed the population limit when adding
* the population limit when adding this chromosome * this chromosome
*/ */
void addChromosome(Chromosome chromosome); void addChromosome(Chromosome chromosome) throws NumberIsTooLargeException;
/** /**
* Access the fittest chromosome in this population. * Access the fittest chromosome in this population.

View File

@ -68,10 +68,9 @@ public abstract class RandomKey<T> extends AbstractListChromosome<Double> implem
* Constructor. * Constructor.
* *
* @param representation list of [0,1] values representing the permutation * @param representation list of [0,1] values representing the permutation
* @throws InvalidRepresentationException iff the <code>representation</code> can not represent * @throws InvalidRepresentationException iff the <code>representation</code> can not represent a valid chromosome
* a valid chromosome
*/ */
public RandomKey(final List<Double> representation) { public RandomKey(final List<Double> representation) throws InvalidRepresentationException {
super(representation); super(representation);
// store the sorted representation // store the sorted representation
List<Double> sortedRepr = new ArrayList<Double> (getRepresentation()); List<Double> sortedRepr = new ArrayList<Double> (getRepresentation());
@ -87,8 +86,9 @@ public abstract class RandomKey<T> extends AbstractListChromosome<Double> implem
* Constructor. * Constructor.
* *
* @param representation array of [0,1] values representing the permutation * @param representation array of [0,1] values representing the permutation
* @throws InvalidRepresentationException iff the <code>representation</code> can not represent a valid chromosome
*/ */
public RandomKey(final Double[] representation) { public RandomKey(final Double[] representation) throws InvalidRepresentationException {
this(Arrays.asList(representation)); this(Arrays.asList(representation));
} }
@ -112,7 +112,9 @@ public abstract class RandomKey<T> extends AbstractListChromosome<Double> implem
* <code>representation</code> or <code>sortedRepr</code> lists are not equal * <code>representation</code> or <code>sortedRepr</code> lists are not equal
*/ */
private static <S> List<S> decodeGeneric(final List<S> sequence, List<Double> representation, private static <S> List<S> decodeGeneric(final List<S> sequence, List<Double> representation,
final List<Double> sortedRepr) { final List<Double> sortedRepr)
throws DimensionMismatchException {
int l = sequence.size(); int l = sequence.size();
// the size of the three lists must be equal // the size of the three lists must be equal
@ -254,7 +256,8 @@ public abstract class RandomKey<T> extends AbstractListChromosome<Double> implem
* <code>originalData</code> lists contain different data * <code>originalData</code> lists contain different data
*/ */
public static <S> List<Double> inducedPermutation(final List<S> originalData, public static <S> List<Double> inducedPermutation(final List<S> originalData,
final List<S> permutedData) { final List<S> permutedData)
throws DimensionMismatchException, MathIllegalArgumentException {
if (originalData.size() != permutedData.size()) { if (originalData.size() != permutedData.size()) {
throw new DimensionMismatchException(permutedData.size(), originalData.size()); throw new DimensionMismatchException(permutedData.size(), originalData.size());

View File

@ -36,7 +36,7 @@ public class RandomKeyMutation implements MutationPolicy {
* *
* @throws MathIllegalArgumentException if <code>original</code> is not a {@link RandomKey} instance * @throws MathIllegalArgumentException if <code>original</code> is not a {@link RandomKey} instance
*/ */
public Chromosome mutate(final Chromosome original) { public Chromosome mutate(final Chromosome original) throws MathIllegalArgumentException {
if (!(original instanceof RandomKey<?>)) { if (!(original instanceof RandomKey<?>)) {
throw new MathIllegalArgumentException(LocalizedFormats.RANDOMKEY_MUTATION_WRONG_CLASS, throw new MathIllegalArgumentException(LocalizedFormats.RANDOMKEY_MUTATION_WRONG_CLASS,
original.getClass().getSimpleName()); original.getClass().getSimpleName());

View File

@ -16,6 +16,8 @@
*/ */
package org.apache.commons.math3.genetics; package org.apache.commons.math3.genetics;
import org.apache.commons.math3.exception.MathIllegalArgumentException;
/** /**
* Algorithm used to select a chromosome pair from a population. * Algorithm used to select a chromosome pair from a population.
* *
@ -27,6 +29,7 @@ public interface SelectionPolicy {
* Select two chromosomes from the population. * Select two chromosomes from the population.
* @param population the population from which the chromosomes are choosen. * @param population the population from which the chromosomes are choosen.
* @return the selected chromosomes. * @return the selected chromosomes.
* @throws MathIllegalArgumentException if the population is not compatible with this {@link SelectionPolicy}
*/ */
ChromosomePair select(Population population); ChromosomePair select(Population population) throws MathIllegalArgumentException;
} }

View File

@ -53,8 +53,9 @@ public class TournamentSelection implements SelectionPolicy {
* *
* @param population the population from which the chromosomes are chosen. * @param population the population from which the chromosomes are chosen.
* @return the selected chromosomes. * @return the selected chromosomes.
* @throws MathIllegalArgumentException if the tournament arity is bigger than the population size
*/ */
public ChromosomePair select(final Population population) { public ChromosomePair select(final Population population) throws MathIllegalArgumentException {
return new ChromosomePair(tournament((ListPopulation) population), return new ChromosomePair(tournament((ListPopulation) population),
tournament((ListPopulation) population)); tournament((ListPopulation) population));
} }
@ -67,7 +68,7 @@ public class TournamentSelection implements SelectionPolicy {
* @return the selected chromosome. * @return the selected chromosome.
* @throws MathIllegalArgumentException if the tournament arity is bigger than the population size * @throws MathIllegalArgumentException if the tournament arity is bigger than the population size
*/ */
private Chromosome tournament(final ListPopulation population) { private Chromosome tournament(final ListPopulation population) throws MathIllegalArgumentException {
if (population.getPopulationSize() < this.arity) { if (population.getPopulationSize() < this.arity) {
throw new MathIllegalArgumentException(LocalizedFormats.TOO_LARGE_TOURNAMENT_ARITY, throw new MathIllegalArgumentException(LocalizedFormats.TOO_LARGE_TOURNAMENT_ARITY,
arity, population.getPopulationSize()); arity, population.getPopulationSize());

View File

@ -60,7 +60,7 @@ public class UniformCrossover<T> implements CrossoverPolicy {
* @param ratio the mixing ratio * @param ratio the mixing ratio
* @throws OutOfRangeException if the mixing ratio is outside the [0, 1] range * @throws OutOfRangeException if the mixing ratio is outside the [0, 1] range
*/ */
public UniformCrossover(final double ratio) { public UniformCrossover(final double ratio) throws OutOfRangeException {
if (ratio < 0.0d || ratio > 1.0d) { if (ratio < 0.0d || ratio > 1.0d) {
throw new OutOfRangeException(LocalizedFormats.CROSSOVER_RATE, ratio, 0.0d, 1.0d); throw new OutOfRangeException(LocalizedFormats.CROSSOVER_RATE, ratio, 0.0d, 1.0d);
} }
@ -78,9 +78,15 @@ public class UniformCrossover<T> implements CrossoverPolicy {
/** /**
* {@inheritDoc} * {@inheritDoc}
*
* @throws MathIllegalArgumentException iff one of the chromosomes is
* not an instance of {@link AbstractListChromosome}
* @throws DimensionMismatchException if the length of the two chromosomes is different
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public ChromosomePair crossover(final Chromosome first, final Chromosome second) { public ChromosomePair crossover(final Chromosome first, final Chromosome second)
throws DimensionMismatchException, MathIllegalArgumentException {
if (!(first instanceof AbstractListChromosome<?> && second instanceof AbstractListChromosome<?>)) { if (!(first instanceof AbstractListChromosome<?> && second instanceof AbstractListChromosome<?>)) {
throw new MathIllegalArgumentException(LocalizedFormats.INVALID_FIXED_LENGTH_CHROMOSOME); throw new MathIllegalArgumentException(LocalizedFormats.INVALID_FIXED_LENGTH_CHROMOSOME);
} }
@ -96,7 +102,7 @@ public class UniformCrossover<T> implements CrossoverPolicy {
* @throws DimensionMismatchException if the length of the two chromosomes is different * @throws DimensionMismatchException if the length of the two chromosomes is different
*/ */
private ChromosomePair mate(final AbstractListChromosome<T> first, private ChromosomePair mate(final AbstractListChromosome<T> first,
final AbstractListChromosome<T> second) { final AbstractListChromosome<T> second) throws DimensionMismatchException {
final int length = first.getLength(); final int length = first.getLength();
if (length != second.getLength()) { if (length != second.getLength()) {
throw new DimensionMismatchException(second.getLength(), length); throw new DimensionMismatchException(second.getLength(), length);