ChromosomeCombinatorResolver.java
package net.bmahe.genetics4j.core.combination;
import java.util.List;
import java.util.Objects;
import net.bmahe.genetics4j.core.spec.AbstractEAExecutionContext;
import net.bmahe.genetics4j.core.spec.chromosome.ChromosomeSpec;
import net.bmahe.genetics4j.core.spec.combination.CombinationPolicy;
public class ChromosomeCombinatorResolver<T extends Comparable<T>> {
private final AbstractEAExecutionContext<T> eaExecutionContext;
private final List<ChromosomeCombinatorHandler<T>> chromosomeCombinatorHandlers;
public ChromosomeCombinatorResolver(final AbstractEAExecutionContext<T> _eaExecutionContext) {
Objects.requireNonNull(_eaExecutionContext);
this.eaExecutionContext = _eaExecutionContext;
this.chromosomeCombinatorHandlers = eaExecutionContext.chromosomeCombinatorHandlers();
}
public boolean canHandle(final CombinationPolicy combinationPolicy, final ChromosomeSpec chromosome) {
Objects.requireNonNull(combinationPolicy);
Objects.requireNonNull(chromosome);
return chromosomeCombinatorHandlers.stream().anyMatch(cch -> cch.canHandle(this, combinationPolicy, chromosome));
}
public ChromosomeCombinator<T> resolve(final CombinationPolicy combinationPolicy, final ChromosomeSpec chromosome) {
Objects.requireNonNull(combinationPolicy);
Objects.requireNonNull(chromosome);
return chromosomeCombinatorHandlers.stream()
.dropWhile(cch -> cch.canHandle(this, combinationPolicy, chromosome) == false)
.findFirst()
.map(cch -> cch.resolve(this, combinationPolicy, chromosome))
.orElseThrow(
() -> new IllegalStateException(
"Could not find suitable chromosome combination policy handler for policy " + combinationPolicy
+ " and chromosome " + chromosome));
}
}