in wayang-profiler/code/main/java/org/apache/wayang/profiler/log/GeneticOptimizer.java [119:178]
public GeneticOptimizer(OptimizationSpace optimizationSpace,
Collection<PartialExecution> observations,
Map<String, DynamicLoadProfileEstimator> estimators,
Map<Platform, Variable> platformOverheads,
Configuration configuration) {
this.configuration = configuration;
this.optimizationSpace = optimizationSpace;
this.observations = observations;
this.platformOverheads = platformOverheads;
this.activatedGenes = new Bitmask(this.optimizationSpace.getNumDimensions());
for (PartialExecution observation : observations) {
final Collection<String> loadProfileEstimatorKeys = getLoadProfileEstimatorKeys(observation);
for (String loadProfileEstimatorKey : loadProfileEstimatorKeys) {
final LoadProfileEstimator estimator = estimators.get(loadProfileEstimatorKey);
if (estimator != null) {
for (Variable variable : ((DynamicLoadProfileEstimator) estimator).getEmployedVariables()) {
this.activatedGenes.set(variable.getIndex());
}
}
}
for (Variable platformOverhead : this.platformOverheads.values()) {
this.activatedGenes.set(platformOverhead.getIndex());
}
}
this.populationSize = ((int) this.configuration.getLongProperty("wayang.profiler.ga.population.size", 10));
this.eliteSize = ((int) this.configuration.getLongProperty("wayang.profiler.ga.population.elite", 1));
this.selectionRatio = this.configuration.getDoubleProperty("wayang.profiler.ga.selection.ratio", 0.5d);
this.mutationRatio = this.configuration.getDoubleProperty("wayang.profiler.ga.mutation.ratio", 0.5d);
this.mutationAlterationRatio = this.configuration.getDoubleProperty("wayang.profiler.ga.mutation.alteration", 0.5d);
this.mutationResetRatio = this.configuration.getDoubleProperty("wayang.profiler.ga.mutation.reset", 0.01d);
switch (this.configuration.getStringProperty("wayang.profiler.ga.fitness.type", "relative")) {
case "relative":
this.fitnessFunction = individual -> individual.calculateRelativeFitness(this);
break;
case "absolute":
this.fitnessFunction = individual -> individual.calculateAbsoluteFitness(this);
break;
// case "subject":
// this.fitnessFunction = individual -> individual.calcluateSubjectbasedFitness(this);
// break;
default:
throw new IllegalStateException(
"Unknown fitness function: " + this.configuration.getStringProperty("wayang.profiler.ga.fitness.type")
);
}
// Count the distinct elements in the PartialExecutions.
this.numObservations = new HashMap<>();
this.runtimeSum = 0L;
for (PartialExecution observation : this.observations) {
for (String key : getLoadProfileEstimatorKeys(observation)) {
this.adjustOrPutValue(key, 1, 1);
}
for (Platform platform : observation.getInitializedPlatforms()) {
this.adjustOrPutValue(platform, 1, 1);
}
this.runtimeSum += observation.getMeasuredExecutionTime();
}
}