Begin result report pagination

This commit is contained in:
2024-03-17 02:07:10 +01:00
parent fa4f47ff35
commit faccb09c43
4 changed files with 78 additions and 36 deletions

View File

@@ -48,16 +48,25 @@ namespace platform {
void ReportConsole::do_body()
{
sbody.str("");
vbody.clear();
auto tmp = ConfigLocale();
int maxHyper = 15;
int maxDataset = 7;
for (const auto& r : data["results"]) {
maxHyper = std::max(maxHyper, (int)r["hyperparameters"].dump().size());
maxDataset = std::max(maxDataset, (int)r["dataset"].get<std::string>().size());
}
sbody << Colors::GREEN() << " # " << std::setw(maxDataset) << std::left << "Dataset" << " Sampl. Feat. Cls Nodes Edges States Score Time Hyperparameters" << std::endl;
sbody << "=== " << std::string(maxDataset, '=') << " ====== ===== === ========= ========= ========= =============== =================== " << std::string(maxHyper, '=') << std::endl;
std::vector<std::string> header_labels = { " #", "Dataset", "Sampl.", "Feat.", "Cls", "Nodes", "Edges", "Depth", "Score", "Time", "Hyperparameters" };
sheader << Colors::GREEN();
std::vector<int> header_lengths = { 3, maxDataset, 6, 5, 3, 9, 9, 9, 8, 12, maxHyper };
for (int i = 0; i < header_labels.size(); i++) {
sheader << std::setw(header_lengths[i]) << std::left << header_labels[i] << " ";
}
sheader << std::endl;
for (int i = 0; i < header_labels.size(); i++) {
sheader << std::string(header_lengths[i], '=') << " ";
}
sheader << std::endl;
json lastResult;
double totalScore = 0.0;
int index = 0;
@@ -67,47 +76,61 @@ namespace platform {
continue;
}
auto color = (index % 2) ? Colors::CYAN() : Colors::BLUE();
sbody << color;
std::stringstream line;
line << color;
std::string separator{ " " };
if (r.find("notes") != r.end()) {
separator = r["notes"].size() > 0 ? Colors::YELLOW() + Symbols::notebook + color : " ";
}
sbody << std::setw(3) << std::right << index++ << separator;
sbody << std::setw(maxDataset) << std::left << r["dataset"].get<std::string>() << " ";
sbody << std::setw(6) << std::right << r["samples"].get<int>() << " ";
sbody << std::setw(5) << std::right << r["features"].get<int>() << " ";
sbody << std::setw(3) << std::right << r["classes"].get<int>() << " ";
sbody << std::setw(9) << std::setprecision(2) << std::fixed << r["nodes"].get<float>() << " ";
sbody << std::setw(9) << std::setprecision(2) << std::fixed << r["leaves"].get<float>() << " ";
sbody << std::setw(9) << std::setprecision(2) << std::fixed << r["depth"].get<float>() << " ";
sbody << std::setw(8) << std::right << std::setprecision(6) << std::fixed << r["score"].get<double>() << "±" << std::setw(6) << std::setprecision(4) << std::fixed << r["score_std"].get<double>();
line << std::setw(3) << std::right << index++ << separator;
line << std::setw(maxDataset) << std::left << r["dataset"].get<std::string>() << " ";
line << std::setw(6) << std::right << r["samples"].get<int>() << " ";
line << std::setw(5) << std::right << r["features"].get<int>() << " ";
line << std::setw(3) << std::right << r["classes"].get<int>() << " ";
line << std::setw(9) << std::setprecision(2) << std::fixed << r["nodes"].get<float>() << " ";
line << std::setw(9) << std::setprecision(2) << std::fixed << r["leaves"].get<float>() << " ";
line << std::setw(9) << std::setprecision(2) << std::fixed << r["depth"].get<float>() << " ";
line << std::setw(8) << std::right << std::setprecision(6) << std::fixed << r["score"].get<double>() << "±" << std::setw(6) << std::setprecision(4) << std::fixed << r["score_std"].get<double>();
const std::string status = compareResult(r["dataset"].get<std::string>(), r["score"].get<double>());
sbody << status;
sbody << std::setw(12) << std::right << std::setprecision(6) << std::fixed << r["time"].get<double>() << "±" << std::setw(6) << std::setprecision(4) << std::fixed << r["time_std"].get<double>() << " ";
sbody << r["hyperparameters"].dump();
sbody << std::endl;
sbody << std::flush;
line << status;
line << std::setw(12) << std::right << std::setprecision(6) << std::fixed << r["time"].get<double>() << "±" << std::setw(6) << std::setprecision(4) << std::fixed << r["time_std"].get<double>() << " ";
line << r["hyperparameters"].dump();
line << std::endl;
vbody.push_back(line.str());
sbody << line.str();
lastResult = r;
totalScore += r["score"].get<double>();
}
if (data["results"].size() == 1 || selectedIndex != -1) {
sbody << Colors::MAGENTA() << std::string(MAXL, '*') << std::endl;
std::stringstream line;
line << Colors::MAGENTA() << std::string(MAXL, '*') << std::endl;
vbody.push_back(line.str());
sbody << line.str();
if (lastResult.find("notes") != lastResult.end()) {
if (lastResult["notes"].size() > 0) {
sbody << headerLine("Notes: ");
vbody.push_back(headerLine("Notes: "));
for (const auto& note : lastResult["notes"]) {
sbody << headerLine(note.get<std::string>());
line.str("");
line << headerLine(note.get<std::string>());
vbody.push_back(line.str());
sbody << line.str();
}
}
}
sbody << headerLine(fVector("Train scores: ", lastResult["scores_train"], 14, 12));
sbody << headerLine(fVector("Test scores: ", lastResult["scores_test"], 14, 12));
sbody << headerLine(fVector("Train times: ", lastResult["times_train"], 10, 3));
sbody << headerLine(fVector("Test times: ", lastResult["times_test"], 10, 3));
line.str(""); line << headerLine(fVector("Train scores: ", lastResult["scores_train"], 14, 12));
vbody.push_back(line.str()); sbody << line.str();
line.str(""); line << headerLine(fVector("Test scores: ", lastResult["scores_test"], 14, 12));
vbody.push_back(line.str()); sbody << line.str();
line.str(""); line << headerLine(fVector("Train times: ", lastResult["times_train"], 10, 3));
vbody.push_back(line.str()); sbody << line.str();
line.str(""); line << headerLine(fVector("Test times: ", lastResult["times_test"], 10, 3));
vbody.push_back(line.str()); sbody << line.str();
} else {
footer(totalScore);
}
sbody << std::string(MAXL, '*') << Colors::RESET() << std::endl;
vbody.push_back(std::string(MAXL, '*') + Colors::RESET() + "\n");
}
void ReportConsole::body()
{
@@ -121,12 +144,15 @@ namespace platform {
oss << std::setw(3) << std::right << item.second << " ";
oss << std::left << meaning.at(item.first);
sbody << headerLine(oss.str(), 2);
vbody.push_back(headerLine(oss.str(), 2));
}
}
void ReportConsole::footer(double totalScore)
{
sbody << Colors::MAGENTA() << std::string(MAXL, '*') << std::endl;
std::stringstream linea;
linea << Colors::MAGENTA() << std::string(MAXL, '*') << std::endl;
vbody.push_back(linea.str()); sbody << linea.str();
showSummary();
auto score = data["score_name"].get<std::string>();
auto best = BestScore::getScore(score);
@@ -134,6 +160,7 @@ namespace platform {
std::stringstream oss;
oss << score << " compared to " << best.first << " .: " << totalScore / best.second;
sbody << headerLine(oss.str());
vbody.push_back(headerLine(oss.str()));
}
if (!getExistBestFile() && compare) {
std::cout << headerLine("*** Best Results File not found. Couldn't compare any result!");

View File

@@ -12,6 +12,8 @@ namespace platform {
explicit ReportConsole(json data_, bool compare = false, int index = -1) : ReportBase(data_, compare), selectedIndex(index) {};
virtual ~ReportConsole() = default;
std::string fileReport();
std::string getHeader() { do_header(); do_body(); return sheader.str(); }
std::vector<std::string>& getBody() { return vbody; }
private:
int selectedIndex;
std::string headerLine(const std::string& text, int utf);
@@ -23,5 +25,6 @@ namespace platform {
void showSummary() override;
std::stringstream sheader;
std::stringstream sbody;
std::vector<std::string> vbody;
};
};