in optaplanner-spring-integration/optaplanner-spring-boot-autoconfigure/src/main/java/org/optaplanner/spring/boot/autoconfigure/OptaPlannerBenchmarkAutoConfiguration.java [64:149]
public PlannerBenchmarkConfig plannerBenchmarkConfig(SolverConfig solverConfig) {
PlannerBenchmarkConfig benchmarkConfig;
if (optaPlannerProperties.getBenchmark() != null
&& optaPlannerProperties.getBenchmark().getSolverBenchmarkConfigXml() != null) {
if (beanClassLoader.getResource(optaPlannerProperties.getBenchmark().getSolverBenchmarkConfigXml()) == null) {
throw new IllegalStateException(
"Invalid optaplanner.benchmark.solverBenchmarkConfigXml property ("
+ optaPlannerProperties.getBenchmark().getSolverBenchmarkConfigXml()
+ "): that classpath resource does not exist.");
}
benchmarkConfig = PlannerBenchmarkConfig
.createFromXmlResource(optaPlannerProperties.getBenchmark().getSolverBenchmarkConfigXml(), beanClassLoader);
} else if (beanClassLoader.getResource(BenchmarkProperties.DEFAULT_SOLVER_BENCHMARK_CONFIG_URL) != null) {
benchmarkConfig = PlannerBenchmarkConfig.createFromXmlResource(
OptaPlannerProperties.DEFAULT_SOLVER_BENCHMARK_CONFIG_URL, beanClassLoader);
} else {
benchmarkConfig = PlannerBenchmarkConfig.createFromSolverConfig(solverConfig);
benchmarkConfig.setBenchmarkDirectory(new File(BenchmarkProperties.DEFAULT_BENCHMARK_RESULT_DIRECTORY));
}
if (optaPlannerProperties.getBenchmark() != null && optaPlannerProperties.getBenchmark().getResultDirectory() != null) {
benchmarkConfig.setBenchmarkDirectory(new File(optaPlannerProperties.getBenchmark().getResultDirectory()));
}
if (benchmarkConfig.getBenchmarkDirectory() == null) {
benchmarkConfig.setBenchmarkDirectory(new File(BenchmarkProperties.DEFAULT_BENCHMARK_RESULT_DIRECTORY));
}
if (optaPlannerProperties.getBenchmark() != null && optaPlannerProperties.getBenchmark().getSolver() != null) {
OptaPlannerAutoConfiguration
.applyTerminationProperties(benchmarkConfig.getInheritedSolverBenchmarkConfig().getSolverConfig(),
optaPlannerProperties.getBenchmark().getSolver().getTermination());
}
if (benchmarkConfig.getInheritedSolverBenchmarkConfig().getSolverConfig().getTerminationConfig() == null ||
!benchmarkConfig.getInheritedSolverBenchmarkConfig().getSolverConfig().getTerminationConfig().isConfigured()) {
List<SolverBenchmarkConfig> solverBenchmarkConfigList = benchmarkConfig.getSolverBenchmarkConfigList();
List<String> unconfiguredTerminationSolverBenchmarkList = new ArrayList<>();
if (solverBenchmarkConfigList == null) {
throw new IllegalStateException("At least one of the properties " +
"optaplanner.benchmark.solver.termination.spent-limit, " +
"optaplanner.benchmark.solver.termination.best-score-limit, " +
"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);
TerminationConfig terminationConfig = solverBenchmarkConfig.getSolverConfig().getTerminationConfig();
if (terminationConfig == null || !terminationConfig.isConfigured()) {
boolean isTerminationConfiguredForAllNonConstructionHeuristicPhases = !solverBenchmarkConfig
.getSolverConfig().getPhaseConfigList().isEmpty();
for (PhaseConfig<?> phaseConfig : solverBenchmarkConfig.getSolverConfig().getPhaseConfigList()) {
if (!(phaseConfig instanceof ConstructionHeuristicPhaseConfig)) {
if (phaseConfig.getTerminationConfig() == null
|| !phaseConfig.getTerminationConfig().isConfigured()) {
isTerminationConfiguredForAllNonConstructionHeuristicPhases = false;
break;
}
}
}
if (!isTerminationConfiguredForAllNonConstructionHeuristicPhases) {
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 " +
"optaplanner.benchmark.solver.termination.spent-limit, " +
"optaplanner.benchmark.solver.termination.best-score-limit, " +
"optaplanner.benchmark.solver.termination.unimproved-spent-limit " +
"is required if termination is not configured in a solver benchmark and the " +
"inherited solver benchmark config.");
}
}
return benchmarkConfig;
}