Skip to content

File main.cpp

File List > benchmark > main.cpp

Go to the documentation of this file

#include <fstream>
#include <iostream>

#include "metrics/CLI_Metrics_config.cpp"
#include "../src/algos/mesh_to_pointcloud/CLI_MTP_config.cpp"
#include "../src/algos/pointcloud_to_mesh/CLI_PTM_config.cpp"

#include <CLI/CLI.hpp>
#include <benchmark/benchmark.h>
#include <nlohmann/json_fwd.hpp>

#include "exporter/basic_formatter.h"
#include "exporter/xlsx_exporter.h"
#include "BenchmarksContainer.h"
#include "reporter/reporter.h"

std::vector<char*> getConfigJSON(const std::string& filepath);

using namespace Argos;

const std::string XLSX_FILENAME = "rapport.xlsx";

int main(int argc, char **argv) {

    // 0. Pre-traitement : si --config est present, on reecrit argc/argv avec le contenu du fichier de config
    std::vector<char*> configArgv;
    for (int i = 1; i < argc - 1; ++i) {
        if (std::string(argv[i]) == "--config") {
            configArgv = getConfigJSON(argv[i + 1]);
            argc = static_cast<int>(configArgv.size());
            argv = configArgv.data();
            break;
        }
    }

  CLI::App app{"Argos Benchmark"};
  app.fallthrough();

  // 1. Commande benchmark

  // 1.1 Dossier entrée qui contient fichiers .obj
  std::string inputFolder;

  auto *input = app.add_option("-i, --input", inputFolder,
                 "Chemin du dossier qui contient tous les fichiers .obj/.ply à "
                 "traiter pour le benchmark");

  // 1.2 Algorithmes de génération d'un nuage de points;
  auto *algoSamplerGroup = app.add_option_group(
      "Algorithmes Points",
      "Choisissez un algorithme de generation d'un nuage de points");

  // On ajoute tous les algos
  std::shared_ptr<ISurfaceSampler> algoSampler;

  addAlgosMeshToPointcloud(*algoSamplerGroup, algoSampler);

  algoSamplerGroup->require_subcommand(1);

  // 1.3 Algrotihmes de reconstruction d'un maillage
  auto *algoReconstructGroup = app.add_option_group(
      "Algorithmes Mesh",
      "Choisissez un algorithme de reconstruction d'un maillage");

  // On ajoute tous les algos
  std::vector<std::shared_ptr<ISurfaceReconstructor>> algosReconstruct;

  addAlgosPointcloudToMesh(*algoReconstructGroup, algosReconstruct);

  algoReconstructGroup->require_subcommand(1);

  // 1.4 Ajout des métriques
  auto *metricsGroup = app.add_option_group(
      "Metriques", "Choisissez une ou plusieurs metriques");

  // On ajoute toutes les métriques
  std::vector<std::shared_ptr<Metric>> metrics;

  addMetrics(*metricsGroup, metrics);

  // 2. Ajout option config (fichier config)
  std::string configFile;
  auto *config = app.add_option("--config", configFile,
                            "Choisir un fichier de configuration JSON au lieu de siasir la commande");

  // Ajout exclusions
  input->excludes(config);
  algoSamplerGroup->excludes(config);
  algoReconstructGroup->excludes(config);
  metricsGroup->excludes(config);


  // 3. Parsing
  CLI11_PARSE(app, argc, argv);

  // 4. Execution du benchmark
  if (app.parsed()) {
      // Vérification si le chemin saisi est bien un dossier
      if (!std::filesystem::exists(inputFolder) ||
          !std::filesystem::is_directory(inputFolder)) {
          throw std::runtime_error("Entrer : Dossier introuvable");
      }

      benchmark::Initialize(&argc, argv);


      //Création du dossier de sortie
      auto now = std::chrono::system_clock::now();
      auto t = std::chrono::system_clock::to_time_t(now);
      std::tm tm = *std::localtime(&t);

      std::ostringstream oss;
      oss << std::put_time(&tm, "%Y-%m-%d_%H-%M-%S");

      std::filesystem::path outputFolderPath = std::filesystem::path(inputFolder) / "output" / oss.str();

      std::filesystem::create_directories(outputFolderPath);

      //Ajout des Benchmarks
      BenchmarksContainer runner(std::filesystem::path(inputFolder), outputFolderPath);


      for (std::shared_ptr<ISurfaceReconstructor> algo : algosReconstruct) {
          runner.addBenchmark(algo->name(), algo, metrics);
      }

      BenchmarkReporter reporter;
      runner.run(&reporter, algoSampler);

      // Export vers Excel
      std::filesystem::path outputPath = outputFolderPath / XLSX_FILENAME;

      BasicFormatter formatter;
      XLSXExporter exporter(formatter);

      std::ofstream outFile(outputPath, std::ios::binary);
      if (!outFile) {
          std::cerr << "Erreur : impossible de creer le fichier " << outputPath
                    << std::endl;
          return 1;
      }

      exporter.Export(reporter.result(), outFile);
      outFile.close();

      std::cout << "Benchmark termine ! Rapport exporte vers : " << outputPath
                << std::endl;


      return 0;
  }
}