diff --git a/src/solver/utils/CMakeLists.txt b/src/solver/utils/CMakeLists.txt index 5d4bfd160a..aa1a8026f2 100644 --- a/src/solver/utils/CMakeLists.txt +++ b/src/solver/utils/CMakeLists.txt @@ -7,6 +7,8 @@ set(SRC named_problem.cpp mps_utils.h mps_utils.cpp + name_translator.h + name_translator.cpp opt_period_string_generator.h opt_period_string_generator.cpp ) diff --git a/src/solver/utils/mps_utils.cpp b/src/solver/utils/mps_utils.cpp index 0783f74722..cc63f4922b 100644 --- a/src/solver/utils/mps_utils.cpp +++ b/src/solver/utils/mps_utils.cpp @@ -49,6 +49,7 @@ constexpr size_t OPT_APPEL_SOLVEUR_BUFFER_SIZE = 256; #include #include "filename.h" #include "../optimisation/opt_constants.h" +#include "name_translator.h" using namespace Yuni; @@ -57,7 +58,7 @@ using namespace Yuni; class ProblemConverter { public: - void copyProbSimplexeToProbMps(PROBLEME_MPS* dest, PROBLEME_SIMPLEXE_NOMME* src) + void copyProbSimplexeToProbMps(PROBLEME_MPS* dest, PROBLEME_SIMPLEXE_NOMME* src, NameTranslator& nameTranslator) { // Variables dest->NbVar = src->NombreDeVariables; @@ -85,8 +86,8 @@ class ProblemConverter dest->SensDeLaContrainte = src->Sens; // Names - dest->LabelDeLaVariable = src->VariableNamesAsCharPP(mVariableNames); - dest->LabelDeLaContrainte = src->ConstraintNamesAsCharPP(mConstraintNames); + dest->LabelDeLaVariable = nameTranslator.translate(src->VariableNames(), mVariableNames); + dest->LabelDeLaContrainte = nameTranslator.translate(src->ConstraintNames(), mConstraintNames); } private: @@ -105,9 +106,10 @@ void OPT_EcrireJeuDeDonneesLineaireAuFormatMPS(PROBLEME_SIMPLEXE_NOMME* Prob, auto mps = std::make_shared(); { + auto translator = NameTranslator::create(Prob->UseNamedProblems()); ProblemConverter converter; // This object must not be destroyed until SRSwritempsprob has been run - converter.copyProbSimplexeToProbMps(mps.get(), Prob); + converter.copyProbSimplexeToProbMps(mps.get(), Prob, *translator); SRSwritempsprob(mps.get(), tmpPath.c_str()); } diff --git a/src/solver/utils/name_translator.cpp b/src/solver/utils/name_translator.cpp new file mode 100644 index 0000000000..6c3374fee1 --- /dev/null +++ b/src/solver/utils/name_translator.cpp @@ -0,0 +1,28 @@ +#include "name_translator.h" +#include +#include + +char** RealName::translate(const std::vector& src, + std::vector& pointerVec) +{ + std::transform(src.begin(), + src.end(), + std::back_inserter(pointerVec), + [](const std::string& str) { return str.empty() ? nullptr : const_cast(str.data()); }); + return pointerVec.data(); +} + +char** NullName::translate(const std::vector& src, + std::vector& pointerVec) +{ + pointerVec.assign(src.size(), nullptr); + return pointerVec.data(); +} + +std::unique_ptr NameTranslator::create(bool useRealNames) +{ + if (useRealNames) + return std::make_unique(); + else + return std::make_unique(); +} diff --git a/src/solver/utils/name_translator.h b/src/solver/utils/name_translator.h new file mode 100644 index 0000000000..a179bf1caf --- /dev/null +++ b/src/solver/utils/name_translator.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include +#include + +class NameTranslator +{ +public: + virtual char** translate(const std::vector& src, + std::vector& pointerVec) = 0; + static std::unique_ptr create(bool useRealNames); +}; + +class RealName : public NameTranslator +{ + char** translate(const std::vector& src, + std::vector& pointerVec) override; +}; + +class NullName : public NameTranslator +{ + char** translate(const std::vector& src, + std::vector& pointerVec) override; +}; diff --git a/src/solver/utils/named_problem.h b/src/solver/utils/named_problem.h index 91501e1911..7e749e29ee 100644 --- a/src/solver/utils/named_problem.h +++ b/src/solver/utils/named_problem.h @@ -12,22 +12,6 @@ namespace Antares { namespace Optimization { -static inline char** VectorOfStringToCharPP(std::vector& in, - std::vector& pointerVec) -{ - std::transform(in.begin(), - in.end(), - std::back_inserter(pointerVec), - [](std::string& str) { return str.empty() ? nullptr : str.data(); }); - return pointerVec.data(); -} - -static inline char** CharPP(size_t Size, std::vector& pointerVec) -{ - pointerVec = std::vector(Size, nullptr); - return pointerVec.data(); -} - struct PROBLEME_SIMPLEXE_NOMME : public PROBLEME_SIMPLEXE { public: @@ -59,27 +43,6 @@ struct PROBLEME_SIMPLEXE_NOMME : public PROBLEME_SIMPLEXE useNamedProblems_ = useNamedProblems; } - char** VariableNamesAsCharPP(std::vector& pointerVec) - { - if (useNamedProblems_) - { - return VectorOfStringToCharPP(const_cast&>(NomDesVariables), - pointerVec); - } - - return CharPP(NomDesVariables.size(), pointerVec); - } - - char** ConstraintNamesAsCharPP(std::vector& pointerVec) - { - if (useNamedProblems_) - { - return VectorOfStringToCharPP(const_cast&>(NomDesContraintes), - pointerVec); - } - return CharPP(NomDesContraintes.size(), pointerVec); - } - const std::vector& VariableNames() const { return NomDesVariables;