24template <
class... Payload>
25auto toString(
const Payload &...payload) {
26 std::stringstream stream;
31template <
class... Payload>
32std::tuple<Payload...>
fromString(std::stringstream &stream) {
33 std::tuple<Payload...> tuple{};
34 ((stream >> std::get<Payload>(tuple)), ...);
38std::string
writeEvidence(
long time,
size_t iteration,
const Configuration &config) {
39 return toString(std::string{
"evidence"}, time, iteration, config);
42std::tuple<long, size_t, Configuration>
readEvidence(std::stringstream &str) {
43 return fromString<long, size_t, Configuration>(str);
48bool readTune(std::stringstream &str) {
return std::get<0>(fromString<bool>(str)); }
50std::string
writeReset(
size_t iteration) {
return toString(std::string{
"reset"}, iteration); }
52size_t readReset(std::stringstream &str) {
return std::get<0>(fromString<size_t>(str)); }
56LiveInfo
readLiveInfo(std::stringstream &str) {
return std::get<0>(fromString<LiveInfo>(str)); }
63static int callback(
void *,
int argc,
char **argv,
char **azColName) {
64 for (
int i = 0; i < argc; ++i) {
65 std::cout << azColName[i] <<
" = " << (argv[i] ? argv[i] :
"NULL") <<
" ";
67 std::cout << std::endl;
76static std::string escapeSingleQuotesForSQL(
const std::string &str) {
81 result.reserve(str.size() + 6);
86 result.push_back(
'\'');
105 auto failed = sqlite3_open(databaseName.c_str(), &_db);
108 AutoPasLog(ERROR,
"Can't open database {}: {}", databaseName, sqlite3_errmsg(_db));
109 throw std::invalid_argument{databaseName};
121 std::ifstream in{filename};
123 if (not in.is_open()) {
124 AutoPasLog(ERROR,
"Could not open file {}", filename);
129 auto escapedFilename = escapeSingleQuotesForSQL(filename);
130 std::stringstream insertScenarios;
131 std::stringstream insertMeasurements;
132 insertScenarios <<
"INSERT INTO ScenarioRaw VALUES ";
133 insertMeasurements <<
"INSERT INTO MeasurementRaw VALUES ";
134 char sepScenarios =
' ';
135 char sepMeasurements =
' ';
136 while (not in.eof()) {
138 std::getline(in, line,
'\n');
140 std::stringstream stream{line};
142 std::getline(stream, type,
' ');
144 if (type ==
"evidence") {
146 insertMeasurements << sepMeasurements <<
"(\'" << escapedFilename <<
"\',\'" << config.container <<
"\',"
147 << config.cellSizeFactor <<
",\'" << config.traversal <<
"\',\'" << config.loadEstimator
148 <<
"\',\'" << config.dataLayout <<
"\',\'" << config.newton3 <<
"\'," << iteration <<
","
150 sepMeasurements =
',';
151 }
else if (type ==
"tune") {
153 }
else if (type ==
"liveInfo") {
155 const auto &d = liveInfo.
get();
156 auto toStr = [](
const auto &variant) {
157 return std::visit([](
const auto &val) {
return std::to_string(val); }, variant);
159 insertScenarios << sepScenarios <<
"( \'" << escapedFilename <<
"\'," << toStr(d.at(
"avgParticlesPerCell"))
160 <<
"," << toStr(d.at(
"cutoff")) <<
"," << toStr(d.at(
"domainSizeX")) <<
","
161 << toStr(d.at(
"domainSizeY")) <<
"," << toStr(d.at(
"domainSizeZ")) <<
","
162 << toStr(d.at(
"maxParticlesPerCell")) <<
"," << toStr(d.at(
"minParticlesPerCell")) <<
","
163 << toStr(d.at(
"numCells")) <<
"," << toStr(d.at(
"numEmptyCells")) <<
","
164 << toStr(d.at(
"numHaloParticles")) <<
"," << toStr(d.at(
"numParticles")) <<
","
165 << toStr(d.at(
"particleSize")) <<
"," << toStr(d.at(
"particleSizeNeededByFunctor")) <<
","
166 << toStr(d.at(
"particlesPerBlurredCellStdDev")) <<
"," << toStr(d.at(
"particlesPerCellStdDev"))
167 <<
"," << toStr(d.at(
"skin")) <<
"," << toStr(d.at(
"threadCount")) <<
","
168 << toStr(d.at(
"rebuildFrequency")) <<
"," << toStr(d.at(
"estimatedNumNeighborInteractions"))
171 }
else if (type ==
"reset" || in.eof()) {
176 std::cout << insertScenarios.str() << std::endl;
177 std::cout << insertMeasurements.str() << std::endl;
178 sendQuery(insertScenarios.str().c_str());
179 sendQuery(insertMeasurements.str().c_str());
191 void createSchema() { sendQuery(schemaSQL); }
198 void sendQuery(
const char *query) {
199 char *errMsg =
nullptr;
200 auto returnCode = sqlite3_exec(_db, query, callback,
nullptr, &errMsg);
202 if (returnCode != SQLITE_OK) {
204 sqlite3_free(errMsg);
217 static constexpr const char *schemaSQL = R
"SQL(
218CREATE TABLE ScenarioRaw (
219 filename VARCHAR(1024) PRIMARY KEY,
220 avgParticlesPerCell FLOAT,
225 maxParticlesPerCell INTEGER,
226 minParticlesPerCell INTEGER,
228 numEmptyCells INTEGER,
229 numHaloParticles INTEGER,
230 numParticles INTEGER,
231 particleSize INTEGER,
232 particleSizeNeededByFunctor INTEGER,
233 particlesPerBlurredCellStdDev FLOAT,
234 particlesPerCellStdDev FLOAT,
237 rebuildFrequency INTEGER,
238 estimatedNumNeighborInteractions INTEGER
240CREATE TABLE MeasurementRaw (
241 scenario VARCHAR(1024),
242 container VARCHAR(64),
243 cellSizeFactor FLOAT,
244 traversal VARCHAR(64),
245 loadEstimator VARCHAR(64),
246 dataLayout VARCHAR(64),
250 FOREIGN KEY (scenario) REFERENCES Scenario(filename),
262CREATE VIEW Scenario AS
269CREATE VIEW Measurement AS
276CREATE VIEW numDifferentConfigs AS
284 GROUP BY container, traversal, dataLayout, newton3, loadEstimator
288CREATE VIEW bestConfigurations AS
295 MIN(nsRuntime) as nsMinRuntime,
307 /* bestConfigurations(container,dataLayout,newton3,loadEstimator,traversal,nsMinRuntime,scenario) */
310CREATE VIEW configWinners AS
328 /* configWinners(container,dataLayout,newton3,loadEstimator,traversal,Wins) */
331CREATE VIEW measuredConfigs AS
341CREATE VIEW loserConfigs AS
350 NATURAL LEFT OUTER JOIN configWinners
355CREATE VIEW containerWinners AS
365 /* containerWinners(container,"SUM(Wins)") */
368CREATE VIEW traversalWinners AS
378 /* traversalWinners(traversal, "SUM(Wins)") */
381CREATE VIEW MeasurementWithRankInScenario AS
385 PARTITION BY scenario
393 /* MeasurementWithRankInScenario(scenario,container,cellSizeFactor,traversal,loadEstimator,dataLayout,newton3,iteration,nsRuntime,rank) */
396CREATE VIEW MeasurementRankFactor AS
399 RANK() OVER sameScenarioRuntimeOrdered AS rank,
400 CAST(nsRuntime AS DOUBLE) / MIN(nsRuntime) OVER sameScenarioRuntimeOrdered AS factorWorseThanBest
402 Measurement WINDOW sameScenarioRuntimeOrdered AS (
403 PARTITION BY scenario
409 /* MeasurementRankFactor(scenario,container,cellSizeFactor,traversal,loadEstimator,dataLayout,newton3,iteration,nsRuntime,rank,factorWorseThanBest) */
412CREATE VIEW configRanks AS
419 MAX(rank) - MIN(rank) AS diffMinMaxRank,
420 MAX(rank) AS maxRank,
421 MIN(rank) AS minRank,
422 AVG(rank) AS avgRank,
423 MAX(factorWorseThanBest) / MIN(factorWorseThanBest) AS factorWorseToBestFactor,
424 MAX(factorWorseThanBest) AS maxFactorWorseThanBest,
425 MIN(factorWorseThanBest) AS minFactorWorseThanBest,
426 AVG(factorWorseThanBest) AS avgFactorWorseThanBest
428 MeasurementRankFactor
435 /* configRanks(container,dataLayout,newton3,traversal,loadEstimator,diffMinMaxRank,maxRank,minRank,avgRank) */
438CREATE VIEW ScenarioTuningTime AS
441 SUM(nsRuntime) AS nsTuningTime
446 /* ScenarioTuningTime(scenario,nsTuningTime) */
449CREATE VIEW ScenarioWithDerived AS /* Replaces ScenarioTuningTime */
452 SUM(nsRuntime) AS nsTuningTime,
453 MAX(rank) AS numConfigsMeasured,
454 MIN(nsRuntime) AS nsMinIterationTime,
455 SUM(nsRuntime) / CAST((MIN(nsRuntime) * MAX(rank)) AS DOUBLE) AS factorToOptimalRuntime
457 MeasurementRankFactor
461 factorToOptimalRuntime
462 /* ScenarioTuningTime(scenario,nsTuningTime,numConfigsMeasured,factorToOptimalRuntime) */
465CREATE VIEW MeasurementRankFactorTuningTime AS
468 RANK() OVER sameScenarioRuntimeOrdered AS rank,
469 CAST(nsRuntime AS DOUBLE) / MIN(nsRuntime) OVER sameScenarioRuntimeOrdered AS factorWorseThanBest,
471 SUM(CAST(nsRuntime AS DOUBLE)) OVER sameScenarioRuntimeOrdered
472 ) / nsTuningTime AS percentTuningTimeUntil
475 NATURAL JOIN ScenarioTuningTime WINDOW sameScenarioRuntimeOrdered AS (
476 PARTITION BY m.scenario
482 /* MeasurementRankFactorTuningTime(scenario,container,cellSizeFactor,traversal,loadEstimator,dataLayout,newton3,iteration,nsRuntime,nsTuningTime,rank,factorWorseThanBest,percentTuningTimeUntil) */
485CREATE VIEW PercentTuningTimePerRank AS
488 MIN(percentTuningTimeUntil) AS minPercent,
489 MAX(percentTuningTimeUntil) AS maxPercent,
490 AVG(percentTuningTimeUntil) AS avgPercent
492 MeasurementRankFactorTuningTime
497 ScenarioWithDerived s
499 MeasurementRankFactorTuningTime.scenario = s.scenario
500 ) = (SELECT * FROM numDifferentConfigs)
505 /* PercentTuningTimePerRank(rank,minPercent,maxPercent,avgPercent) */
508CREATE VIEW lastConfigsOfUnfinishedScenarios AS
513 NATURAL JOIN MeasurementRankFactor
515 numConfigsMeasured < (SELECT * FROM numDifferentConfigs)
516 AND numConfigsMeasured = rank
519CREATE VIEW runtimeFactorBinning AS
521 CAST(maxFactorBin AS VARCHAR(10)) AS maxFactorBin,
522 numConfigsUntil - LAG(numConfigsUntil, 1, 0) OVER (ORDER BY maxFactorBin ASC) AS configsInBucket
526 COUNT(*) AS numConfigsUntil
528 MeasurementRankFactor,
531 column1 AS maxFactorBin
533 (VALUES (1.0), (1.2), (1.5), (2), (3.5), (5), (7.5), (10), (15), (25), (50), (100), (250), (500), (1000), (2000), (1000000))
536 factorWorseThanBest <= maxFactorBin
542CREATE VIEW uselessConfigsAndTheirSupercedingConfigs AS
544 worseConfig.container AS worseContainer,
545 worseConfig.traversal AS worseTraversal,
546 worseConfig.dataLayout AS worseDataLayout,
547 worseConfig.newton3 AS worseNewton3,
548 worseConfig.loadEstimator AS worseLoadEstimator,
549 betterConfig.container AS betterContainer,
550 betterConfig.traversal AS betterTraversal,
551 betterConfig.dataLayout AS betterDataLayout,
552 betterConfig.newton3 AS betterNewton3,
553 betterConfig.loadEstimator AS betterLoadEstimator
555 measuredConfigs betterConfig, measuredConfigs worseConfig
561 MeasurementRankFactor worse,
562 MeasurementRankFactor better
564 worse.scenario = better.scenario
566 AND worse.container = worseConfig.container
567 AND worse.traversal = worseConfig.traversal
568 AND worse.loadEstimator = worseConfig.loadEstimator
569 AND worse.dataLayout = worseConfig.dataLayout
570 AND worse.newton3 = worseConfig.newton3
572 AND better.container = betterConfig.container
573 AND better.traversal = betterConfig.traversal
574 AND better.loadEstimator = betterConfig.loadEstimator
575 AND better.dataLayout = betterConfig.dataLayout
576 AND better.newton3 = betterConfig.newton3
578 AND worse.rank <= better.rank
#define AutoPasLog(lvl, fmt,...)
Macro for logging providing common meta information without filename.
Definition: Logger.h:24
This class creates a SQLite3 database with a schema for tuning log entries, and offers methods to wri...
Definition: LogToSQLiteWriter.h:98
void write(const char *filename)
Write a file containing tuning log entries to the database.
Definition: LogToSQLiteWriter.h:120
LogToSQLiteWriter(const std::string &databaseName)
The constructor.
Definition: LogToSQLiteWriter.h:104
~LogToSQLiteWriter()
The destructor.
Definition: LogToSQLiteWriter.h:185
This class is able to gather and store important information for a tuning phase from a container and ...
Definition: LiveInfo.h:33
const auto & get() const
Returns a map of all infos.
Definition: LiveInfo.h:429
Contains some helpers to write and read the tuning log entries.
Definition: namespaces.h:97
std::string writeTune()
Writes a tune entry for the log file into a string.
Definition: TuningLogEntry.cpp:19
bool readTune(std::stringstream &str)
Reads the arguments of a tune entry from the stringstream.
Definition: TuningLogEntry.cpp:21
auto toString(const Payload &...payload)
Writes multiple arguments into a string using their << operator.
Definition: TuningLogEntry.h:35
std::string writeReset(size_t iteration)
Writes a reset entry in the log file to a string.
Definition: TuningLogEntry.cpp:23
size_t readReset(std::stringstream &str)
Reads the arguments of a reset entry in the log file from a string.
Definition: LogToSQLiteWriter.h:52
std::string writeLiveInfo(const autopas::LiveInfo &liveInfo)
Writes a liveInfo entry in the log file to a string.
Definition: TuningLogEntry.cpp:25
std::tuple< long, size_t, Configuration > readEvidence(std::stringstream &str)
Reads the arguments of an evidence entry in the log file from a stringstream.
Definition: TuningLogEntry.cpp:15
std::tuple< Payload... > fromString(std::stringstream &stream)
Reads multiple values from a stringstream using their >> operator.
Definition: TuningLogEntry.h:48
autopas::LiveInfo readLiveInfo(std::stringstream &str)
Reads the arguments of a live info entry in the log file from a stringstream.
Definition: TuningLogEntry.cpp:27
void toStringHelper(std::ostream &in, const T &val)
Writes the given argument into the given ostream with following white space.
Definition: TuningLogEntry.h:24
std::string writeEvidence(long time, size_t iteration, const autopas::Configuration &config)
Writes evidence to a string.
Definition: TuningLogEntry.cpp:11