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