1 package net.bmahe.genetics4j.core.combination;
2
3 import java.util.List;
4 import java.util.Objects;
5
6 import net.bmahe.genetics4j.core.spec.AbstractEAExecutionContext;
7 import net.bmahe.genetics4j.core.spec.chromosome.ChromosomeSpec;
8 import net.bmahe.genetics4j.core.spec.combination.CombinationPolicy;
9
10 public class ChromosomeCombinatorResolver<T extends Comparable<T>> {
11
12 private final AbstractEAExecutionContext<T> eaExecutionContext;
13 private final List<ChromosomeCombinatorHandler<T>> chromosomeCombinatorHandlers;
14
15 public ChromosomeCombinatorResolver(final AbstractEAExecutionContext<T> _eaExecutionContext) {
16 Objects.requireNonNull(_eaExecutionContext);
17
18 this.eaExecutionContext = _eaExecutionContext;
19 this.chromosomeCombinatorHandlers = eaExecutionContext.chromosomeCombinatorHandlers();
20 }
21
22 public boolean canHandle(final CombinationPolicy combinationPolicy, final ChromosomeSpec chromosome) {
23 Objects.requireNonNull(combinationPolicy);
24 Objects.requireNonNull(chromosome);
25
26 return chromosomeCombinatorHandlers.stream().anyMatch(cch -> cch.canHandle(this, combinationPolicy, chromosome));
27
28 }
29
30 public ChromosomeCombinator<T> resolve(final CombinationPolicy combinationPolicy, final ChromosomeSpec chromosome) {
31 Objects.requireNonNull(combinationPolicy);
32 Objects.requireNonNull(chromosome);
33
34 return chromosomeCombinatorHandlers.stream()
35 .dropWhile(cch -> cch.canHandle(this, combinationPolicy, chromosome) == false)
36 .findFirst()
37 .map(cch -> cch.resolve(this, combinationPolicy, chromosome))
38 .orElseThrow(
39 () -> new IllegalStateException(
40 "Could not find suitable chromosome combination policy handler for policy " + combinationPolicy
41 + " and chromosome " + chromosome));
42 }
43 }