Continue TeX output
This commit is contained in:
@@ -20,8 +20,8 @@ include_directories(
|
|||||||
# b_best
|
# b_best
|
||||||
add_executable(
|
add_executable(
|
||||||
b_best commands/b_best.cpp best/Statistics.cpp
|
b_best commands/b_best.cpp best/Statistics.cpp
|
||||||
best/BestResultsExcel.cpp best/BestResults.cpp
|
best/BestResultsExcel.cpp best/BestResultsTex.cpp best/BestResults.cpp
|
||||||
common/Datasets.cpp common/Dataset.cpp common/Discretization.cpp
|
common/Datasets.cpp common/Dataset.cpp common/Discretization.cpp
|
||||||
main/Models.cpp main/Scores.cpp
|
main/Models.cpp main/Scores.cpp
|
||||||
reports/ReportExcel.cpp reports/ReportBase.cpp reports/ExcelFile.cpp
|
reports/ReportExcel.cpp reports/ReportBase.cpp reports/ExcelFile.cpp
|
||||||
results/Result.cpp
|
results/Result.cpp
|
||||||
|
@@ -7,8 +7,10 @@
|
|||||||
#include "common/Colors.h"
|
#include "common/Colors.h"
|
||||||
#include "common/CLocale.h"
|
#include "common/CLocale.h"
|
||||||
#include "common/Paths.h"
|
#include "common/Paths.h"
|
||||||
|
#include "common/Utils.h" // compute_std
|
||||||
#include "results/Result.h"
|
#include "results/Result.h"
|
||||||
#include "BestResultsExcel.h"
|
#include "BestResultsExcel.h"
|
||||||
|
#include "BestResultsTex.h"
|
||||||
#include "best/Statistics.h"
|
#include "best/Statistics.h"
|
||||||
#include "BestResults.h"
|
#include "BestResults.h"
|
||||||
|
|
||||||
@@ -210,56 +212,20 @@ namespace platform {
|
|||||||
table["dateTable"] = ftime_to_string(maxDate);
|
table["dateTable"] = ftime_to_string(maxDate);
|
||||||
return table;
|
return table;
|
||||||
}
|
}
|
||||||
double compute_std(std::vector<double> values, double mean)
|
|
||||||
{
|
|
||||||
// Compute standard devation of the values
|
|
||||||
double sum = 0.0;
|
|
||||||
for (const auto& value : values) {
|
|
||||||
sum += std::pow(value - mean, 2);
|
|
||||||
}
|
|
||||||
double variance = sum / values.size();
|
|
||||||
return std::sqrt(variance);
|
|
||||||
}
|
|
||||||
void BestResults::printTableResults(std::vector<std::string> models, json table, bool tex)
|
void BestResults::printTableResults(std::vector<std::string> models, json table, bool tex)
|
||||||
{
|
{
|
||||||
std::stringstream oss;
|
std::stringstream oss;
|
||||||
oss << Colors::GREEN() << "Best results for " << score << " as of " << table.at("dateTable").get<std::string>() << std::endl;
|
oss << Colors::GREEN() << "Best results for " << score << " as of " << table.at("dateTable").get<std::string>() << std::endl;
|
||||||
std::FILE* output_tex;
|
|
||||||
std::cout << oss.str();
|
std::cout << oss.str();
|
||||||
std::cout << std::string(oss.str().size() - 8, '-') << std::endl;
|
std::cout << std::string(oss.str().size() - 8, '-') << std::endl;
|
||||||
std::cout << Colors::GREEN() << " # " << std::setw(maxDatasetName + 1) << std::left << std::string("Dataset");
|
std::cout << Colors::GREEN() << " # " << std::setw(maxDatasetName + 1) << std::left << std::string("Dataset");
|
||||||
|
auto bestResultsTex = BestResultsTex(models, table.at("dateTable").get<std::string>());
|
||||||
if (tex) {
|
if (tex) {
|
||||||
auto file_name = Paths::tex_output();
|
bestResultsTex.results_header();
|
||||||
output_tex = fopen(file_name.c_str(), "w");
|
|
||||||
if (output_tex == NULL) {
|
|
||||||
std::cerr << "Error opening file "<< file_name << std::endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
fprintf(output_tex, "%% This file has been generated by the platform program\n");
|
|
||||||
fprintf(output_tex, "%% Date: %s\n", table.at("dateTable").get<std::string>().c_str());
|
|
||||||
fprintf(output_tex, "%%\n");
|
|
||||||
fprintf(output_tex, "%% Table of results\n");
|
|
||||||
fprintf(output_tex, "%%\n");
|
|
||||||
fprintf(output_tex, "\\begin{table}[htbp] \n");
|
|
||||||
fprintf(output_tex, "\\centering \n");
|
|
||||||
fprintf(output_tex, "\\tiny \n");
|
|
||||||
fprintf(output_tex, "\\renewcommand{\\arraystretch }{1.2} \n");
|
|
||||||
fprintf(output_tex, "\\renewcommand{\\tabcolsep }{0.07cm} \n");
|
|
||||||
fprintf(output_tex, "\\caption{Accuracy results(mean ± std) for all the algorithms and datasets} \n");
|
|
||||||
fprintf(output_tex, "\\label{tab:results_accuracy}\n");
|
|
||||||
fprintf(output_tex, "\\begin{tabular} {{r%s}}\n", std::string(models.size(), 'c').c_str());
|
|
||||||
fprintf(output_tex, "\\hline \n");
|
|
||||||
fprintf(output_tex, "Id");
|
|
||||||
}
|
}
|
||||||
for (const auto& model : models) {
|
for (const auto& model : models) {
|
||||||
std::cout << std::setw(maxModelName) << std::left << model << " ";
|
std::cout << std::setw(maxModelName) << std::left << model << " ";
|
||||||
if (tex) {
|
|
||||||
fprintf(output_tex, "& %s ", model.c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tex) {
|
|
||||||
fprintf(output_tex, "\\\\ \n");
|
|
||||||
fprintf(output_tex, "\\hline \n");
|
|
||||||
}
|
}
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
std::cout << "=== " << std::string(maxDatasetName, '=') << " ";
|
std::cout << "=== " << std::string(maxDatasetName, '=') << " ";
|
||||||
@@ -271,7 +237,9 @@ namespace platform {
|
|||||||
std::map<std::string, std::vector<double>> totals;
|
std::map<std::string, std::vector<double>> totals;
|
||||||
int nDatasets = table.begin().value().size();
|
int nDatasets = table.begin().value().size();
|
||||||
auto datasets = getDatasets(table.begin().value());
|
auto datasets = getDatasets(table.begin().value());
|
||||||
|
if (tex) {
|
||||||
|
bestResultsTex.results_body(datasets, table);
|
||||||
|
}
|
||||||
for (auto const& dataset_ : datasets) {
|
for (auto const& dataset_ : datasets) {
|
||||||
auto color = (i % 2) ? Colors::BLUE() : Colors::CYAN();
|
auto color = (i % 2) ? Colors::BLUE() : Colors::CYAN();
|
||||||
std::cout << color << std::setw(3) << std::fixed << std::right << i++ << " ";
|
std::cout << color << std::setw(3) << std::fixed << std::right << i++ << " ";
|
||||||
@@ -290,9 +258,6 @@ namespace platform {
|
|||||||
maxValue = value;
|
maxValue = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tex) {
|
|
||||||
fprintf(output_tex, "%d ", i);
|
|
||||||
}
|
|
||||||
// Print the row with red colors on max values
|
// Print the row with red colors on max values
|
||||||
for (const auto& model : models) {
|
for (const auto& model : models) {
|
||||||
std::string efectiveColor = color;
|
std::string efectiveColor = color;
|
||||||
@@ -312,16 +277,8 @@ namespace platform {
|
|||||||
totals[model].push_back(value);
|
totals[model].push_back(value);
|
||||||
std::cout << efectiveColor << std::setw(maxModelName) << std::setprecision(maxModelName - 2) << std::fixed << value << " ";
|
std::cout << efectiveColor << std::setw(maxModelName) << std::setprecision(maxModelName - 2) << std::fixed << value << " ";
|
||||||
}
|
}
|
||||||
if (tex) {
|
|
||||||
auto std_value = table[model].at(dataset_).at(3).get<double>();
|
|
||||||
const char* bold = value == maxValue ? "\\bfseries" : "";
|
|
||||||
fprintf(output_tex, "& %s %0.4f±%0.3f", bold, value, std_value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
if (tex) {
|
|
||||||
fprintf(output_tex, "\\\\\n");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
std::cout << Colors::GREEN() << "=== " << std::string(maxDatasetName, '=') << " ";
|
std::cout << Colors::GREEN() << "=== " << std::string(maxDatasetName, '=') << " ";
|
||||||
for (const auto& model : models) {
|
for (const auto& model : models) {
|
||||||
@@ -339,23 +296,14 @@ namespace platform {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tex) {
|
if (tex) {
|
||||||
fprintf(output_tex, "\\hline \n");
|
bestResultsTex.results_footer(totals, best_model);
|
||||||
fprintf(output_tex, "Average ");
|
|
||||||
}
|
}
|
||||||
for (const auto& model : models) {
|
for (const auto& model : models) {
|
||||||
std::string efectiveColor = model == best_model ? Colors::RED() : Colors::GREEN();
|
std::string efectiveColor = model == best_model ? Colors::RED() : Colors::GREEN();
|
||||||
double value = std::reduce(totals[model].begin(), totals[model].end()) / nDatasets;
|
double value = std::reduce(totals[model].begin(), totals[model].end()) / nDatasets;
|
||||||
double std_value = compute_std(totals[model], value);
|
double std_value = compute_std(totals[model], value);
|
||||||
std::cout << efectiveColor << std::right << std::setw(maxModelName) << std::setprecision(maxModelName - 4) << std::fixed << value << " ";
|
std::cout << efectiveColor << std::right << std::setw(maxModelName) << std::setprecision(maxModelName - 4) << std::fixed << value << " ";
|
||||||
if (tex) {
|
|
||||||
const char* bold = model == best_model ? "\\bfseries" : "";
|
|
||||||
fprintf(output_tex, "& %s %0.4f±%0.3f", bold, value, std_value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tex) {
|
|
||||||
// Footer for TeX
|
|
||||||
fprintf(output_tex, "\\ \n\\hline \n\\end{tabular}\n\\end{table}\n");
|
|
||||||
fclose(output_tex);
|
|
||||||
}
|
}
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
}
|
}
|
||||||
@@ -389,7 +337,7 @@ namespace platform {
|
|||||||
ranksModels = stats.getRanks();
|
ranksModels = stats.getRanks();
|
||||||
}
|
}
|
||||||
if (tex) {
|
if (tex) {
|
||||||
messageOutputFile("TeX", Paths::tex_output());
|
messageOutputFile("TeX", Paths::tex() + Paths::tex_output());
|
||||||
}
|
}
|
||||||
if (excel) {
|
if (excel) {
|
||||||
BestResultsExcel excel(score, datasets);
|
BestResultsExcel excel(score, datasets);
|
||||||
|
85
src/best/BestResultsTex.cpp
Normal file
85
src/best/BestResultsTex.cpp
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include "BestResultsTex.h"
|
||||||
|
#include "common/Utils.h" // compute_std
|
||||||
|
|
||||||
|
namespace platform {
|
||||||
|
using json = nlohmann::ordered_json;
|
||||||
|
BestResultsTex::BestResultsTex(const std::vector<std::string>& models, const std::string& date) : models(models), date(date)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void BestResultsTex::results_header()
|
||||||
|
{
|
||||||
|
auto file_name = Paths::tex() + Paths::tex_output();
|
||||||
|
output_tex = fopen(file_name.c_str(), "w");
|
||||||
|
if (output_tex == NULL) {
|
||||||
|
std::cerr << "Error opening file " << file_name << std::endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
fprintf(output_tex, "%% This file has been generated by the platform program\n");
|
||||||
|
fprintf(output_tex, "%% Date: %s\n", date.c_str());
|
||||||
|
fprintf(output_tex, "%%\n");
|
||||||
|
fprintf(output_tex, "%% Table of results\n");
|
||||||
|
fprintf(output_tex, "%%\n");
|
||||||
|
fprintf(output_tex, "\\begin{table}[htbp] \n");
|
||||||
|
fprintf(output_tex, "\\centering \n");
|
||||||
|
fprintf(output_tex, "\\tiny \n");
|
||||||
|
fprintf(output_tex, "\\renewcommand{\\arraystretch }{1.2} \n");
|
||||||
|
fprintf(output_tex, "\\renewcommand{\\tabcolsep }{0.07cm} \n");
|
||||||
|
fprintf(output_tex, "\\caption{Accuracy results(mean ± std) for all the algorithms and datasets} \n");
|
||||||
|
fprintf(output_tex, "\\label{tab:results_accuracy}\n");
|
||||||
|
fprintf(output_tex, "\\begin{tabular} {{r%s}}\n", std::string(models.size(), 'c').c_str());
|
||||||
|
fprintf(output_tex, "\\hline \n");
|
||||||
|
fprintf(output_tex, "Id");
|
||||||
|
for (const auto& model : models) {
|
||||||
|
fprintf(output_tex, "& %s ", model.c_str());
|
||||||
|
}
|
||||||
|
fprintf(output_tex, "\\\\ \n");
|
||||||
|
fprintf(output_tex, "\\hline \n");
|
||||||
|
}
|
||||||
|
void BestResultsTex::results_body(const std::vector<std::string>& datasets, json& table)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
for (auto const& dataset : datasets) {
|
||||||
|
// Find out max value for this dataset
|
||||||
|
double max_value = 0;
|
||||||
|
// Find out the max value for this dataset
|
||||||
|
for (const auto& model : models) {
|
||||||
|
double value;
|
||||||
|
try {
|
||||||
|
value = table[model].at(dataset).at(0).get<double>();
|
||||||
|
}
|
||||||
|
catch (nlohmann::json_abi_v3_11_3::detail::out_of_range err) {
|
||||||
|
value = -1.0;
|
||||||
|
}
|
||||||
|
if (value > max_value) {
|
||||||
|
max_value = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(output_tex, "%d ", i);
|
||||||
|
for (const auto& model : models) {
|
||||||
|
double value = table[model].at(dataset).at(0).get<double>();
|
||||||
|
double std_value = table[model].at(dataset).at(3).get<double>();
|
||||||
|
const char* bold = value == max_value ? "\\bfseries" : "";
|
||||||
|
fprintf(output_tex, "& %s %0.4f±%0.3f", bold, value, std_value);
|
||||||
|
}
|
||||||
|
fprintf(output_tex, "\\\\\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void BestResultsTex::results_footer(const std::map<std::string, std::vector<double>>& totals, const std::string& best_model)
|
||||||
|
{
|
||||||
|
fprintf(output_tex, "\\hline \n");
|
||||||
|
fprintf(output_tex, "Average ");
|
||||||
|
int nDatasets = totals.begin()->second.size();
|
||||||
|
for (const auto& model : models) {
|
||||||
|
double value = std::reduce(totals.at(model).begin(), totals.at(model).end()) / nDatasets;
|
||||||
|
double std_value = compute_std(totals.at(model), value);
|
||||||
|
const char* bold = model == best_model ? "\\bfseries" : "";
|
||||||
|
fprintf(output_tex, "& %s %0.4f±%0.3f", bold, value, std_value);
|
||||||
|
}
|
||||||
|
fprintf(output_tex, "\\ \n");
|
||||||
|
fprintf(output_tex, "\\hline \n");
|
||||||
|
fprintf(output_tex, "\\end{tabular}\n");
|
||||||
|
fprintf(output_tex, "\\end{table}\n");
|
||||||
|
fclose(output_tex);
|
||||||
|
}
|
||||||
|
}
|
22
src/best/BestResultsTex.h
Normal file
22
src/best/BestResultsTex.h
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#ifndef BEST_RESULTS_TEX_H
|
||||||
|
#define BEST_RESULTS_TEX_H
|
||||||
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
#include "common/Paths.h"
|
||||||
|
namespace platform {
|
||||||
|
using json = nlohmann::ordered_json;
|
||||||
|
class BestResultsTex {
|
||||||
|
public:
|
||||||
|
BestResultsTex(const std::vector<std::string>& models, const std::string& date);
|
||||||
|
~BestResultsTex() = default;
|
||||||
|
void results_header();
|
||||||
|
void results_body(const std::vector<std::string>& datasets, json& table);
|
||||||
|
void results_footer(const std::map<std::string, std::vector<double>>& totals, const std::string& best_model);
|
||||||
|
private:
|
||||||
|
std::FILE* output_tex;
|
||||||
|
std::vector<std::string> models;
|
||||||
|
std::string date;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
@@ -6,12 +6,19 @@
|
|||||||
namespace platform {
|
namespace platform {
|
||||||
class Paths {
|
class Paths {
|
||||||
public:
|
public:
|
||||||
static std::string results() { return "results/"; }
|
static std::string createIfNotExists(const std::string& folder)
|
||||||
static std::string hiddenResults() { return "hidden_results/"; }
|
{
|
||||||
static std::string excel() { return "excel/"; }
|
if (!std::filesystem::exists(folder)) {
|
||||||
static std::string grid() { return "grid/"; }
|
std::filesystem::create_directory(folder);
|
||||||
static std::string graphs() { return "graphs/"; }
|
}
|
||||||
static std::string tex() { return "tex/"; }
|
return folder;
|
||||||
|
}
|
||||||
|
static std::string results() { return createIfNotExists("results/"); }
|
||||||
|
static std::string hiddenResults() { return createIfNotExists("hidden_results/"); }
|
||||||
|
static std::string excel() { return createIfNotExists("excel/"); }
|
||||||
|
static std::string grid() { return createIfNotExists("grid/"); }
|
||||||
|
static std::string graphs() { return createIfNotExists("graphs/"); }
|
||||||
|
static std::string tex() { return createIfNotExists("tex/"); }
|
||||||
static std::string datasets()
|
static std::string datasets()
|
||||||
{
|
{
|
||||||
auto env = platform::DotEnv();
|
auto env = platform::DotEnv();
|
||||||
|
@@ -36,5 +36,15 @@ namespace platform {
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
double compute_std(std::vector<double> values, double mean)
|
||||||
|
{
|
||||||
|
// Compute standard devation of the values
|
||||||
|
double sum = 0.0;
|
||||||
|
for (const auto& value : values) {
|
||||||
|
sum += std::pow(value - mean, 2);
|
||||||
|
}
|
||||||
|
double variance = sum / values.size();
|
||||||
|
return std::sqrt(variance);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
Reference in New Issue
Block a user