1 package net.bmahe.genetics4j.core.util;
2
3 import java.util.List;
4 import java.util.Objects;
5
6 import net.bmahe.genetics4j.core.chromosomes.Chromosome;
7 import net.bmahe.genetics4j.core.mutation.chromosome.ChromosomeMutationHandler;
8 import net.bmahe.genetics4j.core.spec.AbstractEAConfiguration;
9 import net.bmahe.genetics4j.core.spec.AbstractEAExecutionContext;
10 import net.bmahe.genetics4j.core.spec.chromosome.ChromosomeSpec;
11 import net.bmahe.genetics4j.core.spec.mutation.MutationPolicy;
12
13 public class ChromosomeResolverUtils {
14
15 public static <T extends Comparable<T>> ChromosomeMutationHandler<? extends Chromosome> findMatchingChromosomeMutationPolicyHandler(
16 final AbstractEAExecutionContext<T> eaExecutionContext, final MutationPolicy mutationPolicy,
17 final ChromosomeSpec chromosomeSpec) {
18 Objects.requireNonNull(eaExecutionContext);
19 Objects.requireNonNull(mutationPolicy);
20 Objects.requireNonNull(chromosomeSpec);
21
22 final List<ChromosomeMutationHandler<? extends Chromosome>> chromosomeMutationPolicyHandlers = eaExecutionContext
23 .chromosomeMutationPolicyHandlers();
24
25 return chromosomeMutationPolicyHandlers.stream()
26 .dropWhile(sph -> sph.canHandle(mutationPolicy, chromosomeSpec) == false)
27 .findFirst()
28 .orElseThrow(
29 () -> new IllegalStateException(
30 "Could not find suitable chromosome mutation policy handler for policy: " + mutationPolicy
31 + " and chromosome spec: " + chromosomeSpec));
32 }
33
34 public static <T extends Comparable<T>> ChromosomeMutationHandler<? extends Chromosome>[] resolveChromosomeMutationHandlers(
35 final AbstractEAExecutionContext<T> eaExecutionContext, final AbstractEAConfiguration<T> eaConfiguration,
36 final MutationPolicy mutationPolicy) {
37 Objects.requireNonNull(eaExecutionContext);
38 Objects.requireNonNull(eaConfiguration);
39 Objects.requireNonNull(mutationPolicy);
40
41 final ChromosomeMutationHandler<? extends Chromosome>[] chromosomePolicyHandlers = new ChromosomeMutationHandler[eaConfiguration
42 .chromosomeSpecs()
43 .size()];
44 final List<ChromosomeSpec> chromosomeSpecs = eaConfiguration.chromosomeSpecs();
45 for (int i = 0; i < chromosomeSpecs.size(); i++) {
46 final ChromosomeSpec chromosomeSpec = chromosomeSpecs.get(i);
47 chromosomePolicyHandlers[i] = findMatchingChromosomeMutationPolicyHandler(
48 eaExecutionContext,
49 mutationPolicy,
50 chromosomeSpec);
51 }
52
53 return chromosomePolicyHandlers;
54 }
55 }