void CSVWriter::finalize_csv()

in astra-sim-alibabacloud/astra-sim/workload/CSVWriter.cc [57:135]


void CSVWriter::finalize_csv(
    std::list<std::list<std::pair<uint64_t, double>>> dims) {
  std::cout << "path to create csvs is: " << path << std::endl;
  int trial = 10000;
  do {
    myFile.open(path + name, std::fstream::out);
    trial--;
  } while (!myFile.is_open() && trial > 0);
  if (trial == 0) {
    std::cerr << "Unable to create file: " << path + name << std::endl;
    std::cerr
        << "This error is fatal. Please make sure the CSV write path exists."
        << std::endl;
    exit(1);
  }
  do {
    myFile.close();
  } while (myFile.is_open());

  do {
    myFile.open(path + name, std::fstream::out | std::fstream::in);
  } while (!myFile.is_open());

  if (!myFile) {
    std::cerr << "Unable to open file: " << path + name << std::endl;
    std::cerr
        << "This error is fatal. Please make sure the CSV write path exists."
        << std::endl;
    exit(1);
  } else {
    std::cout << "success in openning file" << std::endl;
  }
  myFile.seekp(0, std::ios_base::beg);
  myFile.seekg(0, std::ios_base::beg);
  std::vector<std::list<std::pair<uint64_t, double>>::iterator> dims_it;
  std::vector<std::list<std::pair<uint64_t, double>>::iterator> dims_it_end;
  for (auto& dim : dims) {
    dims_it.push_back(dim.begin());
    dims_it_end.push_back(dim.end());
  }
  int dim_num = 1;
  myFile << " time (us) ";
  myFile << ",";
  for (int i = 0; i < dims.size(); i++) {
    myFile << "dim" + std::to_string(dim_num) + " util";
    myFile << ',';
    dim_num++;
  }
  myFile << '\n';
  while (true) {
    int finished = 0;
    uint64_t compare;
    for (int i = 0; i < dims_it.size(); i++) {
      if (dims_it[i] != dims_it_end[i]) {
        if (i == 0) {
          myFile << std::to_string((*dims_it[i]).first / FREQ);
          myFile << ",";
          compare = (*dims_it[i]).first;
        } else {
          assert(compare == (*dims_it[i]).first);
        }
      }
      if (dims_it[i] == dims_it_end[i]) {
        finished++;
        myFile << ",";
        continue;
      } else {
        myFile << std::to_string((*dims_it[i]).second);
        myFile << ',';
        std::advance(dims_it[i], 1);
      }
    }
    myFile << '\n';
    if (finished == dims_it_end.size()) {
      break;
    }
  }
  myFile.close();
}