Complete best build and report

This commit is contained in:
Ricardo Montañana Gómez 2023-09-22 01:03:55 +02:00
parent c4d0a5b4e6
commit c4f9187e2a
Signed by: rmontanana
GPG Key ID: 46064262FD9A7ADE
4 changed files with 56 additions and 11 deletions

View File

@ -7,11 +7,12 @@
namespace platform { namespace platform {
void BestResults::build() string BestResults::build()
{ {
auto files = loadFiles(); auto files = loadFiles();
if (files.size() == 0) { if (files.size() == 0) {
throw runtime_error("No result files were found!"); cerr << Colors::MAGENTA() << "No result files were found!" << Colors::RESET() << endl;
exit(1);
} }
json bests; json bests;
for (const auto& file : files) { for (const auto& file : files) {
@ -20,7 +21,7 @@ namespace platform {
for (auto const& item : data.at("results")) { for (auto const& item : data.at("results")) {
bool update = false; bool update = false;
if (bests.contains(item.at("dataset").get<string>())) { if (bests.contains(item.at("dataset").get<string>())) {
if (item.at("score").get<double>() > bests["dataset"].at(0).get<double>()) { if (item.at("score").get<double>() > bests[item.at("dataset").get<string>()].at(0).get<double>()) {
update = true; update = true;
} }
} else { } else {
@ -31,14 +32,15 @@ namespace platform {
} }
} }
} }
string bestFileName = path + "/" + bestResultFile(); string bestFileName = path + bestResultFile();
if (FILE* fileTest = fopen(bestFileName.c_str(), "r")) { if (FILE* fileTest = fopen(bestFileName.c_str(), "r")) {
fclose(fileTest); fclose(fileTest);
cout << Colors::MAGENTA() << "File " << bestFileName << " already exists and it shall be overwritten." << Colors::RESET(); cout << Colors::MAGENTA() << "File " << bestFileName << " already exists and it shall be overwritten." << Colors::RESET() << endl;
} }
ofstream file(bestFileName); ofstream file(bestFileName);
file << bests; file << bests;
file.close(); file.close();
return bestFileName;
} }
string BestResults::bestResultFile() string BestResults::bestResultFile()
@ -60,9 +62,43 @@ namespace platform {
} }
return files; return files;
} }
json BestResults::loadFile(const string& fileName)
{
ifstream resultData(fileName);
if (resultData.is_open()) {
json data = json::parse(resultData);
return data;
}
throw invalid_argument("Unable to open result file. [" + fileName + "]");
}
void BestResults::report() void BestResults::report()
{ {
string bestFileName = path + bestResultFile();
if (FILE* fileTest = fopen(bestFileName.c_str(), "r")) {
fclose(fileTest);
} else {
cerr << Colors::MAGENTA() << "File " << bestFileName << " doesn't exist." << Colors::RESET() << endl;
exit(1);
}
auto data = loadFile(bestFileName);
cout << Colors::GREEN() << "Best results for " << model << " and " << score << endl;
cout << "------------------------------------------" << endl;
cout << Colors::GREEN() << " # Dataset Score File Hyperparameters" << endl;
cout << "=== ========================= =========== ================================================================== ================================================= " << endl;
auto i = 0;
bool odd = true;
for (auto const& item : data.items()) {
auto color = odd ? Colors::BLUE() : Colors::CYAN();
cout << color << setw(3) << fixed << right << i++ << " ";
cout << setw(25) << left << item.key() << " ";
cout << setw(11) << setprecision(9) << fixed << item.value().at(0).get<double>() << " ";
cout << setw(66) << item.value().at(2).get<string>() << " ";
cout << item.value().at(1) << " ";
cout << endl;
odd = !odd;
}
} }
} }

View File

@ -1,17 +1,19 @@
#ifndef BESTRESULTS_H #ifndef BESTRESULTS_H
#define BESTRESULTS_H #define BESTRESULTS_H
#include <string> #include <string>
#include <nlohmann/json.hpp>
using namespace std; using namespace std;
using json = nlohmann::json;
namespace platform { namespace platform {
class BestResults { class BestResults {
public: public:
explicit BestResults(const string& path, const string& score, const string& model) : path(path), score(score), model(model) {} explicit BestResults(const string& path, const string& score, const string& model) : path(path), score(score), model(model) {}
void build(); string build();
void report(); void report();
private: private:
vector<string> loadFiles(); vector<string> loadFiles();
string bestResultFile(); string bestResultFile();
json loadFile(const string& fileName);
string path; string path;
string score; string score;
string model; string model;

View File

@ -1,5 +1,6 @@
#include <filesystem> #include <filesystem>
#include <fstream> #include <fstream>
#include <sstream>
#include "Result.h" #include "Result.h"
#include "Colors.h" #include "Colors.h"
#include "BestScore.h" #include "BestScore.h"

View File

@ -2,14 +2,15 @@
#include <argparse/argparse.hpp> #include <argparse/argparse.hpp>
#include "Paths.h" #include "Paths.h"
#include "BestResults.h" #include "BestResults.h"
#include "Colors.h"
using namespace std; using namespace std;
argparse::ArgumentParser manageArguments(int argc, char** argv) argparse::ArgumentParser manageArguments(int argc, char** argv)
{ {
argparse::ArgumentParser program("best"); argparse::ArgumentParser program("best");
program.add_argument("-m", "--model").default_value("any").help("Filter results of the selected model)"); program.add_argument("-m", "--model").default_value("").help("Filter results of the selected model)");
program.add_argument("-s", "--score").default_value("any").help("Filter results of the score name supplied"); program.add_argument("-s", "--score").default_value("").help("Filter results of the score name supplied");
program.add_argument("--build").help("build best score results file").default_value(false).implicit_value(true); program.add_argument("--build").help("build best score results file").default_value(false).implicit_value(true);
program.add_argument("--report").help("report of best score results file").default_value(false).implicit_value(true); program.add_argument("--report").help("report of best score results file").default_value(false).implicit_value(true);
try { try {
@ -18,6 +19,9 @@ argparse::ArgumentParser manageArguments(int argc, char** argv)
auto score = program.get<string>("score"); auto score = program.get<string>("score");
auto build = program.get<bool>("build"); auto build = program.get<bool>("build");
auto report = program.get<bool>("report"); auto report = program.get<bool>("report");
if (model == "" || score == "") {
throw runtime_error("Model and score name must be supplied");
}
} }
catch (const exception& err) { catch (const exception& err) {
cerr << err.what() << endl; cerr << err.what() << endl;
@ -35,12 +39,14 @@ int main(int argc, char** argv)
auto build = program.get<bool>("build"); auto build = program.get<bool>("build");
auto report = program.get<bool>("report"); auto report = program.get<bool>("report");
if (!report && !build) { if (!report && !build) {
cout << "Either build, report or both, have to be selected to do anything!" << endl; cerr << "Either build, report or both, have to be selected to do anything!" << endl;
cerr << program;
exit(1); exit(1);
} }
auto results = platform::BestResults(platform::Paths::results(), model, score); auto results = platform::BestResults(platform::Paths::results(), model, score);
if (build) { if (build) {
results.build(); string fileName = results.build();
cout << Colors::GREEN() << fileName << " created!" << Colors::RESET() << endl;
} }
if (report) { if (report) {
results.report(); results.report();