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