From fa4f47ff351fb8203d06755013037832d7ca655d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana=20G=C3=B3mez?= Date: Sun, 17 Mar 2024 01:22:50 +0100 Subject: [PATCH] Create Base class for paged reports --- src/CMakeLists.txt | 4 +-- src/commands/b_list.cpp | 2 +- src/reports/DatasetsConsole.cpp | 17 +------------ src/reports/DatasetsConsole.h | 10 ++------ src/reports/ReportsPaged.cpp | 24 ++++++++++++++++++ src/reports/ReportsPaged.h | 26 +++++++++++++++++++ src/reports/ResultsDatasetConsole.cpp | 36 ++++++++++++++------------- src/reports/ResultsDatasetConsole.h | 12 +++------ 8 files changed, 78 insertions(+), 53 deletions(-) create mode 100644 src/reports/ReportsPaged.cpp create mode 100644 src/reports/ReportsPaged.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fcfab10..62ab63c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -40,7 +40,7 @@ target_link_libraries(b_grid ${MPI_CXX_LIBRARIES} "${PyClassifiers}" "${BayesNet add_executable(b_list commands/b_list.cpp ${list_sources} common/Datasets.cpp common/Dataset.cpp main/Models.cpp - reports/ReportExcel.cpp reports/ExcelFile.cpp reports/ReportBase.cpp reports/DatasetsExcel.cpp reports/DatasetsConsole.cpp reports/ResultsDatasetConsole.cpp + reports/ReportExcel.cpp reports/ExcelFile.cpp reports/ReportBase.cpp reports/DatasetsExcel.cpp reports/DatasetsConsole.cpp reports/ResultsDatasetConsole.cpp reports/ReportsPaged.cpp results/Result.cpp results/ResultsDatasetExcel.cpp results/ResultsDataset.cpp ) target_link_libraries(b_list "${PyClassifiers}" "${BayesNet}" ArffFiles mdlp ${Python3_LIBRARIES} "${TORCH_LIBRARIES}" ${LIBTORCH_PYTHON} Boost::python Boost::numpy "${XLSXWRITER_LIB}") @@ -61,7 +61,7 @@ list(TRANSFORM manage_sources PREPEND manage/) add_executable( b_manage commands/b_manage.cpp ${manage_sources} common/Datasets.cpp common/Dataset.cpp - reports/ReportConsole.cpp reports/ReportExcel.cpp reports/ReportExcelCompared.cpp reports/ReportBase.cpp reports/ExcelFile.cpp reports/DatasetsConsole.cpp reports/ResultsDatasetConsole.cpp + reports/ReportConsole.cpp reports/ReportExcel.cpp reports/ReportExcelCompared.cpp reports/ReportBase.cpp reports/ExcelFile.cpp reports/DatasetsConsole.cpp reports/ResultsDatasetConsole.cpp reports/ReportsPaged.cpp results/Result.cpp results/ResultsDataset.cpp ) target_link_libraries(b_manage "${TORCH_LIBRARIES}" "${XLSXWRITER_LIB}" ArffFiles mdlp) diff --git a/src/commands/b_list.cpp b/src/commands/b_list.cpp index 75472c8..f48dd2e 100644 --- a/src/commands/b_list.cpp +++ b/src/commands/b_list.cpp @@ -37,7 +37,7 @@ void list_results(argparse::ArgumentParser& program) auto model = program.get("model"); auto excel = program.get("excel"); auto report = platform::ResultsDatasetsConsole(); - report.list_results(dataset, score, model); + report.report(dataset, score, model); std::cout << report.getOutput(); if (excel) { auto data = report.getData(); diff --git a/src/reports/DatasetsConsole.cpp b/src/reports/DatasetsConsole.cpp index 1724a53..06da29f 100644 --- a/src/reports/DatasetsConsole.cpp +++ b/src/reports/DatasetsConsole.cpp @@ -18,25 +18,11 @@ namespace platform { line += temp + "\n"; body.push_back(line); } - std::string DatasetsConsole::getOutput() const - { - std::string s; - for (const auto& piece : header) s += piece; - for (const auto& piece : body) s += piece; - return s; - } - std::string DatasetsConsole::getHeader() const - { - std::string s; - for (const auto& piece : header) s += piece; - return s; - } void DatasetsConsole::report() { header.clear(); body.clear(); auto datasets = platform::Datasets(false, platform::Paths::datasets()); - auto loc = std::locale("es_ES.UTF-8"); std::stringstream sheader; auto datasets_names = datasets.getNames(); int maxName = std::max(size_t(7), (*max_element(datasets_names.begin(), datasets_names.end(), [](const std::string& a, const std::string& b) { return a.size() < b.size(); })).size()); @@ -66,9 +52,8 @@ namespace platform { line << setw(6) << right << nSamples << " "; line << setw(5) << right << datasets.getFeatures(dataset).size() << " "; line << setw(3) << right << datasets.getNClasses(dataset) << " "; - std::stringstream oss; - oss.imbue(loc); std::string sep = ""; + oss.str(""); for (auto number : datasets.getClassesCounts(dataset)) { oss << sep << std::setprecision(2) << fixed << (float)number / nSamples * 100.0 << "% (" << number << ")"; sep = " / "; diff --git a/src/reports/DatasetsConsole.h b/src/reports/DatasetsConsole.h index 289eb22..1aff5ca 100644 --- a/src/reports/DatasetsConsole.h +++ b/src/reports/DatasetsConsole.h @@ -3,26 +3,20 @@ #include #include #include +#include "ReportsPaged.h" namespace platform { using json = nlohmann::json; - class DatasetsConsole { + class DatasetsConsole : public ReportsPaged { public: static const int BALANCE_LENGTH; DatasetsConsole() = default; ~DatasetsConsole() = default; - std::string getOutput() const; - std::string getHeader() const; - std::vector& getBody() { return body; } - int getNumLines() const { return body.size(); } - json& getData() { return data; } void report(); private: void split_lines(int name_len, std::string line, const std::string& balance); - std::vector header, body; - json data; }; } diff --git a/src/reports/ReportsPaged.cpp b/src/reports/ReportsPaged.cpp new file mode 100644 index 0000000..528ace9 --- /dev/null +++ b/src/reports/ReportsPaged.cpp @@ -0,0 +1,24 @@ +#include "common/Colors.h" +#include "ReportsPaged.h" + +namespace platform { + ReportsPaged::ReportsPaged() + { + loc = std::locale("es_ES.UTF-8"); + oss.imbue(loc); + } + std::string ReportsPaged::getOutput() const + { + std::string s; + for (const auto& piece : header) s += piece; + for (const auto& piece : body) s += piece; + return s; + } + std::string ReportsPaged::getHeader() const + { + std::string s; + for (const auto& piece : header) s += piece; + return s; + } +} + diff --git a/src/reports/ReportsPaged.h b/src/reports/ReportsPaged.h new file mode 100644 index 0000000..f861466 --- /dev/null +++ b/src/reports/ReportsPaged.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include + +namespace platform { + using json = nlohmann::json; + + class ReportsPaged { + public: + ReportsPaged(); + ~ReportsPaged() = default; + std::string getOutput() const; + std::string getHeader() const; + std::vector& getBody() { return body; } + int getNumLines() const { return body.size(); } + json& getData() { return data; } + protected: + std::vector header, body; + json data; + std::stringstream oss; + std::locale loc; + }; +} + diff --git a/src/reports/ResultsDatasetConsole.cpp b/src/reports/ResultsDatasetConsole.cpp index bd8a683..470b025 100644 --- a/src/reports/ResultsDatasetConsole.cpp +++ b/src/reports/ResultsDatasetConsole.cpp @@ -1,18 +1,16 @@ +#include #include "common/Colors.h" #include "results/ResultsDataset.h" #include "ResultsDatasetConsole.h" namespace platform { - void ResultsDatasetsConsole::list_results(const std::string& dataset, const std::string& score, const std::string& model) + void ResultsDatasetsConsole::report(const std::string& dataset, const std::string& score, const std::string& model) { - output.str(""); - auto loc = std::locale("es_ES"); - output.imbue(loc); auto results = platform::ResultsDataset(dataset, model, score); results.load(); results.sortModel(); if (results.empty()) { - output << Colors::RED() << "No results found for dataset " << dataset << " and model " << model << Colors::RESET() << std::endl; + std::cerr << Colors::RED() << "No results found for dataset " << dataset << " and model " << model << Colors::RESET() << std::endl; return; } int maxModel = results.maxModelSize(); @@ -55,24 +53,28 @@ namespace platform { // // List the results // - output << Colors::GREEN() << "Results of dataset " << dataset << " - for " << model << " model" << std::endl; - output << "There are " << results.size() << " results" << std::endl; - output << Colors::GREEN() << " # " << std::setw(maxModel + 1) << std::left << "Model" << "Date Time Score Hyperparameters" << std::endl; - output << "=== " << std::string(maxModel, '=') << " ========== ======== =========== " << std::string(maxHyper, '=') << std::endl; - numLines = 4; + oss.str(""); + header.clear(); + body.clear(); + oss << Colors::GREEN() << "Results of dataset " << dataset << " - for " << model << " model" << std::endl; + oss << "There are " << results.size() << " results" << std::endl; + oss << Colors::GREEN() << " # " << std::setw(maxModel + 1) << std::left << "Model" << "Date Time Score Hyperparameters" << std::endl; + oss << "=== " << std::string(maxModel, '=') << " ========== ======== =========== " << std::string(maxHyper, '=') << std::endl; + header.push_back(oss.str()); auto i = 0; for (const auto& item : data["results"]) { + oss.str(""); auto color = (i % 2) ? Colors::BLUE() : Colors::CYAN(); auto score = item["score"].get(); color = score == data["max_models"][item["model"].get()] ? Colors::YELLOW() : color; color = score == maxResult ? Colors::RED() : color; - output << color << std::setw(3) << std::fixed << std::right << i++ << " "; - output << std::setw(maxModel) << std::left << item["model"].get() << " "; - output << color << item["date"].get() << " "; - output << color << item["time"].get() << " "; - output << std::setw(11) << std::setprecision(9) << std::fixed << score << " "; - output << item["hyperparameters"].get() << std::endl; - numLines++; + oss << color << std::setw(3) << std::fixed << std::right << i++ << " "; + oss << std::setw(maxModel) << std::left << item["model"].get() << " "; + oss << color << item["date"].get() << " "; + oss << color << item["time"].get() << " "; + oss << std::setw(11) << std::setprecision(9) << std::fixed << score << " "; + oss << item["hyperparameters"].get() << std::endl; + body.push_back(oss.str()); } } } diff --git a/src/reports/ResultsDatasetConsole.h b/src/reports/ResultsDatasetConsole.h index ee54987..75bcc1d 100644 --- a/src/reports/ResultsDatasetConsole.h +++ b/src/reports/ResultsDatasetConsole.h @@ -5,20 +5,14 @@ #include #include #include "results/ResultsDataset.h" +#include "ReportsPaged.h" namespace platform { - class ResultsDatasetsConsole { + class ResultsDatasetsConsole : public ReportsPaged { public: ResultsDatasetsConsole() = default; ~ResultsDatasetsConsole() = default; - std::string getOutput() const { return output.str(); } - int getNumLines() const { return numLines; } - json& getData() { return data; } - void list_results(const std::string& dataset, const std::string& score, const std::string& model); - private: - std::stringstream output; - json data; - int numLines = 0; + void report(const std::string& dataset, const std::string& score, const std::string& model); }; }