1 package net.bmahe.genetics4j.gp.program;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.List;
6 import java.util.Objects;
7 import java.util.random.RandomGenerator;
8
9 import org.apache.commons.lang3.Validate;
10
11 import net.bmahe.genetics4j.core.chromosomes.TreeNode;
12 import net.bmahe.genetics4j.gp.Operation;
13
14 public class MultiProgramGenerator implements ProgramGenerator {
15
16 private final List<ProgramGenerator> programGenerators = new ArrayList<>();
17
18 private final RandomGenerator randomGenerator;
19
20 public MultiProgramGenerator(final RandomGenerator _randomGenerator,
21 final Collection<ProgramGenerator> _programGenerators) {
22 Objects.requireNonNull(_randomGenerator);
23 Objects.requireNonNull(_programGenerators);
24 Validate.isTrue(_programGenerators.isEmpty() == false, "At least one program generator must be provided");
25
26 this.randomGenerator = _randomGenerator;
27 this.programGenerators.addAll(_programGenerators);
28 }
29
30 private ProgramGenerator pickProgramGenerator() {
31 final int programGeneratorIndex = randomGenerator.nextInt(programGenerators.size());
32
33 return programGenerators.get(programGeneratorIndex);
34 }
35
36 @Override
37 public TreeNode<Operation<?>> generate(final Program program) {
38 Objects.requireNonNull(program);
39
40 final ProgramGenerator programGenerator = pickProgramGenerator();
41 return programGenerator.generate(program);
42 }
43
44 @Override
45 public <T> TreeNode<Operation<T>> generate(final Program program, final int maxDepth) {
46 Objects.requireNonNull(program);
47 Validate.isTrue(maxDepth > 0);
48
49 final ProgramGenerator programGenerator = pickProgramGenerator();
50 return programGenerator.generate(program, maxDepth);
51 }
52
53 @Override
54 public <T, U> TreeNode<Operation<T>> generate(final Program program, final int maxDepth, final Class<U> rootType) {
55 Objects.requireNonNull(program);
56 Validate.isTrue(maxDepth > 0);
57 Objects.requireNonNull(program);
58
59 final ProgramGenerator programGenerator = pickProgramGenerator();
60 return programGenerator.generate(program, maxDepth, rootType);
61 }
62 }