MultiStageFitness.java

1
package net.bmahe.genetics4j.gpu.spec.fitness;
2
3
import java.util.HashMap;
4
import java.util.HashSet;
5
import java.util.List;
6
import java.util.Map;
7
import java.util.Map.Entry;
8
import java.util.Set;
9
import java.util.concurrent.CompletableFuture;
10
import java.util.concurrent.ConcurrentHashMap;
11
import java.util.concurrent.ExecutorService;
12
13
import org.apache.commons.collections4.MapUtils;
14
import org.apache.commons.lang3.Validate;
15
import org.apache.logging.log4j.LogManager;
16
import org.apache.logging.log4j.Logger;
17
import org.jocl.CL;
18
import org.jocl.Pointer;
19
import org.jocl.Sizeof;
20
21
import net.bmahe.genetics4j.core.Genotype;
22
import net.bmahe.genetics4j.gpu.opencl.OpenCLExecutionContext;
23
import net.bmahe.genetics4j.gpu.opencl.model.Device;
24
import net.bmahe.genetics4j.gpu.spec.fitness.cldata.CLData;
25
import net.bmahe.genetics4j.gpu.spec.fitness.kernelcontext.KernelExecutionContext;
26
import net.bmahe.genetics4j.gpu.spec.fitness.multistage.MultiStageDescriptor;
27
import net.bmahe.genetics4j.gpu.spec.fitness.multistage.StageDescriptor;
28
29
/**
30
 * GPU-accelerated fitness evaluator that executes multiple sequential OpenCL kernels for complex fitness computation.
31
 * 
32
 * <p>MultiStageFitness provides a framework for implementing fitness evaluation that requires multiple sequential GPU
33
 * kernel executions, where each stage can use results from previous stages as input. This is ideal for complex fitness
34
 * functions that require multiple computational phases, such as neural network training, multi-objective optimization,
35
 * or hierarchical problem decomposition.
36
 * 
37
 * <p>Key features:
38
 * <ul>
39
 * <li><strong>Sequential execution</strong>: Multiple OpenCL kernels executed in sequence</li>
40
 * <li><strong>Inter-stage data flow</strong>: Results from earlier stages used as inputs to later stages</li>
41
 * <li><strong>Memory optimization</strong>: Automatic cleanup and reuse of intermediate results</li>
42
 * <li><strong>Pipeline processing</strong>: Support for complex computational pipelines</li>
43
 * <li><strong>Stage configuration</strong>: Individual configuration for each computational stage</li>
44
 * </ul>
45
 * 
46
 * <p>Multi-stage computation architecture:
47
 * <ul>
48
 * <li><strong>Stage descriptors</strong>: Each stage defines its kernel, data loaders, and result allocators</li>
49
 * <li><strong>Data reuse patterns</strong>: Previous stage results can be reused as arguments or size parameters</li>
50
 * <li><strong>Memory lifecycle</strong>: Automatic management of intermediate results between stages</li>
51
 * <li><strong>Static data sharing</strong>: Algorithm parameters shared across all stages</li>
52
 * </ul>
53
 * 
54
 * <p>Typical usage pattern:
55
 * 
56
 * <pre>{@code
57
 * // Define multi-stage descriptor with sequential kernels
58
 * MultiStageDescriptor descriptor = MultiStageDescriptor.builder()
59
 * 		.addStaticDataLoader("parameters", parametersLoader)
60
 * 		.addStage(StageDescriptor.builder()
61
 * 				.kernelName("preprocessing")
62
 * 				.addDataLoader(0, inputDataLoader)
63
 * 				.addResultAllocator(1, preprocessedResultAllocator)
64
 * 				.build())
65
 * 		.addStage(StageDescriptor.builder()
66
 * 				.kernelName("fitness_evaluation")
67
 * 				.reusePreviousResultAsArgument(1, 0) // Use previous result as input
68
 * 				.addResultAllocator(1, fitnessResultAllocator)
69
 * 				.build())
70
 * 		.build();
71
 * 
72
 * // Define fitness extraction from final stage results
73
 * FitnessExtractor<Double> extractor = (context, kernelCtx, executor, generation, genotypes, results) -> {
74
 * 	float[] fitnessValues = results.extractFloatArray(context, 1);
75
 * 	return Arrays.stream(fitnessValues)
76
 * 			.mapToDouble(f -> (double) f)
77
 * 			.boxed()
78
 * 			.collect(Collectors.toList());
79
 * };
80
 * 
81
 * // Create multi-stage fitness evaluator
82
 * MultiStageFitness<Double> fitness = MultiStageFitness.of(descriptor, extractor);
83
 * }</pre>
84
 * 
85
 * <p>Stage execution workflow:
86
 * <ol>
87
 * <li><strong>Initialization</strong>: Load shared static data once before all evaluations</li>
88
 * <li><strong>Stage iteration</strong>: For each stage in sequence:</li>
89
 * <li><strong>Context computation</strong>: Calculate kernel execution parameters for the stage</li>
90
 * <li><strong>Data preparation</strong>: Load stage-specific data and map previous results</li>
91
 * <li><strong>Kernel execution</strong>: Execute the stage kernel with configured parameters</li>
92
 * <li><strong>Result management</strong>: Store results for potential use in subsequent stages</li>
93
 * <li><strong>Final extraction</strong>: Extract fitness values from the last stage results</li>
94
 * <li><strong>Cleanup</strong>: Release all intermediate and final result memory</li>
95
 * </ol>
96
 * 
97
 * <p>Inter-stage data flow patterns:
98
 * <ul>
99
 * <li><strong>Result reuse</strong>: Use previous stage output buffers as input to subsequent stages</li>
100
 * <li><strong>Size propagation</strong>: Use previous stage result sizes as parameters for memory allocation</li>
101
 * <li><strong>Memory optimization</strong>: Automatic cleanup of intermediate results no longer needed</li>
102
 * <li><strong>Data type preservation</strong>: Maintain OpenCL data types across stage boundaries</li>
103
 * </ul>
104
 * 
105
 * <p>Memory management strategy:
106
 * <ul>
107
 * <li><strong>Static data persistence</strong>: Shared parameters allocated once across all stages</li>
108
 * <li><strong>Intermediate cleanup</strong>: Automatic release of stage results when no longer needed</li>
109
 * <li><strong>Result chaining</strong>: Efficient memory reuse between consecutive stages</li>
110
 * <li><strong>Final cleanup</strong>: Complete memory cleanup after fitness extraction</li>
111
 * </ul>
112
 * 
113
 * <p>Performance optimization features:
114
 * <ul>
115
 * <li><strong>Pipeline efficiency</strong>: Minimized memory transfers between stages</li>
116
 * <li><strong>Memory coalescing</strong>: Optimized data layouts for GPU memory access</li>
117
 * <li><strong>Stage-specific tuning</strong>: Individual work group optimization per stage</li>
118
 * <li><strong>Asynchronous execution</strong>: Non-blocking fitness computation</li>
119
 * </ul>
120
 * 
121
 * @param <T> the fitness value type, must be Comparable for optimization algorithms
122
 * @see OpenCLFitness
123
 * @see MultiStageDescriptor
124
 * @see StageDescriptor
125
 * @see FitnessExtractor
126
 */
127
public class MultiStageFitness<T extends Comparable<T>> extends OpenCLFitness<T> {
128
	public static final Logger logger = LogManager.getLogger(MultiStageFitness.class);
129
130
	private final MultiStageDescriptor multiStageDescriptor;
131
	private final FitnessExtractor<T> fitnessExtractor;
132
133 2 1. <init> : removed call to java/util/concurrent/ConcurrentHashMap::<init> → NO_COVERAGE
2. <init> : Removed assignment to member variable staticData → NO_COVERAGE
	private final Map<Device, Map<String, CLData>> staticData = new ConcurrentHashMap<>();
134
135
	protected void clearStaticData(final Device device) {
136 10 1. clearStaticData : removed call to org/apache/commons/collections4/MapUtils::isEmpty → NO_COVERAGE
2. clearStaticData : removed conditional - replaced equality check with false → NO_COVERAGE
3. clearStaticData : removed call to java/util/Map::get → NO_COVERAGE
4. clearStaticData : negated conditional → NO_COVERAGE
5. clearStaticData : replaced call to java/util/Map::get with argument → NO_COVERAGE
6. clearStaticData : removed conditional - replaced equality check with true → NO_COVERAGE
7. clearStaticData : removed call to org/apache/commons/collections4/MapUtils::isEmpty → NO_COVERAGE
8. clearStaticData : removed conditional - replaced equality check with true → NO_COVERAGE
9. clearStaticData : removed conditional - replaced equality check with false → NO_COVERAGE
10. clearStaticData : negated conditional → NO_COVERAGE
		if (MapUtils.isEmpty(staticData) || MapUtils.isEmpty(staticData.get(device))) {
137
			return;
138
		}
139
140 2 1. clearStaticData : removed call to java/util/Map::get → NO_COVERAGE
2. clearStaticData : replaced call to java/util/Map::get with argument → NO_COVERAGE
		final Map<String, CLData> mapData = staticData.get(device);
141 1 1. clearStaticData : removed call to java/util/Map::values → NO_COVERAGE
		for (final CLData clData : mapData.values()) {
142 2 1. clearStaticData : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE
2. clearStaticData : removed call to org/jocl/CL::clReleaseMemObject → NO_COVERAGE
			CL.clReleaseMemObject(clData.clMem());
143
		}
144
145 1 1. clearStaticData : removed call to java/util/Map::clear → NO_COVERAGE
		mapData.clear();
146 2 1. clearStaticData : removed call to java/util/Map::remove → NO_COVERAGE
2. clearStaticData : replaced call to java/util/Map::remove with argument → NO_COVERAGE
		staticData.remove(device);
147
	}
148
149
	protected void clearData(final Map<Integer, CLData> data) {
150 4 1. clearData : removed call to org/apache/commons/collections4/MapUtils::isEmpty → NO_COVERAGE
2. clearData : negated conditional → NO_COVERAGE
3. clearData : removed conditional - replaced equality check with false → NO_COVERAGE
4. clearData : removed conditional - replaced equality check with true → NO_COVERAGE
		if (MapUtils.isEmpty(data)) {
151
			return;
152
		}
153
154 1 1. clearData : removed call to java/util/Map::values → NO_COVERAGE
		for (final CLData clData : data.values()) {
155 2 1. clearData : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE
2. clearData : removed call to org/jocl/CL::clReleaseMemObject → NO_COVERAGE
			CL.clReleaseMemObject(clData.clMem());
156
		}
157
158 1 1. clearData : removed call to java/util/Map::clear → NO_COVERAGE
		data.clear();
159
	}
160
161
	protected void clearResultData(final Map<Integer, CLData> resultData) {
162 4 1. clearResultData : removed call to org/apache/commons/collections4/MapUtils::isEmpty → NO_COVERAGE
2. clearResultData : removed conditional - replaced equality check with true → NO_COVERAGE
3. clearResultData : removed conditional - replaced equality check with false → NO_COVERAGE
4. clearResultData : negated conditional → NO_COVERAGE
		if (MapUtils.isEmpty(resultData)) {
163
			return;
164
		}
165
166 1 1. clearResultData : removed call to java/util/Map::values → NO_COVERAGE
		for (final CLData clData : resultData.values()) {
167 2 1. clearResultData : removed call to org/jocl/CL::clReleaseMemObject → NO_COVERAGE
2. clearResultData : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE
			CL.clReleaseMemObject(clData.clMem());
168
		}
169
170 1 1. clearResultData : removed call to java/util/Map::clear → NO_COVERAGE
		resultData.clear();
171
	}
172
173
	protected void prepareStaticData(final OpenCLExecutionContext openCLExecutionContext,
174
			final StageDescriptor stageDescriptor) {
175
		Validate.notNull(openCLExecutionContext);
176
		Validate.notNull(stageDescriptor);
177
178 1 1. prepareStaticData : removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE
		final var device = openCLExecutionContext.device();
179
180
		logger.trace("[{}] Preparing static data", device.name());
181
182 1 1. prepareStaticData : removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::kernels → NO_COVERAGE
		final var kernels = openCLExecutionContext.kernels();
183 1 1. prepareStaticData : removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::kernelName → NO_COVERAGE
		final var kernelName = stageDescriptor.kernelName();
184
185 2 1. prepareStaticData : removed call to java/util/Map::get → NO_COVERAGE
2. prepareStaticData : replaced call to java/util/Map::get with argument → NO_COVERAGE
		final var kernel = kernels.get(kernelName);
186
187 1 1. prepareStaticData : removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::mapStaticDataAsArgument → NO_COVERAGE
		final var mapStaticDataAsArgument = stageDescriptor.mapStaticDataAsArgument();
188 1 1. prepareStaticData : removed call to java/util/Map::entrySet → NO_COVERAGE
		for (final var entry : mapStaticDataAsArgument.entrySet()) {
189 1 1. prepareStaticData : removed call to java/util/Map$Entry::getKey → NO_COVERAGE
			final var argumentName = entry.getKey();
190 1 1. prepareStaticData : removed call to java/util/Map$Entry::getValue → NO_COVERAGE
			final var argumentIndex = entry.getValue();
191
192 2 1. prepareStaticData : removed call to java/util/Map::get → NO_COVERAGE
2. prepareStaticData : replaced call to java/util/Map::get with argument → NO_COVERAGE
			final var staticDataMap = staticData.get(device);
193
194 4 1. prepareStaticData : removed call to java/util/Map::containsKey → NO_COVERAGE
2. prepareStaticData : negated conditional → NO_COVERAGE
3. prepareStaticData : removed conditional - replaced equality check with false → NO_COVERAGE
4. prepareStaticData : removed conditional - replaced equality check with true → NO_COVERAGE
			if (staticDataMap.containsKey(argumentName) == false) {
195 1 1. prepareStaticData : removed call to java/lang/IllegalArgumentException::<init> → NO_COVERAGE
				throw new IllegalArgumentException("Unknown static argument " + argumentName);
196
			}
197
198 2 1. prepareStaticData : replaced call to java/util/Map::get with argument → NO_COVERAGE
2. prepareStaticData : removed call to java/util/Map::get → NO_COVERAGE
			final CLData clStaticData = staticDataMap.get(argumentName);
199
200
			logger.trace("[{}] Index {} - Loading static data with name {}", device.name(), argumentIndex, argumentName);
201
202 5 1. prepareStaticData : removed call to org/jocl/Pointer::to → NO_COVERAGE
2. prepareStaticData : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE
3. prepareStaticData : removed call to org/jocl/CL::clSetKernelArg → NO_COVERAGE
4. prepareStaticData : replaced call to org/jocl/CL::clSetKernelArg with argument → NO_COVERAGE
5. prepareStaticData : removed call to java/lang/Integer::intValue → NO_COVERAGE
			CL.clSetKernelArg(kernel, argumentIndex, Sizeof.cl_mem, Pointer.to(clStaticData.clMem()));
203
		}
204
	}
205
206
	private void allocateLocalMemory(OpenCLExecutionContext openCLExecutionContext, StageDescriptor stageDescriptor,
207
			long generation, List<Genotype> genotypes, final KernelExecutionContext kernelExecutionContext) {
208
		Validate.notNull(openCLExecutionContext);
209
		Validate.notNull(stageDescriptor);
210
		Validate.notNull(kernelExecutionContext);
211
212 1 1. allocateLocalMemory : removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE
		final var device = openCLExecutionContext.device();
213
214
		logger.trace("[{}] Allocating local memory", device.name());
215
216 1 1. allocateLocalMemory : removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::kernels → NO_COVERAGE
		final var kernels = openCLExecutionContext.kernels();
217 1 1. allocateLocalMemory : removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::kernelName → NO_COVERAGE
		final var kernelName = stageDescriptor.kernelName();
218
219 2 1. allocateLocalMemory : replaced call to java/util/Map::get with argument → NO_COVERAGE
2. allocateLocalMemory : removed call to java/util/Map::get → NO_COVERAGE
		final var kernel = kernels.get(kernelName);
220
221 1 1. allocateLocalMemory : removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::localMemoryAllocators → NO_COVERAGE
		final var localMemoryAllocators = stageDescriptor.localMemoryAllocators();
222 4 1. allocateLocalMemory : removed conditional - replaced equality check with false → NO_COVERAGE
2. allocateLocalMemory : removed call to org/apache/commons/collections4/MapUtils::isNotEmpty → NO_COVERAGE
3. allocateLocalMemory : negated conditional → NO_COVERAGE
4. allocateLocalMemory : removed conditional - replaced equality check with true → NO_COVERAGE
		if (MapUtils.isNotEmpty(localMemoryAllocators)) {
223 1 1. allocateLocalMemory : removed call to java/util/Map::entrySet → NO_COVERAGE
			for (final var entry : localMemoryAllocators.entrySet()) {
224 2 1. allocateLocalMemory : removed call to java/util/Map$Entry::getKey → NO_COVERAGE
2. allocateLocalMemory : removed call to java/lang/Integer::intValue → NO_COVERAGE
				final int argumentIdx = entry.getKey();
225 1 1. allocateLocalMemory : removed call to java/util/Map$Entry::getValue → NO_COVERAGE
				final var localMemoryAllocator = entry.getValue();
226
227
				final var size = localMemoryAllocator
228 2 1. allocateLocalMemory : replaced call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/LocalMemoryAllocator::load with argument → NO_COVERAGE
2. allocateLocalMemory : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/LocalMemoryAllocator::load → NO_COVERAGE
						.load(openCLExecutionContext, kernelExecutionContext, generation, genotypes);
229
				logger.trace("[{}] Index {} - Setting local data with size of {}", device.name(), argumentIdx, size);
230
231 2 1. allocateLocalMemory : replaced call to org/jocl/CL::clSetKernelArg with argument → NO_COVERAGE
2. allocateLocalMemory : removed call to org/jocl/CL::clSetKernelArg → NO_COVERAGE
				CL.clSetKernelArg(kernel, argumentIdx, size, null);
232
			}
233
		}
234
	}
235
236
	protected void loadData(final OpenCLExecutionContext openCLExecutionContext, final StageDescriptor stageDescriptor,
237
			final Map<Integer, CLData> data, final long generation, final List<Genotype> genotypes) {
238
		Validate.notNull(openCLExecutionContext);
239
		Validate.notNull(stageDescriptor);
240
		Validate.notNull(data);
241
242 1 1. loadData : removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE
		final var device = openCLExecutionContext.device();
243
244
		logger.trace("[{}] Loading data", device.name());
245
246 1 1. loadData : removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::kernels → NO_COVERAGE
		final var kernels = openCLExecutionContext.kernels();
247 1 1. loadData : removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::kernelName → NO_COVERAGE
		final var kernelName = stageDescriptor.kernelName();
248
249 2 1. loadData : removed call to java/util/Map::get → NO_COVERAGE
2. loadData : replaced call to java/util/Map::get with argument → NO_COVERAGE
		final var kernel = kernels.get(kernelName);
250
251 1 1. loadData : removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::dataLoaders → NO_COVERAGE
		final var dataLoaders = stageDescriptor.dataLoaders();
252 4 1. loadData : removed conditional - replaced equality check with false → NO_COVERAGE
2. loadData : negated conditional → NO_COVERAGE
3. loadData : removed conditional - replaced equality check with true → NO_COVERAGE
4. loadData : removed call to org/apache/commons/collections4/MapUtils::isNotEmpty → NO_COVERAGE
		if (MapUtils.isNotEmpty(dataLoaders)) {
253 1 1. loadData : removed call to java/util/Map::entrySet → NO_COVERAGE
			for (final var entry : dataLoaders.entrySet()) {
254 2 1. loadData : removed call to java/lang/Integer::intValue → NO_COVERAGE
2. loadData : removed call to java/util/Map$Entry::getKey → NO_COVERAGE
				final int argumentIdx = entry.getKey();
255 1 1. loadData : removed call to java/util/Map$Entry::getValue → NO_COVERAGE
				final var dataLoader = entry.getValue();
256
257 1 1. loadData : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/DataLoader::load → NO_COVERAGE
				final var clDdata = dataLoader.load(openCLExecutionContext, generation, genotypes);
258
259 6 1. loadData : negated conditional → NO_COVERAGE
2. loadData : removed call to java/lang/Integer::valueOf → NO_COVERAGE
3. loadData : removed call to java/util/Map::put → NO_COVERAGE
4. loadData : replaced call to java/util/Map::put with argument → NO_COVERAGE
5. loadData : removed conditional - replaced equality check with true → NO_COVERAGE
6. loadData : removed conditional - replaced equality check with false → NO_COVERAGE
				if (data.put(argumentIdx, clDdata) != null) {
260 1 1. loadData : removed call to java/lang/IllegalArgumentException::<init> → NO_COVERAGE
					throw new IllegalArgumentException("Multiple data configured for index " + argumentIdx);
261
				}
262
				logger.trace("[{}] Index {} - Loading data of size {}", device.name(), argumentIdx, clDdata.size());
263
264 4 1. loadData : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE
2. loadData : removed call to org/jocl/Pointer::to → NO_COVERAGE
3. loadData : removed call to org/jocl/CL::clSetKernelArg → NO_COVERAGE
4. loadData : replaced call to org/jocl/CL::clSetKernelArg with argument → NO_COVERAGE
				CL.clSetKernelArg(kernel, argumentIdx, Sizeof.cl_mem, Pointer.to(clDdata.clMem()));
265
			}
266
		}
267
	}
268
269
	@Override
270
	public void beforeAllEvaluations(final OpenCLExecutionContext openCLExecutionContext,
271
			final ExecutorService executorService) {
272 1 1. beforeAllEvaluations : removed call to net/bmahe/genetics4j/gpu/spec/fitness/OpenCLFitness::beforeAllEvaluations → NO_COVERAGE
		super.beforeAllEvaluations(openCLExecutionContext, executorService);
273
274 1 1. beforeAllEvaluations : removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE
		final var device = openCLExecutionContext.device();
275
276
		logger.trace("[{}] Loading static data", device.name());
277 1 1. beforeAllEvaluations : removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::clearStaticData → NO_COVERAGE
		clearStaticData(device);
278
279 1 1. beforeAllEvaluations : removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/MultiStageDescriptor::staticDataLoaders → NO_COVERAGE
		final var staticDataLoaders = multiStageDescriptor.staticDataLoaders();
280 1 1. beforeAllEvaluations : removed call to java/util/Map::entrySet → NO_COVERAGE
		for (final var entry : staticDataLoaders.entrySet()) {
281 1 1. beforeAllEvaluations : removed call to java/util/Map$Entry::getKey → NO_COVERAGE
			final String argumentName = entry.getKey();
282 1 1. beforeAllEvaluations : removed call to java/util/Map$Entry::getValue → NO_COVERAGE
			final var dataSupplier = entry.getValue();
283
284
			if (logger.isTraceEnabled()) {
285 1 1. beforeAllEvaluations : removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE
				final var deviceName = openCLExecutionContext.device()
286 1 1. beforeAllEvaluations : removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE
						.name();
287
				logger.trace("[{}] Loading static data for entry name {}", deviceName, argumentName);
288
			}
289 1 1. beforeAllEvaluations : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/StaticDataLoader::load → NO_COVERAGE
			final CLData clData = dataSupplier.load(openCLExecutionContext);
290
291 4 1. beforeAllEvaluations : removed call to java/util/Map::computeIfAbsent → NO_COVERAGE
2. beforeAllEvaluations : replaced call to java/util/Map::computeIfAbsent with argument → NO_COVERAGE
3. lambda$beforeAllEvaluations$0 : replaced return value with Collections.emptyMap for net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::lambda$beforeAllEvaluations$0 → NO_COVERAGE
4. lambda$beforeAllEvaluations$0 : removed call to java/util/HashMap::<init> → NO_COVERAGE
			final var mapData = staticData.computeIfAbsent(device, k -> new HashMap<>());
292 5 1. beforeAllEvaluations : negated conditional → NO_COVERAGE
2. beforeAllEvaluations : removed conditional - replaced equality check with true → NO_COVERAGE
3. beforeAllEvaluations : removed conditional - replaced equality check with false → NO_COVERAGE
4. beforeAllEvaluations : removed call to java/util/Map::put → NO_COVERAGE
5. beforeAllEvaluations : replaced call to java/util/Map::put with argument → NO_COVERAGE
			if (mapData.put(argumentName, clData) != null) {
293 1 1. beforeAllEvaluations : removed call to java/lang/IllegalArgumentException::<init> → NO_COVERAGE
				throw new IllegalArgumentException("Multiple data configured with name " + argumentName);
294
			}
295
		}
296
	}
297
298
	/**
299
	 * Constructs a MultiStageFitness with the specified stage descriptor and fitness extractor.
300
	 * 
301
	 * @param _multiStageDescriptor configuration for multi-stage kernel execution and data management
302
	 * @param _fitnessExtractor     function to extract fitness values from final stage results
303
	 * @throws IllegalArgumentException if any parameter is null
304
	 */
305
	public MultiStageFitness(final MultiStageDescriptor _multiStageDescriptor,
306
			final FitnessExtractor<T> _fitnessExtractor) {
307
		Validate.notNull(_multiStageDescriptor);
308
		Validate.notNull(_fitnessExtractor);
309
310 1 1. <init> : Removed assignment to member variable multiStageDescriptor → NO_COVERAGE
		this.multiStageDescriptor = _multiStageDescriptor;
311 1 1. <init> : Removed assignment to member variable fitnessExtractor → NO_COVERAGE
		this.fitnessExtractor = _fitnessExtractor;
312
	}
313
314
	@Override
315
	public CompletableFuture<List<T>> compute(final OpenCLExecutionContext openCLExecutionContext,
316
			final ExecutorService executorService, final long generation, final List<Genotype> genotypes) {
317
		Validate.notNull(openCLExecutionContext);
318
319 2 1. compute : removed call to java/util/concurrent/CompletableFuture::supplyAsync → NO_COVERAGE
2. compute : replaced return value with null for net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::compute → NO_COVERAGE
		return CompletableFuture.supplyAsync(() -> {
320
321
			List<T> finalResults = null;
322
323 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE
			final var device = openCLExecutionContext.device();
324
325 1 1. lambda$compute$1 : removed call to java/util/concurrent/ConcurrentHashMap::<init> → NO_COVERAGE
			final Map<Integer, CLData> data = new ConcurrentHashMap<>();
326 1 1. lambda$compute$1 : removed call to java/util/concurrent/ConcurrentHashMap::<init> → NO_COVERAGE
			Map<Integer, CLData> resultData = new ConcurrentHashMap<>();
327
328 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/MultiStageDescriptor::stageDescriptors → NO_COVERAGE
			final var stageDescriptors = multiStageDescriptor.stageDescriptors();
329 6 1. lambda$compute$1 : removed call to java/util/List::size → NO_COVERAGE
2. lambda$compute$1 : removed conditional - replaced comparison check with true → NO_COVERAGE
3. lambda$compute$1 : negated conditional → NO_COVERAGE
4. lambda$compute$1 : changed conditional boundary → NO_COVERAGE
5. lambda$compute$1 : removed conditional - replaced comparison check with false → NO_COVERAGE
6. lambda$compute$1 : Substituted 0 with 1 → NO_COVERAGE
			for (int i = 0; i < stageDescriptors.size(); i++) {
330 1 1. lambda$compute$1 : removed call to java/util/List::get → NO_COVERAGE
				final StageDescriptor stageDescriptor = stageDescriptors.get(i);
331 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::kernels → NO_COVERAGE
				final var kernels = openCLExecutionContext.kernels();
332 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::kernelName → NO_COVERAGE
				final var kernelName = stageDescriptor.kernelName();
333
334 2 1. lambda$compute$1 : removed call to java/util/Map::get → NO_COVERAGE
2. lambda$compute$1 : replaced call to java/util/Map::get with argument → NO_COVERAGE
				final var kernel = kernels.get(kernelName);
335
336
				logger.debug("[{}] Executing {}-th stage for kernel {}", device.name(), i, kernelName);
337
338
				/**
339
				 * Compute the Kernel Execution Context
340
				 */
341 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::kernelExecutionContextComputer → NO_COVERAGE
				final var kernelExecutionContextComputer = stageDescriptor.kernelExecutionContextComputer();
342
				final var kernelExecutionContext = kernelExecutionContextComputer
343 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/kernelcontext/KernelExecutionContextComputer::compute → NO_COVERAGE
						.compute(openCLExecutionContext, kernelName, generation, genotypes);
344
345
				/**
346
				 * Map previous results to new arguments
347
				 */
348 1 1. lambda$compute$1 : removed call to java/util/HashMap::<init> → NO_COVERAGE
				final Map<Integer, CLData> oldResultData = new HashMap<>(resultData);
349 1 1. lambda$compute$1 : removed call to java/util/concurrent/ConcurrentHashMap::<init> → NO_COVERAGE
				resultData = new ConcurrentHashMap<>();
350
				final Map<Integer, Integer> reusePreviousResultSizeAsArguments = stageDescriptor
351 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::reusePreviousResultSizeAsArguments → NO_COVERAGE
						.reusePreviousResultSizeAsArguments();
352
				final Map<Integer, Integer> reusePreviousResultAsArguments = stageDescriptor
353 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::reusePreviousResultAsArguments → NO_COVERAGE
						.reusePreviousResultAsArguments();
354 1 1. lambda$compute$1 : removed call to java/util/HashSet::<init> → NO_COVERAGE
				final Set<CLData> reusedArguments = new HashSet<>();
355 4 1. lambda$compute$1 : removed conditional - replaced equality check with true → NO_COVERAGE
2. lambda$compute$1 : removed conditional - replaced equality check with false → NO_COVERAGE
3. lambda$compute$1 : negated conditional → NO_COVERAGE
4. lambda$compute$1 : removed call to org/apache/commons/collections4/MapUtils::isNotEmpty → NO_COVERAGE
				if (MapUtils.isNotEmpty(reusePreviousResultAsArguments)
356 4 1. lambda$compute$1 : removed call to org/apache/commons/collections4/MapUtils::isNotEmpty → NO_COVERAGE
2. lambda$compute$1 : negated conditional → NO_COVERAGE
3. lambda$compute$1 : removed conditional - replaced equality check with false → NO_COVERAGE
4. lambda$compute$1 : removed conditional - replaced equality check with true → NO_COVERAGE
						|| MapUtils.isNotEmpty(reusePreviousResultSizeAsArguments)) {
357
358 4 1. lambda$compute$1 : removed conditional - replaced equality check with true → NO_COVERAGE
2. lambda$compute$1 : removed conditional - replaced equality check with false → NO_COVERAGE
3. lambda$compute$1 : removed call to org/apache/commons/collections4/MapUtils::isNotEmpty → NO_COVERAGE
4. lambda$compute$1 : negated conditional → NO_COVERAGE
					if (MapUtils.isNotEmpty(reusePreviousResultAsArguments)) {
359 1 1. lambda$compute$1 : removed call to java/util/Map::entrySet → NO_COVERAGE
						for (final Entry<Integer, Integer> entry : reusePreviousResultAsArguments.entrySet()) {
360 1 1. lambda$compute$1 : removed call to java/util/Map$Entry::getKey → NO_COVERAGE
							final var oldKeyArgument = entry.getKey();
361 1 1. lambda$compute$1 : removed call to java/util/Map$Entry::getValue → NO_COVERAGE
							final var newKeyArgument = entry.getValue();
362
363 2 1. lambda$compute$1 : removed call to java/util/Map::get → NO_COVERAGE
2. lambda$compute$1 : replaced call to java/util/Map::get with argument → NO_COVERAGE
							final var previousResultData = oldResultData.get(oldKeyArgument);
364 3 1. lambda$compute$1 : removed conditional - replaced equality check with false → NO_COVERAGE
2. lambda$compute$1 : removed conditional - replaced equality check with true → NO_COVERAGE
3. lambda$compute$1 : negated conditional → NO_COVERAGE
							if (previousResultData == null) {
365
								logger.error(
366
										"[{}] Could not find previous argument with index {}. Known previous arguments: {}",
367 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE
										device.name(),
368
										oldKeyArgument,
369
										oldResultData);
370
371 1 1. lambda$compute$1 : removed call to java/lang/IllegalArgumentException::<init> → NO_COVERAGE
								throw new IllegalArgumentException(
372
										"Could not find previous argument with index " + oldKeyArgument);
373
							}
374
375
							logger.trace("[{}] Index {} - Reuse previous result that had index {}",
376 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE
									device.name(),
377
									newKeyArgument,
378
									oldKeyArgument);
379 5 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE
2. lambda$compute$1 : removed call to org/jocl/Pointer::to → NO_COVERAGE
3. lambda$compute$1 : removed call to java/lang/Integer::intValue → NO_COVERAGE
4. lambda$compute$1 : replaced call to org/jocl/CL::clSetKernelArg with argument → NO_COVERAGE
5. lambda$compute$1 : removed call to org/jocl/CL::clSetKernelArg → NO_COVERAGE
							CL.clSetKernelArg(kernel, newKeyArgument, Sizeof.cl_mem, Pointer.to(previousResultData.clMem()));
380 1 1. lambda$compute$1 : removed call to java/util/Set::add → NO_COVERAGE
							reusedArguments.add(previousResultData);
381
						}
382
					}
383
384 4 1. lambda$compute$1 : removed conditional - replaced equality check with false → NO_COVERAGE
2. lambda$compute$1 : removed conditional - replaced equality check with true → NO_COVERAGE
3. lambda$compute$1 : negated conditional → NO_COVERAGE
4. lambda$compute$1 : removed call to org/apache/commons/collections4/MapUtils::isNotEmpty → NO_COVERAGE
					if (MapUtils.isNotEmpty(reusePreviousResultSizeAsArguments)) {
385 1 1. lambda$compute$1 : removed call to java/util/Map::entrySet → NO_COVERAGE
						for (final Entry<Integer, Integer> entry : reusePreviousResultSizeAsArguments.entrySet()) {
386 1 1. lambda$compute$1 : removed call to java/util/Map$Entry::getKey → NO_COVERAGE
							final var oldKeyArgument = entry.getKey();
387 1 1. lambda$compute$1 : removed call to java/util/Map$Entry::getValue → NO_COVERAGE
							final var newKeyArgument = entry.getValue();
388
389 2 1. lambda$compute$1 : removed call to java/util/Map::get → NO_COVERAGE
2. lambda$compute$1 : replaced call to java/util/Map::get with argument → NO_COVERAGE
							final var previousResultData = oldResultData.get(oldKeyArgument);
390 3 1. lambda$compute$1 : removed conditional - replaced equality check with true → NO_COVERAGE
2. lambda$compute$1 : removed conditional - replaced equality check with false → NO_COVERAGE
3. lambda$compute$1 : negated conditional → NO_COVERAGE
							if (previousResultData == null) {
391
								logger.error(
392
										"[{}] Could not find previous argument with index {}. Known previous arguments: {}",
393 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE
										device.name(),
394
										oldKeyArgument,
395
										oldResultData);
396
397 1 1. lambda$compute$1 : removed call to java/lang/IllegalArgumentException::<init> → NO_COVERAGE
								throw new IllegalArgumentException(
398
										"Could not find previous argument with index " + oldKeyArgument);
399
							}
400
401
							if (logger.isTraceEnabled()) {
402
								logger.trace("[{}] Index {} - Setting previous result size of {} of previous argument index {}",
403 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE
										device.name(),
404
										newKeyArgument,
405 2 1. lambda$compute$1 : removed call to java/lang/Integer::valueOf → NO_COVERAGE
2. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::size → NO_COVERAGE
										previousResultData.size(),
406
										oldKeyArgument);
407
							}
408
409 2 1. lambda$compute$1 : replaced call to org/jocl/CL::clSetKernelArg with argument → NO_COVERAGE
2. lambda$compute$1 : removed call to org/jocl/CL::clSetKernelArg → NO_COVERAGE
							CL.clSetKernelArg(kernel,
410 4 1. lambda$compute$1 : Substituted 0 with 1 → NO_COVERAGE
2. lambda$compute$1 : removed call to java/lang/Integer::intValue → NO_COVERAGE
3. lambda$compute$1 : Substituted 4 with 5 → NO_COVERAGE
4. lambda$compute$1 : Substituted 1 with 0 → NO_COVERAGE
									newKeyArgument,
411
									Sizeof.cl_int,
412 2 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::size → NO_COVERAGE
2. lambda$compute$1 : removed call to org/jocl/Pointer::to → NO_COVERAGE
									Pointer.to(new int[] { previousResultData.size() }));
413
						}
414
					}
415
416
					// Clean up unused results
417 1 1. lambda$compute$1 : removed call to java/util/Map::keySet → NO_COVERAGE
					final var previousResultsToKeep = reusePreviousResultAsArguments.keySet();
418 1 1. lambda$compute$1 : removed call to java/util/Map::entrySet → NO_COVERAGE
					for (Entry<Integer, CLData> entry2 : oldResultData.entrySet()) {
419 5 1. lambda$compute$1 : removed conditional - replaced equality check with true → NO_COVERAGE
2. lambda$compute$1 : removed conditional - replaced equality check with false → NO_COVERAGE
3. lambda$compute$1 : negated conditional → NO_COVERAGE
4. lambda$compute$1 : removed call to java/util/Map$Entry::getKey → NO_COVERAGE
5. lambda$compute$1 : removed call to java/util/Set::contains → NO_COVERAGE
						if (previousResultsToKeep.contains(entry2.getKey()) == false) {
420 2 1. lambda$compute$1 : removed call to org/jocl/CL::clReleaseMemObject → NO_COVERAGE
2. lambda$compute$1 : removed call to java/util/Map$Entry::getValue → NO_COVERAGE
							CL.clReleaseMemObject(entry2.getValue()
421 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE
									.clMem());
422
						}
423
					}
424
				}
425
426 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::prepareStaticData → NO_COVERAGE
				prepareStaticData(openCLExecutionContext, stageDescriptor);
427 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::loadData → NO_COVERAGE
				loadData(openCLExecutionContext, stageDescriptor, data, generation, genotypes);
428 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::allocateLocalMemory → NO_COVERAGE
				allocateLocalMemory(openCLExecutionContext, stageDescriptor, generation, genotypes, kernelExecutionContext);
429
430
				/**
431
				 * Allocate memory for results
432
				 */
433 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::resultAllocators → NO_COVERAGE
				final var resultAllocators = stageDescriptor.resultAllocators();
434 4 1. lambda$compute$1 : removed conditional - replaced equality check with false → NO_COVERAGE
2. lambda$compute$1 : removed call to org/apache/commons/collections4/MapUtils::isNotEmpty → NO_COVERAGE
3. lambda$compute$1 : removed conditional - replaced equality check with true → NO_COVERAGE
4. lambda$compute$1 : negated conditional → NO_COVERAGE
				if (MapUtils.isNotEmpty(resultAllocators)) {
435
					logger.trace("[{}] Result allocators: {}", device.name(), resultAllocators);
436
437 1 1. lambda$compute$1 : removed call to java/util/Map::entrySet → NO_COVERAGE
					for (final var entry : resultAllocators.entrySet()) {
438 2 1. lambda$compute$1 : removed call to java/util/Map$Entry::getKey → NO_COVERAGE
2. lambda$compute$1 : removed call to java/lang/Integer::intValue → NO_COVERAGE
						final int argumentIdx = entry.getKey();
439 1 1. lambda$compute$1 : removed call to java/util/Map$Entry::getValue → NO_COVERAGE
						final var resultAllocator = entry.getValue();
440
441
						final var clDdata = resultAllocator
442 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/ResultAllocator::load → NO_COVERAGE
								.load(openCLExecutionContext, kernelExecutionContext, generation, genotypes);
443
444 6 1. lambda$compute$1 : removed call to java/lang/Integer::valueOf → NO_COVERAGE
2. lambda$compute$1 : replaced call to java/util/Map::put with argument → NO_COVERAGE
3. lambda$compute$1 : removed call to java/util/Map::put → NO_COVERAGE
4. lambda$compute$1 : negated conditional → NO_COVERAGE
5. lambda$compute$1 : removed conditional - replaced equality check with true → NO_COVERAGE
6. lambda$compute$1 : removed conditional - replaced equality check with false → NO_COVERAGE
						if (resultData.put(argumentIdx, clDdata) != null) {
445 1 1. lambda$compute$1 : removed call to java/lang/IllegalArgumentException::<init> → NO_COVERAGE
							throw new IllegalArgumentException(
446
									"Multiple result allocators configured for index " + argumentIdx);
447
						}
448
						if (logger.isTraceEnabled()) {
449
							logger.trace("[{}] Index {} - Allocate result data memory of type {} and size {}",
450 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE
									device.name(),
451 1 1. lambda$compute$1 : removed call to java/lang/Integer::valueOf → NO_COVERAGE
									argumentIdx,
452 2 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clType → NO_COVERAGE
2. lambda$compute$1 : removed call to java/lang/Integer::valueOf → NO_COVERAGE
									clDdata.clType(),
453 2 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::size → NO_COVERAGE
2. lambda$compute$1 : removed call to java/lang/Integer::valueOf → NO_COVERAGE
									clDdata.size());
454
						}
455
456 4 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE
2. lambda$compute$1 : removed call to org/jocl/Pointer::to → NO_COVERAGE
3. lambda$compute$1 : replaced call to org/jocl/CL::clSetKernelArg with argument → NO_COVERAGE
4. lambda$compute$1 : removed call to org/jocl/CL::clSetKernelArg → NO_COVERAGE
						CL.clSetKernelArg(kernel, argumentIdx, Sizeof.cl_mem, Pointer.to(clDdata.clMem()));
457
					}
458
				} else {
459
					logger.trace("[{}] No result allocator found", device.name());
460
				}
461
462 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::clCommandQueue → NO_COVERAGE
				final var clCommandQueue = openCLExecutionContext.clCommandQueue();
463 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/kernelcontext/KernelExecutionContext::globalWorkDimensions → NO_COVERAGE
				final var globalWorkDimensions = kernelExecutionContext.globalWorkDimensions();
464 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/kernelcontext/KernelExecutionContext::globalWorkSize → NO_COVERAGE
				final var globalWorkSize = kernelExecutionContext.globalWorkSize();
465 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/kernelcontext/KernelExecutionContext::workGroupSize → NO_COVERAGE
				final long[] workGroupSize = kernelExecutionContext.workGroupSize()
466 2 1. lambda$compute$1 : removed call to java/util/Optional::orElse → NO_COVERAGE
2. lambda$compute$1 : replaced call to java/util/Optional::orElse with argument → NO_COVERAGE
						.orElse(null);
467
468
				logger.trace(
469
						"[{}] Starting computation on kernel {} for {} genotypes and global work size {} and local work size {}",
470 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE
						device.name(),
471
						kernelName,
472 2 1. lambda$compute$1 : removed call to java/util/List::size → NO_COVERAGE
2. lambda$compute$1 : removed call to java/lang/Integer::valueOf → NO_COVERAGE
						genotypes.size(),
473
						globalWorkSize,
474
						workGroupSize);
475
				try {
476 1 1. lambda$compute$1 : removed call to java/lang/System::nanoTime → NO_COVERAGE
					final long startTime = System.nanoTime();
477 3 1. lambda$compute$1 : removed call to org/jocl/CL::clEnqueueNDRangeKernel → NO_COVERAGE
2. lambda$compute$1 : Substituted 0 with 1 → NO_COVERAGE
3. lambda$compute$1 : replaced call to org/jocl/CL::clEnqueueNDRangeKernel with argument → NO_COVERAGE
					CL.clEnqueueNDRangeKernel(clCommandQueue,
478
							kernel,
479
							globalWorkDimensions,
480
							null,
481
							globalWorkSize,
482
							workGroupSize,
483
							0,
484
							null,
485
							null);
486
487
					// CL.clFinish(openCLExecutionContext.clCommandQueue());
488
489 1 1. lambda$compute$1 : removed call to java/lang/System::nanoTime → NO_COVERAGE
					final long endTime = System.nanoTime();
490 1 1. lambda$compute$1 : Replaced long subtraction with addition → NO_COVERAGE
					final long duration = endTime - startTime;
491
					if (logger.isDebugEnabled()) {
492 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE
						final var deviceName = openCLExecutionContext.device()
493 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE
								.name();
494
						logger.debug("[{}] -  Stage {} - Took {} microsec for {} genotypes",
495
								deviceName,
496 3 1. lambda$compute$1 : removed call to java/lang/Integer::valueOf → NO_COVERAGE
2. lambda$compute$1 : Replaced double division with multiplication → NO_COVERAGE
3. lambda$compute$1 : Substituted 1000.0 with 1.0 → NO_COVERAGE
								i,
497 1 1. lambda$compute$1 : removed call to java/lang/Double::valueOf → NO_COVERAGE
								duration / 1000.,
498 2 1. lambda$compute$1 : removed call to java/util/List::size → NO_COVERAGE
2. lambda$compute$1 : removed call to java/lang/Integer::valueOf → NO_COVERAGE
								genotypes.size());
499
					}
500
				} catch (Exception e) {
501
					logger.error("[{}] Failure to compute", device.name(), e);
502
					throw e;
503
				}
504
505 6 1. lambda$compute$1 : removed conditional - replaced equality check with false → NO_COVERAGE
2. lambda$compute$1 : removed call to java/util/List::size → NO_COVERAGE
3. lambda$compute$1 : removed conditional - replaced equality check with true → NO_COVERAGE
4. lambda$compute$1 : Substituted 1 with 0 → NO_COVERAGE
5. lambda$compute$1 : negated conditional → NO_COVERAGE
6. lambda$compute$1 : Replaced integer subtraction with addition → NO_COVERAGE
				if (i == stageDescriptors.size() - 1) {
506 2 1. lambda$compute$1 : replaced call to net/bmahe/genetics4j/gpu/spec/fitness/FitnessExtractor::compute with argument → NO_COVERAGE
2. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/FitnessExtractor::compute → NO_COVERAGE
					finalResults = fitnessExtractor.compute(openCLExecutionContext,
507
							kernelExecutionContext,
508
							executorService,
509
							generation,
510
							genotypes,
511 2 1. lambda$compute$1 : removed call to java/util/Map::of → NO_COVERAGE
2. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/ResultExtractor::<init> → NO_COVERAGE
							new ResultExtractor(Map.of(device, resultData)));
512
513 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::clearResultData → NO_COVERAGE
					clearResultData(resultData);
514
				}
515
516
				for (final CLData clData : reusedArguments) {
517 2 1. lambda$compute$1 : removed call to org/jocl/CL::clReleaseMemObject → NO_COVERAGE
2. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE
					CL.clReleaseMemObject(clData.clMem());
518
				}
519 1 1. lambda$compute$1 : removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::clearData → NO_COVERAGE
				clearData(data);
520
			}
521
522 3 1. lambda$compute$1 : removed conditional - replaced equality check with false → NO_COVERAGE
2. lambda$compute$1 : removed conditional - replaced equality check with true → NO_COVERAGE
3. lambda$compute$1 : negated conditional → NO_COVERAGE
			if (finalResults == null) {
523 1 1. lambda$compute$1 : removed call to java/lang/IllegalStateException::<init> → NO_COVERAGE
				throw new IllegalStateException("final results cannot be null");
524
			}
525 1 1. lambda$compute$1 : replaced return value with Collections.emptyList for net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::lambda$compute$1 → NO_COVERAGE
			return finalResults;
526
		}, executorService);
527
	}
528
529
	@Override
530
	public void afterEvaluation(OpenCLExecutionContext openCLExecutionContext, ExecutorService executorService,
531
			long generation, List<Genotype> genotypes) {
532 1 1. afterEvaluation : removed call to net/bmahe/genetics4j/gpu/spec/fitness/OpenCLFitness::afterEvaluation → NO_COVERAGE
		super.afterEvaluation(openCLExecutionContext, executorService, generation, genotypes);
533
534 1 1. afterEvaluation : removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE
		final var device = openCLExecutionContext.device();
535
		logger.trace("[{}] Releasing data", device.name());
536
	}
537
538
	@Override
539
	public void afterAllEvaluations(final OpenCLExecutionContext openCLExecutionContext,
540
			final ExecutorService executorService) {
541 1 1. afterAllEvaluations : removed call to net/bmahe/genetics4j/gpu/spec/fitness/OpenCLFitness::afterAllEvaluations → NO_COVERAGE
		super.afterAllEvaluations(openCLExecutionContext, executorService);
542
543 1 1. afterAllEvaluations : removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE
		final var device = openCLExecutionContext.device();
544
		logger.trace("[{}] Releasing static data", device.name());
545 1 1. afterAllEvaluations : removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::clearStaticData → NO_COVERAGE
		clearStaticData(device);
546
	}
547
548
	/**
549
	 * Creates a new MultiStageFitness instance with the specified configuration.
550
	 * 
551
	 * @param <U>                  the fitness value type
552
	 * @param multiStageDescriptor configuration for multi-stage kernel execution and data management
553
	 * @param fitnessExtractor     function to extract fitness values from final stage results
554
	 * @return a new MultiStageFitness instance
555
	 * @throws IllegalArgumentException if any parameter is null
556
	 */
557
	public static <U extends Comparable<U>> MultiStageFitness<U> of(final MultiStageDescriptor multiStageDescriptor,
558
			final FitnessExtractor<U> fitnessExtractor) {
559
		Validate.notNull(multiStageDescriptor);
560
		Validate.notNull(fitnessExtractor);
561
562 2 1. of : replaced return value with null for net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::of → NO_COVERAGE
2. of : removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::<init> → NO_COVERAGE
		return new MultiStageFitness<>(multiStageDescriptor, fitnessExtractor);
563
	}
564
}

Mutations

133

1.1
Location : <init>
Killed by : none
removed call to java/util/concurrent/ConcurrentHashMap::<init> → NO_COVERAGE

2.2
Location : <init>
Killed by : none
Removed assignment to member variable staticData → NO_COVERAGE

136

1.1
Location : clearStaticData
Killed by : none
removed call to org/apache/commons/collections4/MapUtils::isEmpty → NO_COVERAGE

2.2
Location : clearStaticData
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

3.3
Location : clearStaticData
Killed by : none
removed call to java/util/Map::get → NO_COVERAGE

4.4
Location : clearStaticData
Killed by : none
negated conditional → NO_COVERAGE

5.5
Location : clearStaticData
Killed by : none
replaced call to java/util/Map::get with argument → NO_COVERAGE

6.6
Location : clearStaticData
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

7.7
Location : clearStaticData
Killed by : none
removed call to org/apache/commons/collections4/MapUtils::isEmpty → NO_COVERAGE

8.8
Location : clearStaticData
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

9.9
Location : clearStaticData
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

10.10
Location : clearStaticData
Killed by : none
negated conditional → NO_COVERAGE

140

1.1
Location : clearStaticData
Killed by : none
removed call to java/util/Map::get → NO_COVERAGE

2.2
Location : clearStaticData
Killed by : none
replaced call to java/util/Map::get with argument → NO_COVERAGE

141

1.1
Location : clearStaticData
Killed by : none
removed call to java/util/Map::values → NO_COVERAGE

142

1.1
Location : clearStaticData
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE

2.2
Location : clearStaticData
Killed by : none
removed call to org/jocl/CL::clReleaseMemObject → NO_COVERAGE

145

1.1
Location : clearStaticData
Killed by : none
removed call to java/util/Map::clear → NO_COVERAGE

146

1.1
Location : clearStaticData
Killed by : none
removed call to java/util/Map::remove → NO_COVERAGE

2.2
Location : clearStaticData
Killed by : none
replaced call to java/util/Map::remove with argument → NO_COVERAGE

150

1.1
Location : clearData
Killed by : none
removed call to org/apache/commons/collections4/MapUtils::isEmpty → NO_COVERAGE

2.2
Location : clearData
Killed by : none
negated conditional → NO_COVERAGE

3.3
Location : clearData
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

4.4
Location : clearData
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

154

1.1
Location : clearData
Killed by : none
removed call to java/util/Map::values → NO_COVERAGE

155

1.1
Location : clearData
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE

2.2
Location : clearData
Killed by : none
removed call to org/jocl/CL::clReleaseMemObject → NO_COVERAGE

158

1.1
Location : clearData
Killed by : none
removed call to java/util/Map::clear → NO_COVERAGE

162

1.1
Location : clearResultData
Killed by : none
removed call to org/apache/commons/collections4/MapUtils::isEmpty → NO_COVERAGE

2.2
Location : clearResultData
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

3.3
Location : clearResultData
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

4.4
Location : clearResultData
Killed by : none
negated conditional → NO_COVERAGE

166

1.1
Location : clearResultData
Killed by : none
removed call to java/util/Map::values → NO_COVERAGE

167

1.1
Location : clearResultData
Killed by : none
removed call to org/jocl/CL::clReleaseMemObject → NO_COVERAGE

2.2
Location : clearResultData
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE

170

1.1
Location : clearResultData
Killed by : none
removed call to java/util/Map::clear → NO_COVERAGE

178

1.1
Location : prepareStaticData
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE

182

1.1
Location : prepareStaticData
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::kernels → NO_COVERAGE

183

1.1
Location : prepareStaticData
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::kernelName → NO_COVERAGE

185

1.1
Location : prepareStaticData
Killed by : none
removed call to java/util/Map::get → NO_COVERAGE

2.2
Location : prepareStaticData
Killed by : none
replaced call to java/util/Map::get with argument → NO_COVERAGE

187

1.1
Location : prepareStaticData
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::mapStaticDataAsArgument → NO_COVERAGE

188

1.1
Location : prepareStaticData
Killed by : none
removed call to java/util/Map::entrySet → NO_COVERAGE

189

1.1
Location : prepareStaticData
Killed by : none
removed call to java/util/Map$Entry::getKey → NO_COVERAGE

190

1.1
Location : prepareStaticData
Killed by : none
removed call to java/util/Map$Entry::getValue → NO_COVERAGE

192

1.1
Location : prepareStaticData
Killed by : none
removed call to java/util/Map::get → NO_COVERAGE

2.2
Location : prepareStaticData
Killed by : none
replaced call to java/util/Map::get with argument → NO_COVERAGE

194

1.1
Location : prepareStaticData
Killed by : none
removed call to java/util/Map::containsKey → NO_COVERAGE

2.2
Location : prepareStaticData
Killed by : none
negated conditional → NO_COVERAGE

3.3
Location : prepareStaticData
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

4.4
Location : prepareStaticData
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

195

1.1
Location : prepareStaticData
Killed by : none
removed call to java/lang/IllegalArgumentException::<init> → NO_COVERAGE

198

1.1
Location : prepareStaticData
Killed by : none
replaced call to java/util/Map::get with argument → NO_COVERAGE

2.2
Location : prepareStaticData
Killed by : none
removed call to java/util/Map::get → NO_COVERAGE

202

1.1
Location : prepareStaticData
Killed by : none
removed call to org/jocl/Pointer::to → NO_COVERAGE

2.2
Location : prepareStaticData
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE

3.3
Location : prepareStaticData
Killed by : none
removed call to org/jocl/CL::clSetKernelArg → NO_COVERAGE

4.4
Location : prepareStaticData
Killed by : none
replaced call to org/jocl/CL::clSetKernelArg with argument → NO_COVERAGE

5.5
Location : prepareStaticData
Killed by : none
removed call to java/lang/Integer::intValue → NO_COVERAGE

212

1.1
Location : allocateLocalMemory
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE

216

1.1
Location : allocateLocalMemory
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::kernels → NO_COVERAGE

217

1.1
Location : allocateLocalMemory
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::kernelName → NO_COVERAGE

219

1.1
Location : allocateLocalMemory
Killed by : none
replaced call to java/util/Map::get with argument → NO_COVERAGE

2.2
Location : allocateLocalMemory
Killed by : none
removed call to java/util/Map::get → NO_COVERAGE

221

1.1
Location : allocateLocalMemory
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::localMemoryAllocators → NO_COVERAGE

222

1.1
Location : allocateLocalMemory
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

2.2
Location : allocateLocalMemory
Killed by : none
removed call to org/apache/commons/collections4/MapUtils::isNotEmpty → NO_COVERAGE

3.3
Location : allocateLocalMemory
Killed by : none
negated conditional → NO_COVERAGE

4.4
Location : allocateLocalMemory
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

223

1.1
Location : allocateLocalMemory
Killed by : none
removed call to java/util/Map::entrySet → NO_COVERAGE

224

1.1
Location : allocateLocalMemory
Killed by : none
removed call to java/util/Map$Entry::getKey → NO_COVERAGE

2.2
Location : allocateLocalMemory
Killed by : none
removed call to java/lang/Integer::intValue → NO_COVERAGE

225

1.1
Location : allocateLocalMemory
Killed by : none
removed call to java/util/Map$Entry::getValue → NO_COVERAGE

228

1.1
Location : allocateLocalMemory
Killed by : none
replaced call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/LocalMemoryAllocator::load with argument → NO_COVERAGE

2.2
Location : allocateLocalMemory
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/LocalMemoryAllocator::load → NO_COVERAGE

231

1.1
Location : allocateLocalMemory
Killed by : none
replaced call to org/jocl/CL::clSetKernelArg with argument → NO_COVERAGE

2.2
Location : allocateLocalMemory
Killed by : none
removed call to org/jocl/CL::clSetKernelArg → NO_COVERAGE

242

1.1
Location : loadData
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE

246

1.1
Location : loadData
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::kernels → NO_COVERAGE

247

1.1
Location : loadData
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::kernelName → NO_COVERAGE

249

1.1
Location : loadData
Killed by : none
removed call to java/util/Map::get → NO_COVERAGE

2.2
Location : loadData
Killed by : none
replaced call to java/util/Map::get with argument → NO_COVERAGE

251

1.1
Location : loadData
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::dataLoaders → NO_COVERAGE

252

1.1
Location : loadData
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

2.2
Location : loadData
Killed by : none
negated conditional → NO_COVERAGE

3.3
Location : loadData
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

4.4
Location : loadData
Killed by : none
removed call to org/apache/commons/collections4/MapUtils::isNotEmpty → NO_COVERAGE

253

1.1
Location : loadData
Killed by : none
removed call to java/util/Map::entrySet → NO_COVERAGE

254

1.1
Location : loadData
Killed by : none
removed call to java/lang/Integer::intValue → NO_COVERAGE

2.2
Location : loadData
Killed by : none
removed call to java/util/Map$Entry::getKey → NO_COVERAGE

255

1.1
Location : loadData
Killed by : none
removed call to java/util/Map$Entry::getValue → NO_COVERAGE

257

1.1
Location : loadData
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/DataLoader::load → NO_COVERAGE

259

1.1
Location : loadData
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : loadData
Killed by : none
removed call to java/lang/Integer::valueOf → NO_COVERAGE

3.3
Location : loadData
Killed by : none
removed call to java/util/Map::put → NO_COVERAGE

4.4
Location : loadData
Killed by : none
replaced call to java/util/Map::put with argument → NO_COVERAGE

5.5
Location : loadData
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

6.6
Location : loadData
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

260

1.1
Location : loadData
Killed by : none
removed call to java/lang/IllegalArgumentException::<init> → NO_COVERAGE

264

1.1
Location : loadData
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE

2.2
Location : loadData
Killed by : none
removed call to org/jocl/Pointer::to → NO_COVERAGE

3.3
Location : loadData
Killed by : none
removed call to org/jocl/CL::clSetKernelArg → NO_COVERAGE

4.4
Location : loadData
Killed by : none
replaced call to org/jocl/CL::clSetKernelArg with argument → NO_COVERAGE

272

1.1
Location : beforeAllEvaluations
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/OpenCLFitness::beforeAllEvaluations → NO_COVERAGE

274

1.1
Location : beforeAllEvaluations
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE

277

1.1
Location : beforeAllEvaluations
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::clearStaticData → NO_COVERAGE

279

1.1
Location : beforeAllEvaluations
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/MultiStageDescriptor::staticDataLoaders → NO_COVERAGE

280

1.1
Location : beforeAllEvaluations
Killed by : none
removed call to java/util/Map::entrySet → NO_COVERAGE

281

1.1
Location : beforeAllEvaluations
Killed by : none
removed call to java/util/Map$Entry::getKey → NO_COVERAGE

282

1.1
Location : beforeAllEvaluations
Killed by : none
removed call to java/util/Map$Entry::getValue → NO_COVERAGE

285

1.1
Location : beforeAllEvaluations
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE

286

1.1
Location : beforeAllEvaluations
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE

289

1.1
Location : beforeAllEvaluations
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/StaticDataLoader::load → NO_COVERAGE

291

1.1
Location : beforeAllEvaluations
Killed by : none
removed call to java/util/Map::computeIfAbsent → NO_COVERAGE

2.2
Location : beforeAllEvaluations
Killed by : none
replaced call to java/util/Map::computeIfAbsent with argument → NO_COVERAGE

3.3
Location : lambda$beforeAllEvaluations$0
Killed by : none
replaced return value with Collections.emptyMap for net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::lambda$beforeAllEvaluations$0 → NO_COVERAGE

4.4
Location : lambda$beforeAllEvaluations$0
Killed by : none
removed call to java/util/HashMap::<init> → NO_COVERAGE

292

1.1
Location : beforeAllEvaluations
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : beforeAllEvaluations
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

3.3
Location : beforeAllEvaluations
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

4.4
Location : beforeAllEvaluations
Killed by : none
removed call to java/util/Map::put → NO_COVERAGE

5.5
Location : beforeAllEvaluations
Killed by : none
replaced call to java/util/Map::put with argument → NO_COVERAGE

293

1.1
Location : beforeAllEvaluations
Killed by : none
removed call to java/lang/IllegalArgumentException::<init> → NO_COVERAGE

310

1.1
Location : <init>
Killed by : none
Removed assignment to member variable multiStageDescriptor → NO_COVERAGE

311

1.1
Location : <init>
Killed by : none
Removed assignment to member variable fitnessExtractor → NO_COVERAGE

319

1.1
Location : compute
Killed by : none
removed call to java/util/concurrent/CompletableFuture::supplyAsync → NO_COVERAGE

2.2
Location : compute
Killed by : none
replaced return value with null for net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::compute → NO_COVERAGE

323

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE

325

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/concurrent/ConcurrentHashMap::<init> → NO_COVERAGE

326

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/concurrent/ConcurrentHashMap::<init> → NO_COVERAGE

328

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/MultiStageDescriptor::stageDescriptors → NO_COVERAGE

329

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/List::size → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed conditional - replaced comparison check with true → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
negated conditional → NO_COVERAGE

4.4
Location : lambda$compute$1
Killed by : none
changed conditional boundary → NO_COVERAGE

5.5
Location : lambda$compute$1
Killed by : none
removed conditional - replaced comparison check with false → NO_COVERAGE

6.6
Location : lambda$compute$1
Killed by : none
Substituted 0 with 1 → NO_COVERAGE

330

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/List::get → NO_COVERAGE

331

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::kernels → NO_COVERAGE

332

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::kernelName → NO_COVERAGE

334

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map::get → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
replaced call to java/util/Map::get with argument → NO_COVERAGE

341

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::kernelExecutionContextComputer → NO_COVERAGE

343

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/kernelcontext/KernelExecutionContextComputer::compute → NO_COVERAGE

348

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/HashMap::<init> → NO_COVERAGE

349

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/concurrent/ConcurrentHashMap::<init> → NO_COVERAGE

351

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::reusePreviousResultSizeAsArguments → NO_COVERAGE

353

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::reusePreviousResultAsArguments → NO_COVERAGE

354

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/HashSet::<init> → NO_COVERAGE

355

1.1
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
negated conditional → NO_COVERAGE

4.4
Location : lambda$compute$1
Killed by : none
removed call to org/apache/commons/collections4/MapUtils::isNotEmpty → NO_COVERAGE

356

1.1
Location : lambda$compute$1
Killed by : none
removed call to org/apache/commons/collections4/MapUtils::isNotEmpty → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
negated conditional → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

4.4
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

358

1.1
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
removed call to org/apache/commons/collections4/MapUtils::isNotEmpty → NO_COVERAGE

4.4
Location : lambda$compute$1
Killed by : none
negated conditional → NO_COVERAGE

359

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map::entrySet → NO_COVERAGE

360

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map$Entry::getKey → NO_COVERAGE

361

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map$Entry::getValue → NO_COVERAGE

363

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map::get → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
replaced call to java/util/Map::get with argument → NO_COVERAGE

364

1.1
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
negated conditional → NO_COVERAGE

367

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE

371

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/lang/IllegalArgumentException::<init> → NO_COVERAGE

376

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE

379

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to org/jocl/Pointer::to → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
removed call to java/lang/Integer::intValue → NO_COVERAGE

4.4
Location : lambda$compute$1
Killed by : none
replaced call to org/jocl/CL::clSetKernelArg with argument → NO_COVERAGE

5.5
Location : lambda$compute$1
Killed by : none
removed call to org/jocl/CL::clSetKernelArg → NO_COVERAGE

380

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Set::add → NO_COVERAGE

384

1.1
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
negated conditional → NO_COVERAGE

4.4
Location : lambda$compute$1
Killed by : none
removed call to org/apache/commons/collections4/MapUtils::isNotEmpty → NO_COVERAGE

385

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map::entrySet → NO_COVERAGE

386

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map$Entry::getKey → NO_COVERAGE

387

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map$Entry::getValue → NO_COVERAGE

389

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map::get → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
replaced call to java/util/Map::get with argument → NO_COVERAGE

390

1.1
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
negated conditional → NO_COVERAGE

393

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE

397

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/lang/IllegalArgumentException::<init> → NO_COVERAGE

403

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE

405

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/lang/Integer::valueOf → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::size → NO_COVERAGE

409

1.1
Location : lambda$compute$1
Killed by : none
replaced call to org/jocl/CL::clSetKernelArg with argument → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to org/jocl/CL::clSetKernelArg → NO_COVERAGE

410

1.1
Location : lambda$compute$1
Killed by : none
Substituted 0 with 1 → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to java/lang/Integer::intValue → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
Substituted 4 with 5 → NO_COVERAGE

4.4
Location : lambda$compute$1
Killed by : none
Substituted 1 with 0 → NO_COVERAGE

412

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::size → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to org/jocl/Pointer::to → NO_COVERAGE

417

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map::keySet → NO_COVERAGE

418

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map::entrySet → NO_COVERAGE

419

1.1
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
negated conditional → NO_COVERAGE

4.4
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map$Entry::getKey → NO_COVERAGE

5.5
Location : lambda$compute$1
Killed by : none
removed call to java/util/Set::contains → NO_COVERAGE

420

1.1
Location : lambda$compute$1
Killed by : none
removed call to org/jocl/CL::clReleaseMemObject → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map$Entry::getValue → NO_COVERAGE

421

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE

426

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::prepareStaticData → NO_COVERAGE

427

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::loadData → NO_COVERAGE

428

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::allocateLocalMemory → NO_COVERAGE

433

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/multistage/StageDescriptor::resultAllocators → NO_COVERAGE

434

1.1
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to org/apache/commons/collections4/MapUtils::isNotEmpty → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

4.4
Location : lambda$compute$1
Killed by : none
negated conditional → NO_COVERAGE

437

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map::entrySet → NO_COVERAGE

438

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map$Entry::getKey → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to java/lang/Integer::intValue → NO_COVERAGE

439

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map$Entry::getValue → NO_COVERAGE

442

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/ResultAllocator::load → NO_COVERAGE

444

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/lang/Integer::valueOf → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
replaced call to java/util/Map::put with argument → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map::put → NO_COVERAGE

4.4
Location : lambda$compute$1
Killed by : none
negated conditional → NO_COVERAGE

5.5
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

6.6
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

445

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/lang/IllegalArgumentException::<init> → NO_COVERAGE

450

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE

451

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/lang/Integer::valueOf → NO_COVERAGE

452

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clType → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to java/lang/Integer::valueOf → NO_COVERAGE

453

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::size → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to java/lang/Integer::valueOf → NO_COVERAGE

456

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to org/jocl/Pointer::to → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
replaced call to org/jocl/CL::clSetKernelArg with argument → NO_COVERAGE

4.4
Location : lambda$compute$1
Killed by : none
removed call to org/jocl/CL::clSetKernelArg → NO_COVERAGE

462

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::clCommandQueue → NO_COVERAGE

463

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/kernelcontext/KernelExecutionContext::globalWorkDimensions → NO_COVERAGE

464

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/kernelcontext/KernelExecutionContext::globalWorkSize → NO_COVERAGE

465

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/kernelcontext/KernelExecutionContext::workGroupSize → NO_COVERAGE

466

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Optional::orElse → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
replaced call to java/util/Optional::orElse with argument → NO_COVERAGE

470

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE

472

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/List::size → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to java/lang/Integer::valueOf → NO_COVERAGE

476

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/lang/System::nanoTime → NO_COVERAGE

477

1.1
Location : lambda$compute$1
Killed by : none
removed call to org/jocl/CL::clEnqueueNDRangeKernel → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
Substituted 0 with 1 → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
replaced call to org/jocl/CL::clEnqueueNDRangeKernel with argument → NO_COVERAGE

489

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/lang/System::nanoTime → NO_COVERAGE

490

1.1
Location : lambda$compute$1
Killed by : none
Replaced long subtraction with addition → NO_COVERAGE

492

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE

493

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/model/Device::name → NO_COVERAGE

496

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/lang/Integer::valueOf → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
Replaced double division with multiplication → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
Substituted 1000.0 with 1.0 → NO_COVERAGE

497

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/lang/Double::valueOf → NO_COVERAGE

498

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/List::size → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to java/lang/Integer::valueOf → NO_COVERAGE

505

1.1
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to java/util/List::size → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

4.4
Location : lambda$compute$1
Killed by : none
Substituted 1 with 0 → NO_COVERAGE

5.5
Location : lambda$compute$1
Killed by : none
negated conditional → NO_COVERAGE

6.6
Location : lambda$compute$1
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

506

1.1
Location : lambda$compute$1
Killed by : none
replaced call to net/bmahe/genetics4j/gpu/spec/fitness/FitnessExtractor::compute with argument → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/FitnessExtractor::compute → NO_COVERAGE

511

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/util/Map::of → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/ResultExtractor::<init> → NO_COVERAGE

513

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::clearResultData → NO_COVERAGE

517

1.1
Location : lambda$compute$1
Killed by : none
removed call to org/jocl/CL::clReleaseMemObject → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/cldata/CLData::clMem → NO_COVERAGE

519

1.1
Location : lambda$compute$1
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::clearData → NO_COVERAGE

522

1.1
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

2.2
Location : lambda$compute$1
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

3.3
Location : lambda$compute$1
Killed by : none
negated conditional → NO_COVERAGE

523

1.1
Location : lambda$compute$1
Killed by : none
removed call to java/lang/IllegalStateException::<init> → NO_COVERAGE

525

1.1
Location : lambda$compute$1
Killed by : none
replaced return value with Collections.emptyList for net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::lambda$compute$1 → NO_COVERAGE

532

1.1
Location : afterEvaluation
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/OpenCLFitness::afterEvaluation → NO_COVERAGE

534

1.1
Location : afterEvaluation
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE

541

1.1
Location : afterAllEvaluations
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/OpenCLFitness::afterAllEvaluations → NO_COVERAGE

543

1.1
Location : afterAllEvaluations
Killed by : none
removed call to net/bmahe/genetics4j/gpu/opencl/OpenCLExecutionContext::device → NO_COVERAGE

545

1.1
Location : afterAllEvaluations
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::clearStaticData → NO_COVERAGE

562

1.1
Location : of
Killed by : none
replaced return value with null for net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::of → NO_COVERAGE

2.2
Location : of
Killed by : none
removed call to net/bmahe/genetics4j/gpu/spec/fitness/MultiStageFitness::<init> → NO_COVERAGE

Active mutators

Tests examined


Report generated by PIT 1.20.3