| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- // =====================================================================================
- //
- // Filename: latex_table.cpp
- //
- // Description:
- //
- // Version: 1.0
- // Created: 2018年 02月 19日 星期一 16:42:17 CST
- // Revision: none
- // Compiler: g++
- //
- // Author: Jinkun Lin, jkunlin@gmail.com
- // Organization: School of EECS, Peking University
- //
- // =====================================================================================
- #include <iostream>
- #include <fstream>
- #include <sstream>
- #include <vector>
- #include <algorithm>
- #include <limits>
- using namespace std;
- string basename(string name) {
- size_t begin = name.find_last_of('/');
- return name.substr(begin + 1, name.size() - begin);
- }
- int main(int argc, char const *argv[]) {
- int solver_count = argc - 1;
- // =====================================================================================
- // read data from file
- // =====================================================================================
- vector<vector<int>> size_matrix (solver_count);
- vector<vector<double>> time_matrix (solver_count);
- vector<vector<char>> exact_matrix (solver_count);
- for (int i = 0; i < solver_count; ++i) {
- ifstream in_file(argv[i + 1]);
- if (!in_file) {
- std::cout << argv[i + 1] << '\t' << i + 1 << " file error" << std::endl;
- return 1;
- }
- int seed, size;
- double solver_time;
- char exact;
- while (in_file >> seed >> size >> solver_time >> exact) {
- size_matrix[i].push_back(size);
- time_matrix[i].push_back(solver_time);
- exact_matrix[i].push_back(exact);
- }
- in_file.close();
- }
- // =====================================================================================
- // caculate data
- // =====================================================================================
- vector<int> max_size (solver_count);
- vector<double> avg_size (solver_count);
- vector<double> avg_time (solver_count);
- vector<int> is_exact (solver_count, 0);
- int g_max_size = 0;
- double g_max_avg_size = 0;
- double g_min_avg_t = std::numeric_limits<double>::max();
- for (int i = 0; i < solver_count; ++i) {
- int okay_count = 0;
- int m_s = size_matrix[i][0];
- double avg_s = size_matrix[i][0];
- double avg_t = time_matrix[i][0];
- if (size_matrix[i][0] != 0) {
- okay_count++;
- }
- for (size_t j = 1; j < size_matrix[i].size(); ++j) {
- if (m_s < size_matrix[i][j]) {
- m_s = size_matrix[i][j];
- }
- avg_s += size_matrix[i][j];
- if (size_matrix[i][j] != 0) {
- okay_count++;
- }
- }
- for (size_t j = 1; j < time_matrix[i].size(); ++j) {
- avg_t += time_matrix[i][j];
- }
- for (size_t j = 0; j < exact_matrix[i].size(); ++j) {
- if (exact_matrix[i][j] == 'x') {
- is_exact[i] = 1;
- }
- }
- max_size[i] = m_s;
- if (okay_count != 0) {
- avg_size[i] = round(avg_s / okay_count * 100) / 100;
- avg_time[i] = round(avg_t / okay_count * 100) / 100;
- }
- else {
- avg_size[i] = 0;
- avg_time[i] = 0;
- }
- if (okay_count == 0) {
- continue;
- }
- if (g_max_size < max_size[i]) {
- g_max_size = max_size[i];
- }
- if (g_max_avg_size < avg_size[i]) {
- g_max_avg_size = avg_size[i];
- }
- if (g_min_avg_t > avg_time[i]) {
- g_min_avg_t = avg_time[i];
- }
- }
-
- // =====================================================================================
- // generate latex table
- // =====================================================================================
- ofstream out_latex("bold_table.tex", ios::app);
- if (!out_latex) {
- std::cout << "out file error" << std::endl;
- return 1;
- }
- auto bf_write = [&](double d, bool is_bf) {
- if (is_bf) {
- out_latex << "\\textbf{" << d << "}";
- }
- else {
- out_latex << d;
- }
- };
- auto bf_write_time = [&](double d, bool is_bf) {
- if (is_bf) {
- if (d < 0.01) {
- out_latex << "\\boldmath{$<$}\\textbf{0.01}";
- }
- else {
- out_latex << "\\textbf{" << d << "}";
- }
- }
- else {
- if (d < 0.01) {
- out_latex << "$<$0.01";
- }
- else {
- out_latex << d;
- }
- }
- };
- out_latex << basename(argv[1]) << " & ";
- int s_win_count = 0;
- int avg_s_win_count = 0;
- int avg_t_win_count = 0;
- for (int i = 0; i < solver_count; ++i) {
- if (max_size[i] == g_max_size) {
- s_win_count++;
- }
- if (avg_size[i] == g_max_avg_size) {
- avg_s_win_count++;
- }
- if (avg_time[i] == g_min_avg_t) {
- avg_t_win_count++;
- }
- }
- for (int i = 0; i < solver_count; ++i) {
- if (max_size[i] == 0) {
- out_latex << "N/A" << " & " << "N/A";
- if (i == solver_count - 1) {
- out_latex << " \\\\" << std::endl;
- }
- else {
- out_latex << " & ";
- }
- continue;
- }
- // size
- if (max_size[i] != avg_size[i]) { // max size equals to avg size
- if (s_win_count != solver_count) {
- bf_write(max_size[i], max_size[i] == g_max_size);
- }
- else {
- bf_write(max_size[i], false);
- }
- out_latex << "(";
- if (avg_s_win_count != solver_count) {
- bf_write(avg_size[i], avg_size[i] == g_max_avg_size);
- }
- else {
- bf_write(avg_size[i], false);
- }
- out_latex << ")";
- }
- else { // max size dosen't equal to avg size
- if (s_win_count != solver_count || avg_s_win_count != solver_count) {
- bf_write(max_size[i], max_size[i] == g_max_size || avg_size[i] == g_max_avg_size);
- }
- else {
- bf_write(max_size[i], false);
- }
- }
- if (is_exact[i]) {
- out_latex << "$^*$";
- }
- out_latex << " & ";
- // time
- if (s_win_count == solver_count && avg_s_win_count == solver_count &&
- avg_t_win_count != solver_count) {
- bf_write_time(avg_time[i], avg_time[i] == g_min_avg_t);
- }
- else {
- bf_write_time(avg_time[i], false);
- }
- if (i == solver_count - 1) {
- out_latex << " \\\\" << std::endl;
- }
- else {
- out_latex << " & ";
- }
- }
- out_latex.close();
- // =====================================================================================
- // generate compare file
- // =====================================================================================
- vector<bool> win (solver_count, false);
- // if (s_win_count != solver_count || avg_s_win_count != solver_count) {
- for (int i = 0; i < solver_count; ++i) {
- if (max_size[i] == g_max_size && avg_size[i] == g_max_avg_size) {
- // if (max_size[i] == g_max_size) {
- win[i] = true;
- }
- }
- // }
- ofstream out_arch("arch.result", ios::app);
- if (!out_arch) {
- std::cout << "arch file error" << std::endl;
- return 1;
- }
- // win
- out_arch << (win[0] ? 1 : 0);
- for (int i = 1; i < solver_count; ++i) {
- out_arch << '\t' << (win[i] ? 1 : 0);
- }
- out_arch << std::endl;
- // time
- out_arch << avg_time[0];
- for (int i = 1; i < solver_count; ++i) {
- out_arch << '\t' << avg_time[i];
- }
- out_arch << std::endl;
- // okay solver
- out_arch << (max_size[0] != 0 ? 1 : 0);
- for (int i = 1; i < solver_count; ++i) {
- out_arch << '\t' << (max_size[i] != 0 ? 1 : 0);
- }
- out_arch << endl;
- // exact
- out_arch << (is_exact[0] != 0 ? 1 : 0);
- for (int i = 1; i < solver_count; ++i) {
- out_arch << '\t' << (is_exact[i] != 0 ? 1 : 0);
- }
- out_arch << endl;
-
- out_arch.close();
- return 0;
- }
|