View Javadoc
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  }