in optaplanner-benchmark/src/main/java/org/optaplanner/benchmark/impl/SubSingleBenchmarkRunner.java [88:161]
public SubSingleBenchmarkRunner<Solution_> call() {
MDC.put(NAME_MDC, subSingleBenchmarkResult.getName());
Runtime runtime = Runtime.getRuntime();
SingleBenchmarkResult singleBenchmarkResult = subSingleBenchmarkResult.getSingleBenchmarkResult();
ProblemBenchmarkResult<Solution_> problemBenchmarkResult = singleBenchmarkResult
.getProblemBenchmarkResult();
Solution_ problem = problemBenchmarkResult.readProblem();
if (!problemBenchmarkResult.getPlannerBenchmarkResult().hasMultipleParallelBenchmarks()) {
runtime.gc();
subSingleBenchmarkResult.setUsedMemoryAfterInputSolution(runtime.totalMemory() - runtime.freeMemory());
}
LOGGER.trace("Benchmark problem has been read for subSingleBenchmarkResult ({}).",
subSingleBenchmarkResult);
SolverConfig solverConfig = singleBenchmarkResult.getSolverBenchmarkResult()
.getSolverConfig();
if (singleBenchmarkResult.getSubSingleCount() > 1) {
solverConfig = new SolverConfig(solverConfig);
solverConfig.offerRandomSeedFromSubSingleIndex(subSingleBenchmarkResult.getSubSingleBenchmarkIndex());
}
Map<String, String> subSingleBenchmarkTagMap = new HashMap<>();
String runId = UUID.randomUUID().toString();
subSingleBenchmarkTagMap.put("optaplanner.benchmark.run", runId);
solverConfig = new SolverConfig(solverConfig);
randomSeed = solverConfig.getRandomSeed();
// Defensive copy of solverConfig for every SingleBenchmarkResult to reset Random, tabu lists, ...
DefaultSolverFactory<Solution_> solverFactory = new DefaultSolverFactory<>(new SolverConfig(solverConfig));
DefaultSolver<Solution_> solver = (DefaultSolver<Solution_>) solverFactory.buildSolver();
solver.setMonitorTagMap(subSingleBenchmarkTagMap);
StatisticRegistry<Solution_> statisticRegistry = new StatisticRegistry<>(solver);
Metrics.addRegistry(statisticRegistry);
solver.addPhaseLifecycleListener(statisticRegistry);
Tags runTag = Tags.of("optaplanner.benchmark.run", runId);
for (SubSingleStatistic<Solution_, ?> subSingleStatistic : subSingleBenchmarkResult.getEffectiveSubSingleStatisticMap()
.values()) {
subSingleStatistic.open(statisticRegistry, runTag, solver);
subSingleStatistic.initPointList();
}
Solution_ solution = solver.solve(problem);
solver.removePhaseLifecycleListener(statisticRegistry);
Metrics.removeRegistry(statisticRegistry);
long timeMillisSpent = solver.getTimeMillisSpent();
for (SubSingleStatistic<Solution_, ?> subSingleStatistic : subSingleBenchmarkResult.getEffectiveSubSingleStatisticMap()
.values()) {
subSingleStatistic.close(statisticRegistry, runTag, solver);
subSingleStatistic.hibernatePointList();
}
if (!warmUp) {
SolverScope<Solution_> solverScope = solver.getSolverScope();
SolutionDescriptor<Solution_> solutionDescriptor = solverScope.getSolutionDescriptor();
problemBenchmarkResult.registerScale(solutionDescriptor.getEntityCount(solution),
solutionDescriptor.getGenuineVariableCount(solution),
solutionDescriptor.getMaximumValueCount(solution),
solutionDescriptor.getProblemScale(solution));
subSingleBenchmarkResult.setScore(solutionDescriptor.getScore(solution));
subSingleBenchmarkResult.setTimeMillisSpent(timeMillisSpent);
subSingleBenchmarkResult.setScoreCalculationCount(solverScope.getScoreCalculationCount());
SolutionManager<Solution_, ?> solutionManager = SolutionManager.create(solverFactory);
boolean isConstraintMatchEnabled = solver.getSolverScope().getScoreDirector().isConstraintMatchEnabled();
if (isConstraintMatchEnabled) { // Easy calculator fails otherwise.
ScoreExplanation<Solution_, ?> scoreExplanation =
solutionManager.explain(solution, SolutionUpdatePolicy.NO_UPDATE);
subSingleBenchmarkResult.setScoreExplanationSummary(scoreExplanation.getSummary());
}
problemBenchmarkResult.writeSolution(subSingleBenchmarkResult, solution);
}
MDC.remove(NAME_MDC);
return this;
}