in optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkRecorder.java [55:174]
private PlannerBenchmarkConfig updateBenchmarkConfigWithRuntimeProperties(PlannerBenchmarkConfig plannerBenchmarkConfig,
OptaPlannerBenchmarkRuntimeConfig benchmarkRuntimeConfig,
SolverConfig solverConfig) {
if (plannerBenchmarkConfig == null) { // no benchmarkConfig.xml provided
// Can't do this in processor; SolverConfig is not completed yet (has some runtime properties)
plannerBenchmarkConfig = PlannerBenchmarkConfig.createFromSolverConfig(solverConfig);
}
plannerBenchmarkConfig.setBenchmarkDirectory(new File(benchmarkRuntimeConfig.resultDirectory));
SolverBenchmarkConfig inheritedBenchmarkConfig = plannerBenchmarkConfig.getInheritedSolverBenchmarkConfig();
if (plannerBenchmarkConfig.getSolverBenchmarkBluePrintConfigList() != null) {
if (inheritedBenchmarkConfig == null) {
inheritedBenchmarkConfig = new SolverBenchmarkConfig();
plannerBenchmarkConfig.setInheritedSolverBenchmarkConfig(inheritedBenchmarkConfig);
inheritedBenchmarkConfig.setSolverConfig(solverConfig.copyConfig());
}
TerminationConfig inheritedTerminationConfig;
if (inheritedBenchmarkConfig.getSolverConfig().getTerminationConfig() != null) {
inheritedTerminationConfig = inheritedBenchmarkConfig.getSolverConfig().getTerminationConfig();
} else {
inheritedTerminationConfig = new TerminationConfig();
inheritedBenchmarkConfig.getSolverConfig().setTerminationConfig(inheritedTerminationConfig);
}
benchmarkRuntimeConfig.termination.spentLimit.ifPresent(inheritedTerminationConfig::setSpentLimit);
benchmarkRuntimeConfig.termination.unimprovedSpentLimit
.ifPresent(inheritedTerminationConfig::setUnimprovedSpentLimit);
benchmarkRuntimeConfig.termination.bestScoreLimit.ifPresent(inheritedTerminationConfig::setBestScoreLimit);
}
TerminationConfig inheritedTerminationConfig = null;
if (inheritedBenchmarkConfig != null && inheritedBenchmarkConfig.getSolverConfig() != null &&
inheritedBenchmarkConfig.getSolverConfig().getTerminationConfig() != null) {
inheritedTerminationConfig = inheritedBenchmarkConfig.getSolverConfig().getTerminationConfig();
}
if (inheritedTerminationConfig == null || !inheritedTerminationConfig.isConfigured()) {
List<SolverBenchmarkConfig> solverBenchmarkConfigList = plannerBenchmarkConfig.getSolverBenchmarkConfigList();
List<String> unconfiguredTerminationSolverBenchmarkList = new ArrayList<>();
if (solverBenchmarkConfigList == null) {
throw new IllegalStateException("At least one of the properties " +
"quarkus.optaplanner.benchmark.solver.termination.spent-limit, " +
"quarkus.optaplanner.benchmark.solver.termination.best-score-limit, " +
"quarkus.optaplanner.benchmark.solver.termination.unimproved-spent-limit " +
"is required if termination is not configured in the " +
"inherited solver benchmark config and solverBenchmarkBluePrint is used.");
}
for (int i = 0; i < solverBenchmarkConfigList.size(); i++) {
SolverBenchmarkConfig solverBenchmarkConfig = solverBenchmarkConfigList.get(i);
if (solverBenchmarkConfig.getSolverConfig() == null) {
solverBenchmarkConfig.setSolverConfig(new SolverConfig());
}
TerminationConfig terminationConfig = solverBenchmarkConfig.getSolverConfig().getTerminationConfig();
if (terminationConfig == null) {
terminationConfig = new TerminationConfig();
solverBenchmarkConfig.getSolverConfig().setTerminationConfig(terminationConfig);
} else if (terminationConfig.isConfigured()) {
continue;
}
benchmarkRuntimeConfig.termination.spentLimit.ifPresent(terminationConfig::setSpentLimit);
benchmarkRuntimeConfig.termination.unimprovedSpentLimit
.ifPresent(terminationConfig::setUnimprovedSpentLimit);
benchmarkRuntimeConfig.termination.bestScoreLimit.ifPresent(terminationConfig::setBestScoreLimit);
if (!terminationConfig.isConfigured()) {
List<PhaseConfig> phaseConfigList = solverBenchmarkConfig.getSolverConfig().getPhaseConfigList();
boolean isTerminationConfiguredForAllLocalSearchPhases =
phaseConfigList != null && !phaseConfigList.isEmpty();
if (isTerminationConfiguredForAllLocalSearchPhases) {
for (PhaseConfig<?> phaseConfig : phaseConfigList) {
if (phaseConfig instanceof LocalSearchPhaseConfig) {
if (phaseConfig.getTerminationConfig() == null
|| !phaseConfig.getTerminationConfig().isConfigured()) {
isTerminationConfiguredForAllLocalSearchPhases = false;
break;
}
}
}
}
if (!isTerminationConfiguredForAllLocalSearchPhases) {
String benchmarkConfigName = solverBenchmarkConfig.getName();
if (benchmarkConfigName == null) {
benchmarkConfigName = "SolverBenchmarkConfig " + i;
}
unconfiguredTerminationSolverBenchmarkList.add(benchmarkConfigName);
}
}
}
if (!unconfiguredTerminationSolverBenchmarkList.isEmpty()) {
throw new IllegalStateException("The following " + SolverBenchmarkConfig.class.getSimpleName() + " do not " +
"have termination configured: " +
unconfiguredTerminationSolverBenchmarkList.stream()
.collect(Collectors.joining(", ", "[", "]"))
+ ". " +
"At least one of the properties " +
"quarkus.optaplanner.benchmark.solver.termination.spent-limit, " +
"quarkus.optaplanner.benchmark.solver.termination.best-score-limit, " +
"quarkus.optaplanner.benchmark.solver.termination.unimproved-spent-limit " +
"is required if termination is not configured in a solver benchmark and the " +
"inherited solver benchmark config.");
}
}
if (plannerBenchmarkConfig.getSolverBenchmarkConfigList() != null) {
for (SolverBenchmarkConfig childBenchmarkConfig : plannerBenchmarkConfig.getSolverBenchmarkConfigList()) {
if (childBenchmarkConfig.getSolverConfig() == null) {
childBenchmarkConfig.setSolverConfig(new SolverConfig());
}
inheritPropertiesFromSolverConfig(childBenchmarkConfig, inheritedBenchmarkConfig, solverConfig);
}
}
if (plannerBenchmarkConfig.getSolverBenchmarkConfigList() == null
&& plannerBenchmarkConfig.getSolverBenchmarkBluePrintConfigList() == null) {
plannerBenchmarkConfig.setSolverBenchmarkConfigList(Collections.singletonList(new SolverBenchmarkConfig()));
}
return plannerBenchmarkConfig;
}