1 package net.bmahe.genetics4j.gp.combination;
2
3 import java.util.random.RandomGenerator;
4
5 import org.apache.commons.lang3.Validate;
6 import org.apache.logging.log4j.LogManager;
7 import org.apache.logging.log4j.Logger;
8
9 import net.bmahe.genetics4j.core.combination.ChromosomeCombinator;
10 import net.bmahe.genetics4j.core.combination.ChromosomeCombinatorHandler;
11 import net.bmahe.genetics4j.core.combination.ChromosomeCombinatorResolver;
12 import net.bmahe.genetics4j.core.spec.chromosome.ChromosomeSpec;
13 import net.bmahe.genetics4j.core.spec.combination.CombinationPolicy;
14 import net.bmahe.genetics4j.gp.spec.chromosome.ProgramTreeChromosomeSpec;
15 import net.bmahe.genetics4j.gp.spec.combination.ProgramRandomCombine;
16
17 public class ProgramRandomCombineHandler<T extends Comparable<T>> implements ChromosomeCombinatorHandler<T> {
18 final static public Logger logger = LogManager.getLogger(ProgramRandomCombineHandler.class);
19
20 final RandomGenerator randomGenerator;
21
22 public ProgramRandomCombineHandler(final RandomGenerator _randomGenerator) {
23 Validate.notNull(_randomGenerator);
24
25 this.randomGenerator = _randomGenerator;
26 }
27
28 @Override
29 public boolean canHandle(final ChromosomeCombinatorResolver<T> chromosomeCombinatorResolver,
30 final CombinationPolicy combinationPolicy, final ChromosomeSpec chromosome) {
31 Validate.notNull(chromosomeCombinatorResolver);
32 Validate.notNull(combinationPolicy);
33 Validate.notNull(chromosome);
34
35 return combinationPolicy instanceof ProgramRandomCombine && chromosome instanceof ProgramTreeChromosomeSpec;
36 }
37
38 @Override
39 public ChromosomeCombinator<T> resolve(final ChromosomeCombinatorResolver<T> chromosomeCombinatorResolver,
40 final CombinationPolicy combinationPolicy, final ChromosomeSpec chromosomeSpec) {
41 Validate.notNull(chromosomeCombinatorResolver);
42 Validate.notNull(combinationPolicy);
43 Validate.notNull(chromosomeSpec);
44 Validate.isInstanceOf(ProgramTreeChromosomeSpec.class,
45 chromosomeSpec,
46 "This combinator does not support chromosome specs %s",
47 chromosomeSpec);
48
49 final ProgramTreeChromosomeSpec programTreeChromosomeSpec = (ProgramTreeChromosomeSpec) chromosomeSpec;
50
51 return new ProgramChromosomeCombinator<T>(randomGenerator);
52 }
53 }