From 2817f49a378fd0a3cde7de43005db541c5c00aab Mon Sep 17 00:00:00 2001 From: Florian OMNES Date: Fri, 20 Dec 2024 16:13:41 +0100 Subject: [PATCH] Use updated antares-solver API (output path changes) [ANT-2561] --- src/cpp/lpnamer/main/ProblemGeneration.cpp | 50 ++++++++++++++++--- .../lpnamer/main/ProblemGeneration.h | 10 ++-- .../ProblemGenerationExeOptionsTest.cpp | 8 +-- 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/src/cpp/lpnamer/main/ProblemGeneration.cpp b/src/cpp/lpnamer/main/ProblemGeneration.cpp index 8586537ac..d19494d01 100644 --- a/src/cpp/lpnamer/main/ProblemGeneration.cpp +++ b/src/cpp/lpnamer/main/ProblemGeneration.cpp @@ -61,10 +61,19 @@ ProblemGeneration::ProblemGeneration(ProblemGenerationOptions& options) } } -std::filesystem::path ProblemGeneration::performAntaresSimulation() { +static std::string lowerCase(std::string data) { + std::transform(data.begin(), data.end(), data.begin(), + [](unsigned char c) { return std::tolower(c); }); + return data; +} + +void ProblemGeneration::performAntaresSimulation( + const std::filesystem::path& output) { Antares::Solver::Optimization::OptimizationOptions optOptions; + + optOptions.ortoolsSolver = lowerCase(solver_name_); auto results = - Antares::API::PerformSimulation(options_.StudyPath(), optOptions); + Antares::API::PerformSimulation(options_.StudyPath(), output, optOptions); // Add parallel // Handle errors @@ -74,7 +83,32 @@ std::filesystem::path ProblemGeneration::performAntaresSimulation() { } lps_ = std::move(results.antares_problems); - return {results.simulationPath}; +} + +static std::string getCurrentTimestamp() { + // Get the current time point + auto now = std::chrono::system_clock::now(); + + // Convert to time_t for formatting + std::time_t now_time_t = std::chrono::system_clock::to_time_t(now); + + // Convert to tm structure + std::tm now_tm; +#ifdef _WIN32 + localtime_s(&now_tm, &now_time_t); // Windows-specific +#else + localtime_r(&now_time_t, &now_tm); // POSIX-specific +#endif + + // Format the timestamp + std::ostringstream oss; + oss << std::put_time(&now_tm, "%Y%m%d-%H%Meco"); + return oss.str(); +} + +// Useful only for "API" mode +std::filesystem::path generateOutputName(const std::filesystem::path& study) { + return study / "output" / getCurrentTimestamp(); } std::filesystem::path ProblemGeneration::updateProblems() { @@ -83,8 +117,6 @@ std::filesystem::path ProblemGeneration::updateProblems() { const auto archive_path = options_.ArchivePath(); std::filesystem::path study_dir; - set_solver(study_dir, logger.get()); - if (mode_ == SimulationInputMode::ARCHIVE) { xpansion_output_dir = options_.deduceXpansionDirIfEmpty(xpansion_output_dir, archive_path); @@ -94,8 +126,8 @@ std::filesystem::path ProblemGeneration::updateProblems() { } if (mode_ == SimulationInputMode::ANTARES_API) { - simulation_dir_ = performAntaresSimulation(); study_dir = options_.StudyPath(); + simulation_dir_ = generateOutputName(study_dir); } if (mode_ == SimulationInputMode::FILE) { @@ -119,6 +151,12 @@ std::filesystem::path ProblemGeneration::updateProblems() { auto logger = ProblemGenerationLog::BuildLogger(log_file_path, std::cout, "Problem Generation"s); + set_solver(study_dir, logger.get()); + + if (mode_ == SimulationInputMode::ANTARES_API) { + performAntaresSimulation(simulation_dir_); + } + auto master_formulation = options_.MasterFormulation(); auto additionalConstraintFilename_l = options_.AdditionalConstraintsFilename(); diff --git a/src/cpp/lpnamer/main/include/antares-xpansion/lpnamer/main/ProblemGeneration.h b/src/cpp/lpnamer/main/include/antares-xpansion/lpnamer/main/ProblemGeneration.h index 076ba23f7..6a7275edc 100644 --- a/src/cpp/lpnamer/main/include/antares-xpansion/lpnamer/main/ProblemGeneration.h +++ b/src/cpp/lpnamer/main/include/antares-xpansion/lpnamer/main/ProblemGeneration.h @@ -7,9 +7,10 @@ #include #include -#include #include +#include +// clang-format off #include "antares-xpansion/lpnamer/input_reader/MpsTxtWriter.h" #include "antares-xpansion/lpnamer/model/Problem.h" #include "antares-xpansion/lpnamer/model/SimulationInputMode.h" @@ -18,6 +19,7 @@ #include "antares-xpansion/lpnamer/helper/ProblemGenerationLogger.h" #include "ProblemGenerationOptions.h" #include "antares-xpansion/multisolver_interface/SolverAbstract.h" +// clang-format on class ProblemGeneration { public: @@ -49,11 +51,13 @@ class ProblemGeneration { const std::vector& mpsList, std::filesystem::path& lpDir_, std::shared_ptr reader, const Antares::Solver::LpsFromAntares& lps); - virtual void set_solver(std::filesystem::path study_dir, ProblemGenerationLog::ProblemGenerationLogger* logger); + virtual void set_solver( + std::filesystem::path study_dir, + ProblemGenerationLog::ProblemGenerationLogger* logger); Antares::Solver::LpsFromAntares lps_; std::optional mode_; - virtual std::filesystem::path performAntaresSimulation(); + virtual void performAntaresSimulation(const std::filesystem::path& output); std::filesystem::path simulation_dir_; std::string solver_name_; }; diff --git a/tests/cpp/lp_namer/ProblemGenerationExeOptionsTest.cpp b/tests/cpp/lp_namer/ProblemGenerationExeOptionsTest.cpp index 61d5534d8..713c08a43 100644 --- a/tests/cpp/lp_namer/ProblemGenerationExeOptionsTest.cpp +++ b/tests/cpp/lp_namer/ProblemGenerationExeOptionsTest.cpp @@ -50,14 +50,10 @@ class ProblemGenerationSpyAndMock : public ProblemGeneration { } private: - std::filesystem::path performAntaresSimulation() override { - return options_.StudyPath() / "simulation"; - } + void performAntaresSimulation(const std::filesystem::path&) override {} void set_solver( std::filesystem::path study_dir, - ProblemGenerationLog::ProblemGenerationLogger* logger) override { - - } + ProblemGenerationLog::ProblemGenerationLogger* logger) override {} public: std::filesystem::path xpansion_output_dir_;