From ad402ac21e383a2bfcfcfb81bdfa08ca06cf654b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana=20G=C3=B3mez?= Date: Sat, 16 Mar 2024 01:16:00 +0100 Subject: [PATCH] ReportConsole to string --- src/manage/ManageResults.cpp | 4 +- src/reports/ReportConsole.cpp | 96 ++++++++++++++++++++--------------- src/reports/ReportConsole.h | 6 +++ 3 files changed, 64 insertions(+), 42 deletions(-) diff --git a/src/manage/ManageResults.cpp b/src/manage/ManageResults.cpp index 1e50727..032d39b 100644 --- a/src/manage/ManageResults.cpp +++ b/src/manage/ManageResults.cpp @@ -153,7 +153,7 @@ namespace platform { return results.at(index).getFilename() + "->" + Paths::excel() + Paths::excelResults(); } else { ReportConsole reporter(data, compare); - reporter.show(); + std::cout << reporter.fileReport(); return "Reporting " + results.at(index).getFilename(); } } @@ -163,7 +163,7 @@ namespace platform { auto data = results.at(index).getJson(); std::cout << Colors::YELLOW() << "Showing " << results.at(index).getFilename() << std::endl; ReportConsole reporter(data, compare, idx); - reporter.show(); + std::cout << reporter.fileReport(); } std::pair ManageResults::sortList() { diff --git a/src/reports/ReportConsole.cpp b/src/reports/ReportConsole.cpp index 8e6eda1..05a626e 100644 --- a/src/reports/ReportConsole.cpp +++ b/src/reports/ReportConsole.cpp @@ -1,5 +1,4 @@ #include -#include #include #include "best/BestScore.h" #include "common/CLocale.h" @@ -12,30 +11,43 @@ namespace platform { n = n < 0 ? 0 : n; return "* " + text + std::string(n + utf, ' ') + "*\n"; } - - void ReportConsole::header() + void ReportConsole::do_header() { + sheader.str(""); std::stringstream oss; - std::cout << Colors::MAGENTA() << std::string(MAXL, '*') << std::endl; - std::cout << headerLine( + sheader << Colors::MAGENTA() << std::string(MAXL, '*') << std::endl; + sheader << headerLine( "Report " + data["model"].get() + " ver. " + data["version"].get() + " with " + std::to_string(data["folds"].get()) + " Folds cross validation and " + std::to_string(data["seeds"].size()) + " random seeds. " + data["date"].get() + " " + data["time"].get() ); - std::cout << headerLine(data["title"].get()); - std::cout << headerLine( + sheader << headerLine(data["title"].get()); + sheader << headerLine( "Random seeds: " + fromVector("seeds") + " Discretized: " + (data["discretized"].get() ? "True" : "False") + " Stratified: " + (data["stratified"].get() ? "True" : "False") ); oss << "Execution took " << std::setprecision(2) << std::fixed << data["duration"].get() << " seconds, " << data["duration"].get() / 3600 << " hours, on " << data["platform"].get(); - std::cout << headerLine(oss.str()); - std::cout << headerLine("Score is " + data["score_name"].get()); - std::cout << std::string(MAXL, '*') << std::endl; - std::cout << std::endl; + sheader << headerLine(oss.str()); + sheader << headerLine("Score is " + data["score_name"].get()); + sheader << std::string(MAXL, '*') << std::endl; + sheader << std::endl; } - void ReportConsole::body() + void ReportConsole::header() { + std::cout << sheader.str(); + } + std::string ReportConsole::fileReport() + { + do_header(); + do_body(); + std::stringstream oss; + oss << sheader.str() << sbody.str(); + return oss.str(); + } + void ReportConsole::do_body() + { + sbody.str(""); auto tmp = ConfigLocale(); int maxHyper = 15; int maxDataset = 7; @@ -44,8 +56,8 @@ namespace platform { maxDataset = std::max(maxDataset, (int)r["dataset"].get().size()); } - std::cout << Colors::GREEN() << " # " << std::setw(maxDataset) << std::left << "Dataset" << " Sampl. Feat. Cls Nodes Edges States Score Time Hyperparameters" << std::endl; - std::cout << "=== " << std::string(maxDataset, '=') << " ====== ===== === ========= ========= ========= =============== =================== " << std::string(maxHyper, '=') << std::endl; + 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; json lastResult; double totalScore = 0.0; int index = 0; @@ -55,47 +67,51 @@ namespace platform { continue; } auto color = (index % 2) ? Colors::CYAN() : Colors::BLUE(); - std::cout << color; + sbody << color; std::string separator{ " " }; if (r.find("notes") != r.end()) { separator = r["notes"].size() > 0 ? Colors::YELLOW() + Symbols::notebook + color : " "; } - std::cout << std::setw(3) << std::right << index++ << separator; - std::cout << std::setw(maxDataset) << std::left << r["dataset"].get() << " "; - std::cout << std::setw(6) << std::right << r["samples"].get() << " "; - std::cout << std::setw(5) << std::right << r["features"].get() << " "; - std::cout << std::setw(3) << std::right << r["classes"].get() << " "; - std::cout << std::setw(9) << std::setprecision(2) << std::fixed << r["nodes"].get() << " "; - std::cout << std::setw(9) << std::setprecision(2) << std::fixed << r["leaves"].get() << " "; - std::cout << std::setw(9) << std::setprecision(2) << std::fixed << r["depth"].get() << " "; - std::cout << std::setw(8) << std::right << std::setprecision(6) << std::fixed << r["score"].get() << "±" << std::setw(6) << std::setprecision(4) << std::fixed << r["score_std"].get(); + sbody << std::setw(3) << std::right << index++ << separator; + sbody << std::setw(maxDataset) << std::left << r["dataset"].get() << " "; + sbody << std::setw(6) << std::right << r["samples"].get() << " "; + sbody << std::setw(5) << std::right << r["features"].get() << " "; + sbody << std::setw(3) << std::right << r["classes"].get() << " "; + sbody << std::setw(9) << std::setprecision(2) << std::fixed << r["nodes"].get() << " "; + sbody << std::setw(9) << std::setprecision(2) << std::fixed << r["leaves"].get() << " "; + sbody << std::setw(9) << std::setprecision(2) << std::fixed << r["depth"].get() << " "; + sbody << std::setw(8) << std::right << std::setprecision(6) << std::fixed << r["score"].get() << "±" << std::setw(6) << std::setprecision(4) << std::fixed << r["score_std"].get(); const std::string status = compareResult(r["dataset"].get(), r["score"].get()); - std::cout << status; - std::cout << std::setw(12) << std::right << std::setprecision(6) << std::fixed << r["time"].get() << "±" << std::setw(6) << std::setprecision(4) << std::fixed << r["time_std"].get() << " "; - std::cout << r["hyperparameters"].dump(); - std::cout << std::endl; - std::cout << std::flush; + sbody << status; + sbody << std::setw(12) << std::right << std::setprecision(6) << std::fixed << r["time"].get() << "±" << std::setw(6) << std::setprecision(4) << std::fixed << r["time_std"].get() << " "; + sbody << r["hyperparameters"].dump(); + sbody << std::endl; + sbody << std::flush; lastResult = r; totalScore += r["score"].get(); } if (data["results"].size() == 1 || selectedIndex != -1) { - std::cout << std::string(MAXL, '*') << std::endl; + sbody << std::string(MAXL, '*') << std::endl; if (lastResult.find("notes") != lastResult.end()) { if (lastResult["notes"].size() > 0) { - std::cout << headerLine("Notes: "); + sbody << headerLine("Notes: "); for (const auto& note : lastResult["notes"]) { - std::cout << headerLine(note.get()); + sbody << headerLine(note.get()); } } } - std::cout << headerLine(fVector("Train scores: ", lastResult["scores_train"], 14, 12)); - std::cout << headerLine(fVector("Test scores: ", lastResult["scores_test"], 14, 12)); - std::cout << headerLine(fVector("Train times: ", lastResult["times_train"], 10, 3)); - std::cout << headerLine(fVector("Test times: ", lastResult["times_test"], 10, 3)); + 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)); } else { footer(totalScore); } - std::cout << std::string(MAXL, '*') << Colors::RESET() << std::endl; + sbody << std::string(MAXL, '*') << Colors::RESET() << std::endl; + } + void ReportConsole::body() + { + std::cout << sbody.str(); } void ReportConsole::showSummary() { @@ -104,20 +120,20 @@ namespace platform { oss << std::setw(3) << std::left << item.first; oss << std::setw(3) << std::right << item.second << " "; oss << std::left << meaning.at(item.first); - std::cout << headerLine(oss.str(), 2); + sbody << headerLine(oss.str(), 2); } } void ReportConsole::footer(double totalScore) { - std::cout << Colors::MAGENTA() << std::string(MAXL, '*') << std::endl; + sbody << Colors::MAGENTA() << std::string(MAXL, '*') << std::endl; showSummary(); auto score = data["score_name"].get(); auto best = BestScore::getScore(score); if (best.first != "") { std::stringstream oss; oss << score << " compared to " << best.first << " .: " << totalScore / best.second; - std::cout << headerLine(oss.str()); + sbody << headerLine(oss.str()); } if (!getExistBestFile() && compare) { std::cout << headerLine("*** Best Results File not found. Couldn't compare any result!"); diff --git a/src/reports/ReportConsole.h b/src/reports/ReportConsole.h index 07bdd36..18d3588 100644 --- a/src/reports/ReportConsole.h +++ b/src/reports/ReportConsole.h @@ -2,6 +2,7 @@ #include #include "common/Colors.h" +#include #include "ReportBase.h" namespace platform { @@ -10,12 +11,17 @@ namespace platform { public: explicit ReportConsole(json data_, bool compare = false, int index = -1) : ReportBase(data_, compare), selectedIndex(index) {}; virtual ~ReportConsole() = default; + std::string fileReport(); private: int selectedIndex; std::string headerLine(const std::string& text, int utf); void header() override; + void do_header(); void body() override; + void do_body(); void footer(double totalScore); void showSummary() override; + std::stringstream sheader; + std::stringstream sbody; }; };