1 package net.bmahe.genetics4j.core.mutation;
2
3 import java.util.Objects;
4 import java.util.random.RandomGenerator;
5
6 import org.apache.commons.lang3.Validate;
7
8 import net.bmahe.genetics4j.core.spec.AbstractEAConfiguration;
9 import net.bmahe.genetics4j.core.spec.AbstractEAExecutionContext;
10 import net.bmahe.genetics4j.core.spec.mutation.MutationPolicy;
11 import net.bmahe.genetics4j.core.spec.mutation.RepeatedMutation;
12
13 public class RepeatedMutationPolicyHandler<T extends Comparable<T>> implements MutationPolicyHandler<T> {
14
15 private final RandomGenerator randomGenerator;
16
17 public RepeatedMutationPolicyHandler(final RandomGenerator _randomGenerator) {
18 this.randomGenerator = Objects.requireNonNull(_randomGenerator);
19 }
20
21 @Override
22 public boolean canHandle(final MutationPolicyHandlerResolver<T> mutationPolicyHandlerResolver,
23 final MutationPolicy mutationPolicy) {
24 Objects.requireNonNull(mutationPolicyHandlerResolver);
25 Objects.requireNonNull(mutationPolicy);
26
27 if ((mutationPolicy instanceof RepeatedMutation) == false) {
28 return false;
29 }
30
31 final RepeatedMutation repeatedMutation = (RepeatedMutation) mutationPolicy;
32 return mutationPolicyHandlerResolver.canHandle(repeatedMutation.mutationPolicy());
33 }
34
35 @Override
36 public Mutator createMutator(final AbstractEAExecutionContext<T> eaExecutionContext,
37 final AbstractEAConfiguration<T> eaConfiguration,
38 final MutationPolicyHandlerResolver<T> mutationPolicyHandlerResolver, final MutationPolicy mutationPolicy) {
39 Objects.requireNonNull(eaExecutionContext);
40 Objects.requireNonNull(eaConfiguration);
41 Objects.requireNonNull(mutationPolicyHandlerResolver);
42 Objects.requireNonNull(mutationPolicy);
43 Validate.isInstanceOf(RepeatedMutation.class, mutationPolicy);
44
45 final RepeatedMutation repeatedMutation = (RepeatedMutation) mutationPolicy;
46 final MutationPolicy childMutationPolicy = repeatedMutation.mutationPolicy();
47 final MutationPolicyHandler<T> childMutationPolicyHandler = mutationPolicyHandlerResolver
48 .resolve(childMutationPolicy);
49 final Mutator childMutator = childMutationPolicyHandler
50 .createMutator(eaExecutionContext, eaConfiguration, mutationPolicyHandlerResolver, childMutationPolicy);
51
52 return new RepeatedMutator(randomGenerator, repeatedMutation, childMutator);
53 }
54 }