/*
* Copyright 2014 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.optaplanner.benchmark.impl.aggregator;
import java.io.File;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.optaplanner.benchmark.config.report.BenchmarkReportConfig;
import org.optaplanner.benchmark.impl.report.BenchmarkReport;
import org.optaplanner.benchmark.impl.result.PlannerBenchmarkResult;
import org.optaplanner.benchmark.impl.result.SingleBenchmarkResult;
import org.optaplanner.benchmark.impl.result.SolverBenchmarkResult;
import org.optaplanner.benchmark.impl.result.SubSingleBenchmarkResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class BenchmarkAggregator {
protected final transient Logger logger = LoggerFactory.getLogger(getClass());
private File benchmarkDirectory = null;
private BenchmarkReportConfig benchmarkReportConfig = null;
public File getBenchmarkDirectory() {
return benchmarkDirectory;
}
public void setBenchmarkDirectory(File benchmarkDirectory) {
this.benchmarkDirectory = benchmarkDirectory;
}
public BenchmarkReportConfig getBenchmarkReportConfig() {
return benchmarkReportConfig;
}
public void setBenchmarkReportConfig(BenchmarkReportConfig benchmarkReportConfig) {
this.benchmarkReportConfig = benchmarkReportConfig;
}
// ************************************************************************
// Aggregate methods
// ************************************************************************
public File aggregate(List<SingleBenchmarkResult> singleBenchmarkResultList) {
return aggregate(singleBenchmarkResultList, null);
}
public File aggregate(List<SingleBenchmarkResult> singleBenchmarkResultList,
Map<SolverBenchmarkResult, String> solverBenchmarkResultNameMap) {
if (benchmarkDirectory == null) {
throw new IllegalArgumentException("The benchmarkDirectory (" + benchmarkDirectory + ") must not be null.");
}
if (!benchmarkDirectory.exists()) {
throw new IllegalArgumentException("The benchmarkDirectory (" + benchmarkDirectory + ") must exist.");
}
if (benchmarkReportConfig == null) {
throw new IllegalArgumentException("The benchmarkReportConfig (" + benchmarkReportConfig
+ ") must not be null.");
}
if (singleBenchmarkResultList.isEmpty()) {
throw new IllegalArgumentException("The singleBenchmarkResultList (" + singleBenchmarkResultList
+ ") must not be empty.");
}
OffsetDateTime startingTimestamp = OffsetDateTime.now();
for (SingleBenchmarkResult singleBenchmarkResult : singleBenchmarkResultList) {
for (SubSingleBenchmarkResult subSingleBenchmarkResult : singleBenchmarkResult.getSubSingleBenchmarkResultList()) {
subSingleBenchmarkResult.setSingleBenchmarkResult(singleBenchmarkResult);
}
singleBenchmarkResult.initSubSingleStatisticMaps();
}
// Handle renamed solver benchmarks after statistics have been read (they're resolved by
// original solver benchmarks' names)
if (solverBenchmarkResultNameMap != null) {
for (Entry<SolverBenchmarkResult, String> entry : solverBenchmarkResultNameMap.entrySet()) {
SolverBenchmarkResult result = entry.getKey();
String newName = entry.getValue();
if (!result.getName().equals(newName)) {
result.setName(newName);
}
}
}
PlannerBenchmarkResult plannerBenchmarkResult = PlannerBenchmarkResult.createMergedResult(
singleBenchmarkResultList);
plannerBenchmarkResult.setStartingTimestamp(startingTimestamp);
plannerBenchmarkResult.initBenchmarkReportDirectory(benchmarkDirectory);
BenchmarkReport benchmarkReport = benchmarkReportConfig.buildBenchmarkReport(plannerBenchmarkResult);
plannerBenchmarkResult.accumulateResults(benchmarkReport);
benchmarkReport.writeReport();
logger.info("Aggregation ended: statistic html overview ({}).",
benchmarkReport.getHtmlOverviewFile().getAbsolutePath());
return benchmarkReport.getHtmlOverviewFile().getAbsoluteFile();
}
}