in wayang-commons/wayang-core/src/main/java/org/apache/wayang/core/optimizer/enumeration/PlanEnumerator.java [212:275]
private PlanEnumerator(Collection<Operator> startOperators,
OptimizationContext optimizationContext,
OperatorAlternative.Alternative enumeratedAlternative,
Map<OperatorAlternative, OperatorAlternative.Alternative> presettledAlternatives,
Map<ExecutionOperator, ExecutionTask> executedTasks,
Map<OutputSlot<?>, Collection<Channel>> openChannels) {
this.optimizationContext = optimizationContext;
this.enumeratedAlternative = enumeratedAlternative;
this.presettledAlternatives = presettledAlternatives;
this.executedTasks = executedTasks;
this.openChannels = openChannels;
// Set up start Operators.
for (Operator startOperator : startOperators) {
this.scheduleForEnumeration(startOperator, optimizationContext);
}
// Configure the enumeration.
final Configuration configuration = this.optimizationContext.getConfiguration();
this.isEnumeratingBranchesFirst = configuration.getBooleanProperty(
"wayang.core.optimizer.enumeration.branchesfirst", true
);
// Configure the concatenations.
final String priorityFunctionName = configuration.getStringProperty(
"wayang.core.optimizer.enumeration.concatenationprio"
);
ToDoubleFunction<ConcatenationActivator> concatenationPriorityFunction;
switch (priorityFunctionName) {
case "slots":
concatenationPriorityFunction = ConcatenationActivator::countNumOfOpenSlots;
break;
case "plans":
concatenationPriorityFunction = ConcatenationActivator::estimateNumConcatenatedPlanImplementations;
break;
case "plans2":
concatenationPriorityFunction = ConcatenationActivator::estimateNumConcatenatedPlanImplementations2;
break;
case "random":
// Randomly generate a priority. However, avoid re-generate priorities, because that would increase
// of a concatenation activator being processed, the longer it is in the queue (I guess).
concatenationPriorityFunction = activator -> {
if (!Double.isNaN(activator.priority)) return activator.priority;
return Math.random();
};
break;
case "none":
concatenationPriorityFunction = activator -> 0d;
break;
default:
throw new WayangException("Unknown concatenation priority function: " + priorityFunctionName);
}
boolean isInvertConcatenationPriorities = configuration.getBooleanProperty(
"wayang.core.optimizer.enumeration.invertconcatenations", false
);
this.concatenationPriorityFunction = isInvertConcatenationPriorities ?
activator -> -concatenationPriorityFunction.applyAsDouble(activator) :
concatenationPriorityFunction;
}