1 package net.bmahe.genetics4j.core.combination.multicombinations;
2
3 import java.util.List;
4 import java.util.Objects;
5 import java.util.random.RandomGenerator;
6 import java.util.stream.Collectors;
7
8 import org.apache.commons.lang3.Validate;
9
10 import net.bmahe.genetics4j.core.combination.ChromosomeCombinator;
11 import net.bmahe.genetics4j.core.combination.ChromosomeCombinatorHandler;
12 import net.bmahe.genetics4j.core.combination.ChromosomeCombinatorResolver;
13 import net.bmahe.genetics4j.core.spec.chromosome.ChromosomeSpec;
14 import net.bmahe.genetics4j.core.spec.combination.CombinationPolicy;
15 import net.bmahe.genetics4j.core.spec.combination.MultiCombinations;
16
17 public class MultiCombinationsHandler<T extends Comparable<T>> implements ChromosomeCombinatorHandler<T> {
18
19 private final RandomGenerator randomGenerator;
20
21 public MultiCombinationsHandler(final RandomGenerator _randomGenerator) {
22 Objects.requireNonNull(_randomGenerator);
23
24 this.randomGenerator = _randomGenerator;
25 }
26
27 @Override
28 public boolean canHandle(final ChromosomeCombinatorResolver<T> chromosomeCombinatorResolver,
29 final CombinationPolicy combinationPolicy, final ChromosomeSpec chromosome) {
30 Objects.requireNonNull(chromosomeCombinatorResolver);
31 Objects.requireNonNull(combinationPolicy);
32 Objects.requireNonNull(chromosome);
33
34 final boolean isMultiCombinationPolicy = combinationPolicy instanceof MultiCombinations;
35
36 if (isMultiCombinationPolicy == false) {
37 return false;
38 }
39
40 final MultiCombinations multiCombinations = (MultiCombinations) combinationPolicy;
41
42 return multiCombinations.combinationPolicies()
43 .stream()
44 .allMatch(cp -> chromosomeCombinatorResolver.canHandle(cp, chromosome));
45 }
46
47 @Override
48 public ChromosomeCombinator<T> resolve(final ChromosomeCombinatorResolver<T> chromosomeCombinatorResolver,
49 final CombinationPolicy combinationPolicy, final ChromosomeSpec chromosome) {
50 Objects.requireNonNull(chromosomeCombinatorResolver);
51 Objects.requireNonNull(combinationPolicy);
52 Objects.requireNonNull(chromosome);
53 Validate.isInstanceOf(MultiCombinations.class, combinationPolicy);
54
55 final MultiCombinations multiCombinations = (MultiCombinations) combinationPolicy;
56
57 final List<ChromosomeCombinator<T>> chromosomeCombinators = multiCombinations.combinationPolicies()
58 .stream()
59 .map(cp -> chromosomeCombinatorResolver.resolve(cp, chromosome))
60 .collect(Collectors.toList());
61
62 return new MultiChromosomeCombinations<>(randomGenerator, chromosomeCombinators);
63 }
64 }