1 package net.bmahe.genetics4j.core.evaluation;
2
3 import java.util.List;
4 import java.util.Objects;
5 import java.util.concurrent.CompletableFuture;
6 import java.util.concurrent.ExecutorService;
7
8 import org.apache.commons.lang3.Validate;
9 import org.apache.logging.log4j.LogManager;
10 import org.apache.logging.log4j.Logger;
11
12 import net.bmahe.genetics4j.core.FitnessBulkAsync;
13 import net.bmahe.genetics4j.core.Genotype;
14 import net.bmahe.genetics4j.core.spec.EAConfigurationBulkAsync;
15
16
17
18
19
20
21 public class FitnessEvaluatorBulkAsync<T extends Comparable<T>> implements FitnessEvaluator<T> {
22
23 public static final Logger logger = LogManager.getLogger(FitnessEvaluatorBulkAsync.class);
24
25 private final EAConfigurationBulkAsync<T> eaConfigurationBulkAsync;
26
27 private final ExecutorService executorService;
28
29 public FitnessEvaluatorBulkAsync(final EAConfigurationBulkAsync<T> _eaConfigurationBulkAsync,
30 final ExecutorService _executorService) {
31 Objects.requireNonNull(_eaConfigurationBulkAsync);
32 Objects.requireNonNull(_executorService);
33
34 this.eaConfigurationBulkAsync = _eaConfigurationBulkAsync;
35 this.executorService = _executorService;
36 }
37
38 @Override
39 public List<T> evaluate(final long generation, final List<Genotype> genotypes) {
40 Validate.isTrue(generation >= 0);
41 Objects.requireNonNull(genotypes);
42 Validate.isTrue(genotypes.isEmpty() == false, "genotypes cannot be empty");
43
44 final FitnessBulkAsync<T> fitnessBulkAsync = eaConfigurationBulkAsync.fitness();
45
46 logger.trace("Submitting fitness computation task");
47 final CompletableFuture<List<T>> fitnessesCF = fitnessBulkAsync.compute(executorService, genotypes);
48
49 return fitnessesCF.join();
50 }
51 }