Tournament.java

package net.bmahe.genetics4j.core.spec.selection;

import java.util.Comparator;

import org.apache.commons.lang3.Validate;
import org.immutables.value.Value;

import net.bmahe.genetics4j.core.Individual;

@Value.Immutable
public abstract class Tournament<T extends Comparable<T>> implements SelectionPolicy {

	@Value.Parameter
	public abstract int numCandidates();

	@Value.Default
	public Comparator<Individual<T>> comparator() {
		return Comparator.comparing(Individual::fitness);
	}

	public static class Builder<T extends Comparable<T>> extends ImmutableTournament.Builder<T> {
		@Override
		public Tournament<T> build() {
			final Tournament<T> instance = super.build();
			Validate.isTrue(instance.numCandidates() > 0, "Number of candidates must be positive");
			return instance;
		}
	}

	public static <U extends Comparable<U>> Tournament<U> of(final int numCandidates) {
		Validate.isTrue(numCandidates > 0, "Number of candidates must be positive");
		return ImmutableTournament.of(numCandidates);
	}

	public static <U extends Comparable<U>> Tournament<U> of(final int numCandidates,
			final Comparator<Individual<U>> comparator) {
		Validate.isTrue(numCandidates > 0, "Number of candidates must be positive");
		return new Builder<U>().numCandidates(numCandidates).comparator(comparator).build();
	}

}