From ab11215f86e2a84c10bc4a67335dc5cf498150be Mon Sep 17 00:00:00 2001 From: Guillaume PIERRE Date: Tue, 8 Oct 2024 15:55:04 +0200 Subject: [PATCH 01/29] Legacy ortools behind API : in CI, run tests with ortools + sirius --- .github/workflows/ubuntu.yml | 34 ++++++++++++++--------------- .github/workflows/windows-vcpkg.yml | 34 ++++++++++++++--------------- src/tests/CMakeLists.txt | 6 ++--- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 2c73097adb..e363ee596f 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -150,14 +150,14 @@ jobs: run: | git submodule update --init --remote --recursive src/tests/resources/Antares_Simulator_Tests_NR - - name: Run named mps tests - if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} - uses: ./.github/workflows/run-tests - with: - simtest-tag: ${{ env.SIMTEST }} - batch-name: valid-named-mps - os: ${{ env.os }} - variant: "named-mps" + #- name: Run named mps tests + # if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + # uses: ./.github/workflows/run-tests + # with: + # simtest-tag: ${{ env.SIMTEST }} + # batch-name: valid-named-mps + # os: ${{ env.os }} + # variant: "named-mps" - name: Run unfeasibility-related tests if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} @@ -240,13 +240,13 @@ jobs: with: feature: "features/short_tests.feature" - - name: Run mps tests - if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} - uses: ./.github/workflows/run-tests - with: - simtest-tag: ${{ env.SIMTEST }} - batch-name: valid-mps - os: ${{ env.os }} + #- name: Run mps tests + # if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + # uses: ./.github/workflows/run-tests + # with: + # simtest-tag: ${{ env.SIMTEST }} + # batch-name: valid-mps + # os: ${{ env.os }} - name: Run tests for adequacy patch (CSR) if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} @@ -257,7 +257,7 @@ jobs: os: ${{ env.os }} - name: Run parallel tests - if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} @@ -275,7 +275,7 @@ jobs: variant: "tsgenerator" - name: Run medium-tests - if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} diff --git a/.github/workflows/windows-vcpkg.yml b/.github/workflows/windows-vcpkg.yml index 5fb4b19603..edd41d5f4f 100644 --- a/.github/workflows/windows-vcpkg.yml +++ b/.github/workflows/windows-vcpkg.yml @@ -152,14 +152,14 @@ jobs: run: | git submodule update --init --remote src/tests/resources/Antares_Simulator_Tests_NR - - name: Run named mps tests - if: ${{ env.RUN_SIMPLE_TESTS == 'true' && ! cancelled() }} - uses: ./.github/workflows/run-tests - with: - simtest-tag: ${{ env.SIMTEST }} - batch-name: valid-named-mps - os: ${{ env.os }} - variant: "named-mps" + #- name: Run named mps tests + # if: ${{ env.RUN_SIMPLE_TESTS == 'true' && ! cancelled() }} + # uses: ./.github/workflows/run-tests + # with: + # simtest-tag: ${{ env.SIMTEST }} + # batch-name: valid-named-mps + # os: ${{ env.os }} + # variant: "named-mps" - name: Run unfeasibility-related tests if: ${{ env.RUN_SIMPLE_TESTS == 'true' && ! cancelled() }} @@ -250,16 +250,16 @@ jobs: with: feature: "features/short_tests.feature" - - name: Run mps tests - if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} - uses: ./.github/workflows/run-tests - with: - simtest-tag: ${{ env.SIMTEST }} - batch-name: valid-mps - os: ${{ env.os }} + #- name: Run mps tests + # if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + # uses: ./.github/workflows/run-tests + # with: + # simtest-tag: ${{ env.SIMTEST }} + # batch-name: valid-mps + # os: ${{ env.os }} - name: Run parallel tests - if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} @@ -277,7 +277,7 @@ jobs: variant: "tsgenerator" - name: Run medium-tests - if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 2babe91fab..36f530ede4 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -49,13 +49,13 @@ if(Python3_Interpreter_FOUND) # TODO : add more study batches add_test( NAME unfeasible - COMMAND Python3::Interpreter -m pytest -m unfeasible --solver-path=$ + COMMAND Python3::Interpreter -m pytest -m unfeasible --solver-path=$ --use-ortools --ortools-solver sirius WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/run-study-tests" ) add_test( NAME json - COMMAND Python3::Interpreter -m pytest -m json --solver-path=$ + COMMAND Python3::Interpreter -m pytest -m json --solver-path=$ --use-ortools --ortools-solver sirius WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/run-study-tests" ) @@ -73,7 +73,7 @@ if(Python3_Interpreter_FOUND) add_test( NAME parallel - COMMAND Python3::Interpreter -m pytest -m json --solver-path=$ --force-parallel + COMMAND Python3::Interpreter -m pytest -m json --solver-path=$ --force-parallel --use-ortools --ortools-solver sirius WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/run-study-tests" ) From 2f704cae4ea2ad46c33728449a9f9a6b6fddd000 Mon Sep 17 00:00:00 2001 From: Guillaume PIERRE Date: Wed, 9 Oct 2024 15:30:14 +0200 Subject: [PATCH 02/29] Legacy ortools behind API : mainly preparing the field for further changes --- src/packaging/CMakeLists.txt | 43 ++++++++++--------- src/solver/modeler/api/CMakeLists.txt | 2 + .../modeler/api/fillers/LegacyOrtoolsFiller.h | 27 ++++++++++++ src/solver/optimisation/CMakeLists.txt | 16 ++++--- .../opt_appel_solveur_lineaire.cpp | 17 +++++++- .../antares/solver/utils/ortools_wrapper.h | 5 +-- src/solver/utils/ortools_utils.cpp | 16 ++----- 7 files changed, 81 insertions(+), 45 deletions(-) create mode 100644 src/solver/modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h diff --git a/src/packaging/CMakeLists.txt b/src/packaging/CMakeLists.txt index 868cd7a8ec..ea0e5c1836 100644 --- a/src/packaging/CMakeLists.txt +++ b/src/packaging/CMakeLists.txt @@ -6,18 +6,18 @@ include(GNUInstallDirs) # generate and install export file set(TARGET_LIBS #No alias - #each "block" of dependency describe the dependency for a target - #not dependency is present since once a dependency is in the export set - #it is available for everything + # each "block" of dependency describe the dependency for a target + # not dependency is present since once a dependency is in the export set + # it is available for everything - solver_api #What we want to export + solver_api # What we want to export - #solver_api + # solver_api study study-loader file-tree-study-loader antares-solver-simulation - #study + # study yuni-static-core array date @@ -37,39 +37,37 @@ set(TARGET_LIBS #No alias antares-solver-variable lps - #study-loader - #nothing + # study-loader : nothing - #file-tree-study-loader + # file-tree-study-loader application - #run-mode + # run-mode infoCollection - #antares-solver-simulation + # antares-solver-simulation concurrency misc model_antares antares-solver-ts-generator - #lps - #nothing + # lps : nothing - #array + # array io jit AntaresMemory - #date + # date logs - #correlation + # correlation locator - #antares-core + # antares-core antares-config-lib - #application + # application solver-lib sys signal-handling @@ -77,16 +75,19 @@ set(TARGET_LIBS #No alias optimization-options resources - #model_antares + # model_antares infeasible_problem_analysis + modeler_api + modeler-ortools-impl - #solver-lib + # solver-lib args_helper checks locale yuni-static-uuid - antares-solver #executable + # executable + antares-solver ) install(TARGETS ${TARGET_LIBS} diff --git a/src/solver/modeler/api/CMakeLists.txt b/src/solver/modeler/api/CMakeLists.txt index 41789ae9cb..c15ae518b8 100644 --- a/src/solver/modeler/api/CMakeLists.txt +++ b/src/solver/modeler/api/CMakeLists.txt @@ -13,6 +13,8 @@ set(SRC_API include/antares/solver/modeler/api/linearProblemFiller.h include/antares/solver/modeler/api/linearProblemBuilder.h + include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h + linearProblemData.cpp linearProblemBuilder.cpp ) diff --git a/src/solver/modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h b/src/solver/modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h new file mode 100644 index 0000000000..e7fa19dace --- /dev/null +++ b/src/solver/modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h @@ -0,0 +1,27 @@ +#pragma once + +#include "antares/solver/modeler/api/linearProblemFiller.h" + +namespace Antares::Solver::Modeler::Api +{ +class LegacyOrtoolsFiller: public LinearProblemFiller +{ +public: + explicit LegacyOrtoolsFiller() = default; + void addVariables(ILinearProblem& pb, LinearProblemData& data) override; + void addConstraints(ILinearProblem& pb, LinearProblemData& data) override; + void addObjective(ILinearProblem& pb, LinearProblemData& data) override; +}; + +void LegacyOrtoolsFiller::addVariables(ILinearProblem& pb, LinearProblemData& data) +{ +} + +void LegacyOrtoolsFiller::addConstraints(ILinearProblem& pb, LinearProblemData& data) +{ +} + +void LegacyOrtoolsFiller::addObjective(ILinearProblem& pb, LinearProblemData& data) +{ +} +} diff --git a/src/solver/optimisation/CMakeLists.txt b/src/solver/optimisation/CMakeLists.txt index a0d74288e7..7f5a94b4cd 100644 --- a/src/solver/optimisation/CMakeLists.txt +++ b/src/solver/optimisation/CMakeLists.txt @@ -188,14 +188,16 @@ else () endif () target_link_libraries(model_antares PUBLIC - Antares::solverUtils - sirius_solver - antares-solver-simulation - Antares::benchmarking - Antares::optimization-options - Antares::lps + Antares::solverUtils + sirius_solver + antares-solver-simulation + Antares::benchmarking + Antares::optimization-options + Antares::lps PRIVATE - infeasible_problem_analysis + infeasible_problem_analysis + Antares::modeler_api + Antares::modeler-ortools-impl ) target_include_directories(model_antares diff --git a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp index 94eae39fc8..245a884c52 100644 --- a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp +++ b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp @@ -31,8 +31,13 @@ #include "antares/solver/simulation/sim_structure_probleme_economique.h" #include "antares/solver/utils/filename.h" #include "antares/solver/utils/mps_utils.h" +#include "antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h" +#include "antares/solver/modeler/api/linearProblemBuilder.h" +#include "antares/solver/modeler/ortoolsImpl/linearProblem.h" using namespace operations_research; +using namespace Antares::Solver::Modeler::Api; +using namespace Antares::Solver::Modeler::OrtoolsImpl; using Antares::Solver::IResultWriter; using Antares::Solver::Optimization::OptimizationOptions; @@ -201,9 +206,17 @@ static SimplexResult OPT_TryToCallSimplex(const OptimizationOptions& options, Probleme.NombreDeContraintesCoupes = 0; - if (options.ortoolsUsed) + if (options.ortoolsUsed && solver == nullptr) { - solver = ORTOOLS_ConvertIfNeeded(options.ortoolsSolver, &Probleme, solver); + auto legacyOrtoolsFiller = std::make_unique(); + std::vector fillersCollection = {legacyOrtoolsFiller.get()}; + LinearProblemData LP_Data; + LinearProblemBuilder linearProblemBuilder(fillersCollection); + auto ortoolsProblem = std::make_unique(false, "sirius"); + linearProblemBuilder.build(*ortoolsProblem, LP_Data); + + + solver = ConvertIntoOrtools(options.ortoolsSolver, &Probleme); } const std::string filename = createMPSfilename(optPeriodStringGenerator, optimizationNumber); diff --git a/src/solver/utils/include/antares/solver/utils/ortools_wrapper.h b/src/solver/utils/include/antares/solver/utils/ortools_wrapper.h index 4f688dda4a..d8c00173c9 100644 --- a/src/solver/utils/include/antares/solver/utils/ortools_wrapper.h +++ b/src/solver/utils/include/antares/solver/utils/ortools_wrapper.h @@ -34,9 +34,8 @@ MPSolver* ORTOOLS_Simplexe(Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probl bool keepBasis, const Antares::Solver::Optimization::OptimizationOptions& options); -MPSolver* ORTOOLS_ConvertIfNeeded(const std::string& solverName, - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probleme, - MPSolver* solver); +MPSolver* ConvertIntoOrtools(const std::string& solverName, + const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probleme); void ORTOOLS_ModifierLeVecteurCouts(MPSolver* ProbSpx, const double* costs, int nbVar); void ORTOOLS_ModifierLeVecteurSecondMembre(MPSolver* ProbSpx, diff --git a/src/solver/utils/ortools_utils.cpp b/src/solver/utils/ortools_utils.cpp index 2cc81b80fa..cb8e32a4b5 100644 --- a/src/solver/utils/ortools_utils.cpp +++ b/src/solver/utils/ortools_utils.cpp @@ -329,19 +329,11 @@ bool solveAndManageStatus(MPSolver* solver, int& resultStatus, const MPSolverPar return resultStatus == OUI_SPX; } -MPSolver* ORTOOLS_ConvertIfNeeded(const std::string& solverName, - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probleme, - MPSolver* solver) +MPSolver* ConvertIntoOrtools(const std::string& solverName, + const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probleme) { - if (solver == nullptr) - { - Antares::Optimization::ProblemSimplexeNommeConverter converter(solverName, Probleme); - return converter.Convert(); - } - else - { - return solver; - } + Antares::Optimization::ProblemSimplexeNommeConverter converter(solverName, Probleme); + return converter.Convert(); } MPSolver* ORTOOLS_Simplexe(Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probleme, From 0a308a98e2698c1f6310a7a70bfcd2dcb27f504b Mon Sep 17 00:00:00 2001 From: Guillaume PIERRE Date: Thu, 10 Oct 2024 10:51:27 +0200 Subject: [PATCH 03/29] Legacy ortools behind API : put solver creation behind or-tools --- .../modeler/api/fillers/LegacyOrtoolsFiller.h | 108 +++++++++++++++++- .../modeler/ortoolsImpl/linearProblem.h | 1 + .../modeler/ortoolsImpl/linearProblem.cpp | 16 +-- .../opt_appel_solveur_lineaire.cpp | 21 ++-- .../antares/solver/utils/ortools_utils.h | 2 +- .../antares/solver/utils/ortools_wrapper.h | 2 +- src/solver/utils/ortools_utils.cpp | 6 +- 7 files changed, 129 insertions(+), 27 deletions(-) diff --git a/src/solver/modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h b/src/solver/modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h index e7fa19dace..ea2771f751 100644 --- a/src/solver/modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h +++ b/src/solver/modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h @@ -1,27 +1,133 @@ #pragma once #include "antares/solver/modeler/api/linearProblemFiller.h" +#include "ortools/linear_solver/linear_solver.h" +#include "antares/solver/utils/named_problem.h" +#include "antares/solver/utils/ortools_utils.h" + +using namespace Antares::Optimization; namespace Antares::Solver::Modeler::Api { class LegacyOrtoolsFiller: public LinearProblemFiller { public: - explicit LegacyOrtoolsFiller() = default; + explicit LegacyOrtoolsFiller(operations_research::MPSolver* mpSolver, + const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe); void addVariables(ILinearProblem& pb, LinearProblemData& data) override; void addConstraints(ILinearProblem& pb, LinearProblemData& data) override; void addObjective(ILinearProblem& pb, LinearProblemData& data) override; + +private: + operations_research::MPSolver* mpSolver_ = nullptr; + const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe_; + Nomenclature variableNameManager_ = Nomenclature('x'); + Nomenclature constraintNameManager_ = Nomenclature('c'); + + void CreateVariable(unsigned idxVar, MPSolver* solver, MPObjective* const objective) const; + void CopyVariables(MPSolver* solver) const; + void UpdateContraints(unsigned idxRow, MPSolver* solver) const; + void CopyRows(MPSolver* solver) const; + void CopyMatrix(const MPSolver* solver) const; }; +LegacyOrtoolsFiller::LegacyOrtoolsFiller(operations_research::MPSolver* mpSolver, + const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe) : + mpSolver_(mpSolver), + problemeSimplexe_(problemeSimplexe) +{ + if (problemeSimplexe_->UseNamedProblems()) + { + variableNameManager_.SetTarget(problemeSimplexe_->VariableNames()); + constraintNameManager_.SetTarget(problemeSimplexe_->ConstraintNames()); + } +} + void LegacyOrtoolsFiller::addVariables(ILinearProblem& pb, LinearProblemData& data) { + // Create the variables and set objective cost. + CopyVariables(mpSolver_); } void LegacyOrtoolsFiller::addConstraints(ILinearProblem& pb, LinearProblemData& data) { + // Create constraints and set coefs + CopyRows(mpSolver_); + + CopyMatrix(mpSolver_); } void LegacyOrtoolsFiller::addObjective(ILinearProblem& pb, LinearProblemData& data) { } + +void LegacyOrtoolsFiller::CopyMatrix(const MPSolver* solver) const +{ + auto variables = solver->variables(); + auto constraints = solver->constraints(); + + for (int idxRow = 0; idxRow < problemeSimplexe_->NombreDeContraintes; ++idxRow) + { + MPConstraint* const ct = constraints[idxRow]; + int debutLigne = problemeSimplexe_->IndicesDebutDeLigne[idxRow]; + for (int idxCoef = 0; idxCoef < problemeSimplexe_->NombreDeTermesDesLignes[idxRow]; + ++idxCoef) + { + int pos = debutLigne + idxCoef; + ct->SetCoefficient(variables[problemeSimplexe_->IndicesColonnes[pos]], + problemeSimplexe_->CoefficientsDeLaMatriceDesContraintes[pos]); + } + } +} + +void LegacyOrtoolsFiller::CreateVariable(unsigned idxVar, + MPSolver* solver, + MPObjective* const objective) const +{ + double min_l = problemeSimplexe_->Xmin[idxVar]; + double max_l = problemeSimplexe_->Xmax[idxVar]; + bool isIntegerVariable = problemeSimplexe_->IntegerVariable(idxVar); + const MPVariable* var = solver->MakeVar(min_l, + max_l, + isIntegerVariable, + variableNameManager_.GetName(idxVar)); + objective->SetCoefficient(var, problemeSimplexe_->CoutLineaire[idxVar]); +} + +void LegacyOrtoolsFiller::CopyVariables(MPSolver* solver) const + +{ + MPObjective* const objective = solver->MutableObjective(); + for (int idxVar = 0; idxVar < problemeSimplexe_->NombreDeVariables; ++idxVar) + { + CreateVariable(idxVar, solver, objective); + } +} + +void LegacyOrtoolsFiller::UpdateContraints(unsigned idxRow, MPSolver* solver) const +{ + double bMin = -MPSolver::infinity(), bMax = MPSolver::infinity(); + if (problemeSimplexe_->Sens[idxRow] == '=') + { + bMin = bMax = problemeSimplexe_->SecondMembre[idxRow]; + } + else if (problemeSimplexe_->Sens[idxRow] == '<') + { + bMax = problemeSimplexe_->SecondMembre[idxRow]; + } + else if (problemeSimplexe_->Sens[idxRow] == '>') + { + bMin = problemeSimplexe_->SecondMembre[idxRow]; + } + + solver->MakeRowConstraint(bMin, bMax, constraintNameManager_.GetName(idxRow)); +} + +void LegacyOrtoolsFiller::CopyRows(MPSolver* solver) const +{ + for (int idxRow = 0; idxRow < problemeSimplexe_->NombreDeContraintes; ++idxRow) + { + UpdateContraints(idxRow, solver); + } +} } diff --git a/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/linearProblem.h b/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/linearProblem.h index d4e6e52c02..979009a556 100644 --- a/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/linearProblem.h +++ b/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/linearProblem.h @@ -61,6 +61,7 @@ class OrtoolsLinearProblem final: public Api::ILinearProblem bool isMaximization() const override; OrtoolsMipSolution* solve(bool verboseSolver) override; + operations_research::MPSolver* MPSolver(); private: OrtoolsMipVariable* addVariable(double lb, double ub, bool integer, const std::string& name); diff --git a/src/solver/modeler/ortoolsImpl/linearProblem.cpp b/src/solver/modeler/ortoolsImpl/linearProblem.cpp index 1d8bf981bc..aff6d83c4d 100644 --- a/src/solver/modeler/ortoolsImpl/linearProblem.cpp +++ b/src/solver/modeler/ortoolsImpl/linearProblem.cpp @@ -31,16 +31,7 @@ namespace Antares::Solver::Modeler::OrtoolsImpl OrtoolsLinearProblem::OrtoolsLinearProblem(bool isMip, const std::string& solverName) { - auto* mpSolver = isMip ? MPSolver::CreateSolver( - (OrtoolsUtils::solverMap.at(solverName)).MIPSolverName) - : MPSolver::CreateSolver( - (OrtoolsUtils::solverMap.at(solverName)).LPSolverName); - - mpSolver_ = std::unique_ptr(mpSolver); - objective_ = mpSolver->MutableObjective(); - - params_.SetIntegerParam(MPSolverParameters::SCALING, 0); - params_.SetIntegerParam(MPSolverParameters::PRESOLVE, 0); + mpSolver_ = std::shared_ptr(MPSolverFactory(isMip, solverName)); } class ElemAlreadyExists: public std::exception @@ -172,6 +163,11 @@ bool OrtoolsLinearProblem::isMaximization() const return objective_->maximization(); } +MPSolver* OrtoolsLinearProblem::MPSolver() +{ + return mpSolver_.get(); +} + OrtoolsMipSolution* OrtoolsLinearProblem::solve(bool verboseSolver) { if (verboseSolver) diff --git a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp index 245a884c52..c0d8456a75 100644 --- a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp +++ b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp @@ -27,13 +27,13 @@ #include #include "antares/optimization-options/options.h" #include "antares/solver/infeasible-problem-analysis/unfeasible-pb-analyzer.h" +#include "antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h" +#include "antares/solver/modeler/api/linearProblemBuilder.h" +#include "antares/solver/modeler/ortoolsImpl/linearProblem.h" #include "antares/solver/optimisation/opt_structure_probleme_a_resoudre.h" #include "antares/solver/simulation/sim_structure_probleme_economique.h" #include "antares/solver/utils/filename.h" #include "antares/solver/utils/mps_utils.h" -#include "antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h" -#include "antares/solver/modeler/api/linearProblemBuilder.h" -#include "antares/solver/modeler/ortoolsImpl/linearProblem.h" using namespace operations_research; using namespace Antares::Solver::Modeler::Api; @@ -206,17 +206,16 @@ static SimplexResult OPT_TryToCallSimplex(const OptimizationOptions& options, Probleme.NombreDeContraintesCoupes = 0; + auto ortoolsProblem = std::make_unique(Probleme.isMIP(), options.ortoolsSolver); + auto legacyOrtoolsFiller = std::make_unique(ortoolsProblem->MPSolver(), &Probleme); + std::vector fillersCollection = {legacyOrtoolsFiller.get()}; + LinearProblemData LP_Data; + LinearProblemBuilder linearProblemBuilder(fillersCollection); + if (options.ortoolsUsed && solver == nullptr) { - auto legacyOrtoolsFiller = std::make_unique(); - std::vector fillersCollection = {legacyOrtoolsFiller.get()}; - LinearProblemData LP_Data; - LinearProblemBuilder linearProblemBuilder(fillersCollection); - auto ortoolsProblem = std::make_unique(false, "sirius"); linearProblemBuilder.build(*ortoolsProblem, LP_Data); - - - solver = ConvertIntoOrtools(options.ortoolsSolver, &Probleme); + solver = ortoolsProblem->MPSolver(); } const std::string filename = createMPSfilename(optPeriodStringGenerator, optimizationNumber); diff --git a/src/solver/utils/include/antares/solver/utils/ortools_utils.h b/src/solver/utils/include/antares/solver/utils/ortools_utils.h index 3dd0970ecc..9f62995453 100644 --- a/src/solver/utils/include/antares/solver/utils/ortools_utils.h +++ b/src/solver/utils/include/antares/solver/utils/ortools_utils.h @@ -58,7 +58,7 @@ std::string availableOrToolsSolversString(); * * \return MPSolver */ -MPSolver* MPSolverFactory(const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* probleme, +MPSolver* MPSolverFactory(const bool isMip, const std::string& solverName); std::string generateTempPath(const std::string& filename); diff --git a/src/solver/utils/include/antares/solver/utils/ortools_wrapper.h b/src/solver/utils/include/antares/solver/utils/ortools_wrapper.h index d8c00173c9..cdb8a5c577 100644 --- a/src/solver/utils/include/antares/solver/utils/ortools_wrapper.h +++ b/src/solver/utils/include/antares/solver/utils/ortools_wrapper.h @@ -35,7 +35,7 @@ MPSolver* ORTOOLS_Simplexe(Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probl const Antares::Solver::Optimization::OptimizationOptions& options); MPSolver* ConvertIntoOrtools(const std::string& solverName, - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probleme); + const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probleme); void ORTOOLS_ModifierLeVecteurCouts(MPSolver* ProbSpx, const double* costs, int nbVar); void ORTOOLS_ModifierLeVecteurSecondMembre(MPSolver* ProbSpx, diff --git a/src/solver/utils/ortools_utils.cpp b/src/solver/utils/ortools_utils.cpp index cb8e32a4b5..d04d8f6612 100644 --- a/src/solver/utils/ortools_utils.cpp +++ b/src/solver/utils/ortools_utils.cpp @@ -330,7 +330,7 @@ bool solveAndManageStatus(MPSolver* solver, int& resultStatus, const MPSolverPar } MPSolver* ConvertIntoOrtools(const std::string& solverName, - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probleme) + const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probleme) { Antares::Optimization::ProblemSimplexeNommeConverter converter(solverName, Probleme); return converter.Convert(); @@ -466,13 +466,13 @@ std::string availableOrToolsSolversString() return solvers.str(); } -MPSolver* MPSolverFactory(const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* probleme, +MPSolver* MPSolverFactory(const bool isMip, const std::string& solverName) { MPSolver* solver; try { - if (probleme->isMIP()) + if (isMip) { solver = MPSolver::CreateSolver((OrtoolsUtils::solverMap.at(solverName)).MIPSolverName); } From 51d19d851aea9a738bd105e546dcb8e20d44d844 Mon Sep 17 00:00:00 2001 From: Guillaume PIERRE Date: Thu, 10 Oct 2024 13:57:58 +0200 Subject: [PATCH 04/29] Legacy ortools behind API : fix crash in modeler unit tests --- src/solver/modeler/ortoolsImpl/linearProblem.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/solver/modeler/ortoolsImpl/linearProblem.cpp b/src/solver/modeler/ortoolsImpl/linearProblem.cpp index aff6d83c4d..f811cb6c24 100644 --- a/src/solver/modeler/ortoolsImpl/linearProblem.cpp +++ b/src/solver/modeler/ortoolsImpl/linearProblem.cpp @@ -32,6 +32,7 @@ namespace Antares::Solver::Modeler::OrtoolsImpl OrtoolsLinearProblem::OrtoolsLinearProblem(bool isMip, const std::string& solverName) { mpSolver_ = std::shared_ptr(MPSolverFactory(isMip, solverName)); + objective_ = mpSolver_->MutableObjective(); } class ElemAlreadyExists: public std::exception From 8223c47b3fa5af76ce1312ed18f700634dca2e1a Mon Sep 17 00:00:00 2001 From: Guillaume PIERRE Date: Thu, 10 Oct 2024 15:19:43 +0200 Subject: [PATCH 05/29] Legacy ortools behind API : fix a crash - smart pointer on ortools solver prevents solver from being shared among weeks --- .../antares/solver/modeler/ortoolsImpl/linearProblem.h | 2 +- .../include/antares/solver/modeler/ortoolsImpl/mipSolution.h | 4 ++-- src/solver/modeler/ortoolsImpl/linearProblem.cpp | 4 ++-- src/solver/modeler/ortoolsImpl/mipSolution.cpp | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/linearProblem.h b/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/linearProblem.h index 979009a556..5535606730 100644 --- a/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/linearProblem.h +++ b/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/linearProblem.h @@ -66,7 +66,7 @@ class OrtoolsLinearProblem final: public Api::ILinearProblem private: OrtoolsMipVariable* addVariable(double lb, double ub, bool integer, const std::string& name); - std::shared_ptr mpSolver_; + operations_research::MPSolver* mpSolver_; operations_research::MPObjective* objective_; operations_research::MPSolverParameters params_; diff --git a/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/mipSolution.h b/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/mipSolution.h index c046c49ef6..0cf452c11b 100644 --- a/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/mipSolution.h +++ b/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/mipSolution.h @@ -35,7 +35,7 @@ class OrtoolsMipSolution final: public Api::IMipSolution { public: OrtoolsMipSolution(operations_research::MPSolver::ResultStatus& responseStatus, - std::shared_ptr solver); + operations_research::MPSolver* solver); ~OrtoolsMipSolution() override = default; @@ -47,7 +47,7 @@ class OrtoolsMipSolution final: public Api::IMipSolution private: operations_research::MPSolver::ResultStatus status_; - std::shared_ptr mpSolver_; + operations_research::MPSolver* mpSolver_; std::map solution_; }; diff --git a/src/solver/modeler/ortoolsImpl/linearProblem.cpp b/src/solver/modeler/ortoolsImpl/linearProblem.cpp index f811cb6c24..49faef6676 100644 --- a/src/solver/modeler/ortoolsImpl/linearProblem.cpp +++ b/src/solver/modeler/ortoolsImpl/linearProblem.cpp @@ -31,7 +31,7 @@ namespace Antares::Solver::Modeler::OrtoolsImpl OrtoolsLinearProblem::OrtoolsLinearProblem(bool isMip, const std::string& solverName) { - mpSolver_ = std::shared_ptr(MPSolverFactory(isMip, solverName)); + mpSolver_ = MPSolverFactory(isMip, solverName); objective_ = mpSolver_->MutableObjective(); } @@ -166,7 +166,7 @@ bool OrtoolsLinearProblem::isMaximization() const MPSolver* OrtoolsLinearProblem::MPSolver() { - return mpSolver_.get(); + return mpSolver_; } OrtoolsMipSolution* OrtoolsLinearProblem::solve(bool verboseSolver) diff --git a/src/solver/modeler/ortoolsImpl/mipSolution.cpp b/src/solver/modeler/ortoolsImpl/mipSolution.cpp index 8a04484522..8239f9893a 100644 --- a/src/solver/modeler/ortoolsImpl/mipSolution.cpp +++ b/src/solver/modeler/ortoolsImpl/mipSolution.cpp @@ -26,7 +26,7 @@ namespace Antares::Solver::Modeler::OrtoolsImpl { OrtoolsMipSolution::OrtoolsMipSolution(operations_research::MPSolver::ResultStatus& status, - std::shared_ptr solver): + operations_research::MPSolver* solver): status_(status), mpSolver_(solver) { From f588590c234c5388c35350661aaf1f5697f188fc Mon Sep 17 00:00:00 2001 From: Guillaume PIERRE Date: Thu, 10 Oct 2024 16:09:59 +0200 Subject: [PATCH 06/29] Legacy ortools behind API : remove duplicate code --- .../opt_appel_solveur_lineaire.cpp | 10 +- .../antares/solver/utils/ortools_utils.h | 21 ---- .../antares/solver/utils/ortools_wrapper.h | 3 - src/solver/utils/ortools_utils.cpp | 112 ------------------ 4 files changed, 8 insertions(+), 138 deletions(-) diff --git a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp index c0d8456a75..8b5f0a9477 100644 --- a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp +++ b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp @@ -382,8 +382,14 @@ bool OPT_AppelDuSimplexe(const OptimizationOptions& options, Probleme.SetUseNamedProblems(true); - auto MPproblem = std::shared_ptr( - ProblemSimplexeNommeConverter(options.ortoolsSolver, &Probleme).Convert()); + auto ortoolsProblem = std::make_unique(Probleme.isMIP(), options.ortoolsSolver); + auto legacyOrtoolsFiller = std::make_unique(ortoolsProblem->MPSolver(), &Probleme); + std::vector fillersCollection = {legacyOrtoolsFiller.get()}; + LinearProblemData LP_Data; + LinearProblemBuilder linearProblemBuilder(fillersCollection); + + linearProblemBuilder.build(*ortoolsProblem, LP_Data); + auto MPproblem = std::shared_ptr(ortoolsProblem->MPSolver()); auto analyzer = makeUnfeasiblePbAnalyzer(); analyzer->run(MPproblem.get()); diff --git a/src/solver/utils/include/antares/solver/utils/ortools_utils.h b/src/solver/utils/include/antares/solver/utils/ortools_utils.h index 9f62995453..cb8a604d01 100644 --- a/src/solver/utils/include/antares/solver/utils/ortools_utils.h +++ b/src/solver/utils/include/antares/solver/utils/ortools_utils.h @@ -108,26 +108,5 @@ class Nomenclature char prefix_; }; -class ProblemSimplexeNommeConverter -{ -public: - explicit ProblemSimplexeNommeConverter( - const std::string& solverName, - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe); - - MPSolver* Convert(); - -private: - const std::string& solverName_; - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe_; - Nomenclature variableNameManager_ = Nomenclature('x'); - Nomenclature constraintNameManager_ = Nomenclature('c'); - - void CreateVariable(unsigned idxVar, MPSolver* solver, MPObjective* const objective) const; - void CopyVariables(MPSolver* solver) const; - void UpdateContraints(unsigned idxRow, MPSolver* solver) const; - void CopyRows(MPSolver* solver) const; - void CopyMatrix(const MPSolver* solver) const; -}; } // namespace Optimization } // namespace Antares diff --git a/src/solver/utils/include/antares/solver/utils/ortools_wrapper.h b/src/solver/utils/include/antares/solver/utils/ortools_wrapper.h index cdb8a5c577..886bd16950 100644 --- a/src/solver/utils/include/antares/solver/utils/ortools_wrapper.h +++ b/src/solver/utils/include/antares/solver/utils/ortools_wrapper.h @@ -34,9 +34,6 @@ MPSolver* ORTOOLS_Simplexe(Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probl bool keepBasis, const Antares::Solver::Optimization::OptimizationOptions& options); -MPSolver* ConvertIntoOrtools(const std::string& solverName, - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probleme); - void ORTOOLS_ModifierLeVecteurCouts(MPSolver* ProbSpx, const double* costs, int nbVar); void ORTOOLS_ModifierLeVecteurSecondMembre(MPSolver* ProbSpx, const double* rhs, diff --git a/src/solver/utils/ortools_utils.cpp b/src/solver/utils/ortools_utils.cpp index d04d8f6612..57866651d0 100644 --- a/src/solver/utils/ortools_utils.cpp +++ b/src/solver/utils/ortools_utils.cpp @@ -102,111 +102,6 @@ static bool solverSupportsWarmStart(const MPSolver::OptimizationProblemType solv } } -namespace Antares -{ -namespace Optimization -{ -ProblemSimplexeNommeConverter::ProblemSimplexeNommeConverter( - const std::string& solverName, - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe): - solverName_(solverName), - problemeSimplexe_(problemeSimplexe) -{ - if (problemeSimplexe_->UseNamedProblems()) - { - variableNameManager_.SetTarget(problemeSimplexe_->VariableNames()); - constraintNameManager_.SetTarget(problemeSimplexe_->ConstraintNames()); - } -} - -MPSolver* ProblemSimplexeNommeConverter::Convert() -{ - MPSolver* solver = MPSolverFactory(problemeSimplexe_, solverName_); - - // Create the variables and set objective cost. - CopyVariables(solver); - - // Create constraints and set coefs - CopyRows(solver); - - CopyMatrix(solver); - - return solver; -} - -void ProblemSimplexeNommeConverter::CopyMatrix(const MPSolver* solver) const -{ - auto variables = solver->variables(); - auto constraints = solver->constraints(); - - for (int idxRow = 0; idxRow < problemeSimplexe_->NombreDeContraintes; ++idxRow) - { - MPConstraint* const ct = constraints[idxRow]; - int debutLigne = problemeSimplexe_->IndicesDebutDeLigne[idxRow]; - for (int idxCoef = 0; idxCoef < problemeSimplexe_->NombreDeTermesDesLignes[idxRow]; - ++idxCoef) - { - int pos = debutLigne + idxCoef; - ct->SetCoefficient(variables[problemeSimplexe_->IndicesColonnes[pos]], - problemeSimplexe_->CoefficientsDeLaMatriceDesContraintes[pos]); - } - } -} - -void ProblemSimplexeNommeConverter::CreateVariable(unsigned idxVar, - MPSolver* solver, - MPObjective* const objective) const -{ - double min_l = problemeSimplexe_->Xmin[idxVar]; - double max_l = problemeSimplexe_->Xmax[idxVar]; - bool isIntegerVariable = problemeSimplexe_->IntegerVariable(idxVar); - const MPVariable* var = solver->MakeVar(min_l, - max_l, - isIntegerVariable, - variableNameManager_.GetName(idxVar)); - objective->SetCoefficient(var, problemeSimplexe_->CoutLineaire[idxVar]); -} - -void ProblemSimplexeNommeConverter::CopyVariables(MPSolver* solver) const - -{ - MPObjective* const objective = solver->MutableObjective(); - for (int idxVar = 0; idxVar < problemeSimplexe_->NombreDeVariables; ++idxVar) - { - CreateVariable(idxVar, solver, objective); - } -} - -void ProblemSimplexeNommeConverter::UpdateContraints(unsigned idxRow, MPSolver* solver) const -{ - double bMin = -MPSolver::infinity(), bMax = MPSolver::infinity(); - if (problemeSimplexe_->Sens[idxRow] == '=') - { - bMin = bMax = problemeSimplexe_->SecondMembre[idxRow]; - } - else if (problemeSimplexe_->Sens[idxRow] == '<') - { - bMax = problemeSimplexe_->SecondMembre[idxRow]; - } - else if (problemeSimplexe_->Sens[idxRow] == '>') - { - bMin = problemeSimplexe_->SecondMembre[idxRow]; - } - - solver->MakeRowConstraint(bMin, bMax, constraintNameManager_.GetName(idxRow)); -} - -void ProblemSimplexeNommeConverter::CopyRows(MPSolver* solver) const -{ - for (int idxRow = 0; idxRow < problemeSimplexe_->NombreDeContraintes; ++idxRow) - { - UpdateContraints(idxRow, solver); - } -} - -} // namespace Optimization -} // namespace Antares - static void extractSolutionValues(const std::vector& variables, Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe) { @@ -329,13 +224,6 @@ bool solveAndManageStatus(MPSolver* solver, int& resultStatus, const MPSolverPar return resultStatus == OUI_SPX; } -MPSolver* ConvertIntoOrtools(const std::string& solverName, - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probleme) -{ - Antares::Optimization::ProblemSimplexeNommeConverter converter(solverName, Probleme); - return converter.Convert(); -} - MPSolver* ORTOOLS_Simplexe(Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probleme, MPSolver* solver, bool keepBasis, From b4ef65f82e03422bad4d57445901eacd5a2c7271 Mon Sep 17 00:00:00 2001 From: Guillaume PIERRE Date: Fri, 11 Oct 2024 13:42:09 +0200 Subject: [PATCH 07/29] Legacy ortools behind API : correction due to review --- .../modeler/api/fillers/LegacyOrtoolsFiller.h | 36 +++++++++++++------ .../opt_appel_solveur_lineaire.cpp | 4 +-- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/solver/modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h b/src/solver/modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h index ea2771f751..384b4ef33c 100644 --- a/src/solver/modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h +++ b/src/solver/modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h @@ -12,8 +12,7 @@ namespace Antares::Solver::Modeler::Api class LegacyOrtoolsFiller: public LinearProblemFiller { public: - explicit LegacyOrtoolsFiller(operations_research::MPSolver* mpSolver, - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe); + explicit LegacyOrtoolsFiller(const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe); void addVariables(ILinearProblem& pb, LinearProblemData& data) override; void addConstraints(ILinearProblem& pb, LinearProblemData& data) override; void addObjective(ILinearProblem& pb, LinearProblemData& data) override; @@ -31,9 +30,7 @@ class LegacyOrtoolsFiller: public LinearProblemFiller void CopyMatrix(const MPSolver* solver) const; }; -LegacyOrtoolsFiller::LegacyOrtoolsFiller(operations_research::MPSolver* mpSolver, - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe) : - mpSolver_(mpSolver), +LegacyOrtoolsFiller::LegacyOrtoolsFiller(const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe) : problemeSimplexe_(problemeSimplexe) { if (problemeSimplexe_->UseNamedProblems()) @@ -45,16 +42,33 @@ LegacyOrtoolsFiller::LegacyOrtoolsFiller(operations_research::MPSolver* mpSolver void LegacyOrtoolsFiller::addVariables(ILinearProblem& pb, LinearProblemData& data) { - // Create the variables and set objective cost. - CopyVariables(mpSolver_); + auto* mpSolver = dynamic_cast(&pb); + if(mpSolver) + { + // Create the variables and set objective cost. + CopyVariables(mpSolver); + } + else + { + logs.error() << "Invalid cast, ortools MPSolver expected.";; + throw std::bad_cast(); + } } void LegacyOrtoolsFiller::addConstraints(ILinearProblem& pb, LinearProblemData& data) { - // Create constraints and set coefs - CopyRows(mpSolver_); - - CopyMatrix(mpSolver_); + auto* mpSolver = dynamic_cast(&pb); + if(mpSolver) + { + // Create constraints and set coefs + CopyRows(mpSolver); + CopyMatrix(mpSolver); + } + else + { + logs.error() << "Invalid cast, ortools MPSolver expected."; + throw std::bad_cast(); + } } void LegacyOrtoolsFiller::addObjective(ILinearProblem& pb, LinearProblemData& data) diff --git a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp index 8b5f0a9477..d258614236 100644 --- a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp +++ b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp @@ -207,7 +207,7 @@ static SimplexResult OPT_TryToCallSimplex(const OptimizationOptions& options, Probleme.NombreDeContraintesCoupes = 0; auto ortoolsProblem = std::make_unique(Probleme.isMIP(), options.ortoolsSolver); - auto legacyOrtoolsFiller = std::make_unique(ortoolsProblem->MPSolver(), &Probleme); + auto legacyOrtoolsFiller = std::make_unique(&Probleme); std::vector fillersCollection = {legacyOrtoolsFiller.get()}; LinearProblemData LP_Data; LinearProblemBuilder linearProblemBuilder(fillersCollection); @@ -383,7 +383,7 @@ bool OPT_AppelDuSimplexe(const OptimizationOptions& options, Probleme.SetUseNamedProblems(true); auto ortoolsProblem = std::make_unique(Probleme.isMIP(), options.ortoolsSolver); - auto legacyOrtoolsFiller = std::make_unique(ortoolsProblem->MPSolver(), &Probleme); + auto legacyOrtoolsFiller = std::make_unique(&Probleme); std::vector fillersCollection = {legacyOrtoolsFiller.get()}; LinearProblemData LP_Data; LinearProblemBuilder linearProblemBuilder(fillersCollection); From ef29f1d34aafcc6edc0a2ff489345c88178ffd15 Mon Sep 17 00:00:00 2001 From: Guillaume PIERRE Date: Fri, 11 Oct 2024 14:47:50 +0200 Subject: [PATCH 08/29] Legacy ortools behind API : correction due to review --- src/solver/modeler/api/CMakeLists.txt | 2 - src/solver/optimisation/CMakeLists.txt | 2 + .../LegacyOrtoolsFiller.cpp} | 37 +++---------------- .../solver/optimisation/LegacyOrtoolsFiller.h | 32 ++++++++++++++++ .../opt_appel_solveur_lineaire.cpp | 2 +- 5 files changed, 41 insertions(+), 34 deletions(-) rename src/solver/{modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h => optimisation/LegacyOrtoolsFiller.cpp} (71%) create mode 100644 src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h diff --git a/src/solver/modeler/api/CMakeLists.txt b/src/solver/modeler/api/CMakeLists.txt index c15ae518b8..41789ae9cb 100644 --- a/src/solver/modeler/api/CMakeLists.txt +++ b/src/solver/modeler/api/CMakeLists.txt @@ -13,8 +13,6 @@ set(SRC_API include/antares/solver/modeler/api/linearProblemFiller.h include/antares/solver/modeler/api/linearProblemBuilder.h - include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h - linearProblemData.cpp linearProblemBuilder.cpp ) diff --git a/src/solver/optimisation/CMakeLists.txt b/src/solver/optimisation/CMakeLists.txt index 7f5a94b4cd..06fc0b8e16 100644 --- a/src/solver/optimisation/CMakeLists.txt +++ b/src/solver/optimisation/CMakeLists.txt @@ -170,6 +170,8 @@ set(RTESOLVER_OPT variables/VariableManagerUtils.cpp include/antares/solver/optimisation/HebdoProblemToLpsTranslator.h HebdoProblemToLpsTranslator.cpp + include/antares/solver/optimisation/LegacyOrtoolsFiller.h + LegacyOrtoolsFiller.cpp ) diff --git a/src/solver/modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h b/src/solver/optimisation/LegacyOrtoolsFiller.cpp similarity index 71% rename from src/solver/modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h rename to src/solver/optimisation/LegacyOrtoolsFiller.cpp index 384b4ef33c..9b14e98b2d 100644 --- a/src/solver/modeler/api/include/antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h +++ b/src/solver/optimisation/LegacyOrtoolsFiller.cpp @@ -1,34 +1,8 @@ -#pragma once +#include "antares/solver/optimisation/LegacyOrtoolsFiller.h" -#include "antares/solver/modeler/api/linearProblemFiller.h" -#include "ortools/linear_solver/linear_solver.h" -#include "antares/solver/utils/named_problem.h" -#include "antares/solver/utils/ortools_utils.h" -using namespace Antares::Optimization; - -namespace Antares::Solver::Modeler::Api -{ -class LegacyOrtoolsFiller: public LinearProblemFiller +namespace Antares::Optimization { -public: - explicit LegacyOrtoolsFiller(const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe); - void addVariables(ILinearProblem& pb, LinearProblemData& data) override; - void addConstraints(ILinearProblem& pb, LinearProblemData& data) override; - void addObjective(ILinearProblem& pb, LinearProblemData& data) override; - -private: - operations_research::MPSolver* mpSolver_ = nullptr; - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe_; - Nomenclature variableNameManager_ = Nomenclature('x'); - Nomenclature constraintNameManager_ = Nomenclature('c'); - - void CreateVariable(unsigned idxVar, MPSolver* solver, MPObjective* const objective) const; - void CopyVariables(MPSolver* solver) const; - void UpdateContraints(unsigned idxRow, MPSolver* solver) const; - void CopyRows(MPSolver* solver) const; - void CopyMatrix(const MPSolver* solver) const; -}; LegacyOrtoolsFiller::LegacyOrtoolsFiller(const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe) : problemeSimplexe_(problemeSimplexe) @@ -50,7 +24,7 @@ void LegacyOrtoolsFiller::addVariables(ILinearProblem& pb, LinearProblemData& da } else { - logs.error() << "Invalid cast, ortools MPSolver expected.";; + logs.error() << "Invalid cast, ortools MPSolver expected."; throw std::bad_cast(); } } @@ -95,8 +69,8 @@ void LegacyOrtoolsFiller::CopyMatrix(const MPSolver* solver) const } void LegacyOrtoolsFiller::CreateVariable(unsigned idxVar, - MPSolver* solver, - MPObjective* const objective) const + MPSolver* solver, + MPObjective* const objective) const { double min_l = problemeSimplexe_->Xmin[idxVar]; double max_l = problemeSimplexe_->Xmax[idxVar]; @@ -145,3 +119,4 @@ void LegacyOrtoolsFiller::CopyRows(MPSolver* solver) const } } } + diff --git a/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h b/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h new file mode 100644 index 0000000000..cae771aefa --- /dev/null +++ b/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h @@ -0,0 +1,32 @@ +#pragma once + +#include "antares/solver/modeler/api/linearProblemFiller.h" +#include "ortools/linear_solver/linear_solver.h" +#include "antares/solver/utils/named_problem.h" +#include "antares/solver/utils/ortools_utils.h" + +using namespace Antares::Solver::Modeler::Api; + +namespace Antares::Optimization +{ +class LegacyOrtoolsFiller: public LinearProblemFiller +{ +public: + explicit LegacyOrtoolsFiller(const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe); + void addVariables(ILinearProblem& pb, LinearProblemData& data) override; + void addConstraints(ILinearProblem& pb, LinearProblemData& data) override; + void addObjective(ILinearProblem& pb, LinearProblemData& data) override; + +private: + operations_research::MPSolver* mpSolver_ = nullptr; + const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe_; + Nomenclature variableNameManager_ = Nomenclature('x'); + Nomenclature constraintNameManager_ = Nomenclature('c'); + + void CreateVariable(unsigned idxVar, MPSolver* solver, MPObjective* const objective) const; + void CopyVariables(MPSolver* solver) const; + void UpdateContraints(unsigned idxRow, MPSolver* solver) const; + void CopyRows(MPSolver* solver) const; + void CopyMatrix(const MPSolver* solver) const; +}; +} diff --git a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp index d258614236..7d2e4d8fda 100644 --- a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp +++ b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp @@ -27,7 +27,7 @@ #include #include "antares/optimization-options/options.h" #include "antares/solver/infeasible-problem-analysis/unfeasible-pb-analyzer.h" -#include "antares/solver/modeler/api/fillers/LegacyOrtoolsFiller.h" +#include "antares/solver/optimisation/LegacyOrtoolsFiller.h" #include "antares/solver/modeler/api/linearProblemBuilder.h" #include "antares/solver/modeler/ortoolsImpl/linearProblem.h" #include "antares/solver/optimisation/opt_structure_probleme_a_resoudre.h" From b6c97585e034dfe7e092460e0b65385ccbb270a7 Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Mon, 14 Oct 2024 09:16:49 +0200 Subject: [PATCH 09/29] activate some tests on new simtest reference Signed-off-by: Peter Mitri --- .github/workflows/ubuntu.yml | 30 ++++++++++++++--------------- .github/workflows/windows-vcpkg.yml | 30 ++++++++++++++--------------- simtest.json | 2 +- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index e363ee596f..8a036b94b3 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -150,14 +150,14 @@ jobs: run: | git submodule update --init --remote --recursive src/tests/resources/Antares_Simulator_Tests_NR - #- name: Run named mps tests - # if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} - # uses: ./.github/workflows/run-tests - # with: - # simtest-tag: ${{ env.SIMTEST }} - # batch-name: valid-named-mps - # os: ${{ env.os }} - # variant: "named-mps" + - name: Run named mps tests + if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + uses: ./.github/workflows/run-tests + with: + simtest-tag: ${{ env.SIMTEST }} + batch-name: valid-named-mps + os: ${{ env.os }} + variant: "named-mps" - name: Run unfeasibility-related tests if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} @@ -240,13 +240,13 @@ jobs: with: feature: "features/short_tests.feature" - #- name: Run mps tests - # if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} - # uses: ./.github/workflows/run-tests - # with: - # simtest-tag: ${{ env.SIMTEST }} - # batch-name: valid-mps - # os: ${{ env.os }} + - name: Run mps tests + if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + uses: ./.github/workflows/run-tests + with: + simtest-tag: ${{ env.SIMTEST }} + batch-name: valid-mps + os: ${{ env.os }} - name: Run tests for adequacy patch (CSR) if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} diff --git a/.github/workflows/windows-vcpkg.yml b/.github/workflows/windows-vcpkg.yml index edd41d5f4f..a8c73d5def 100644 --- a/.github/workflows/windows-vcpkg.yml +++ b/.github/workflows/windows-vcpkg.yml @@ -152,14 +152,14 @@ jobs: run: | git submodule update --init --remote src/tests/resources/Antares_Simulator_Tests_NR - #- name: Run named mps tests - # if: ${{ env.RUN_SIMPLE_TESTS == 'true' && ! cancelled() }} - # uses: ./.github/workflows/run-tests - # with: - # simtest-tag: ${{ env.SIMTEST }} - # batch-name: valid-named-mps - # os: ${{ env.os }} - # variant: "named-mps" + - name: Run named mps tests + if: ${{ env.RUN_SIMPLE_TESTS == 'true' && ! cancelled() }} + uses: ./.github/workflows/run-tests + with: + simtest-tag: ${{ env.SIMTEST }} + batch-name: valid-named-mps + os: ${{ env.os }} + variant: "named-mps" - name: Run unfeasibility-related tests if: ${{ env.RUN_SIMPLE_TESTS == 'true' && ! cancelled() }} @@ -250,13 +250,13 @@ jobs: with: feature: "features/short_tests.feature" - #- name: Run mps tests - # if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} - # uses: ./.github/workflows/run-tests - # with: - # simtest-tag: ${{ env.SIMTEST }} - # batch-name: valid-mps - # os: ${{ env.os }} + - name: Run mps tests + if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + uses: ./.github/workflows/run-tests + with: + simtest-tag: ${{ env.SIMTEST }} + batch-name: valid-mps + os: ${{ env.os }} - name: Run parallel tests if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} diff --git a/simtest.json b/simtest.json index 03ea9af205..3b08452241 100644 --- a/simtest.json +++ b/simtest.json @@ -1,3 +1,3 @@ { - "version": "v9.2.0e" + "version": "v9.2.0e-ortools" } From 499f5483eb021e41700292fb4d33d94f32ede216 Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Mon, 14 Oct 2024 09:50:22 +0200 Subject: [PATCH 10/29] activate ortools in end-to-end tests --- src/tests/run-study-tests/actions_on_study/study_run.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tests/run-study-tests/actions_on_study/study_run.py b/src/tests/run-study-tests/actions_on_study/study_run.py index 8867aafda5..2ba259ed90 100644 --- a/src/tests/run-study-tests/actions_on_study/study_run.py +++ b/src/tests/run-study-tests/actions_on_study/study_run.py @@ -23,6 +23,8 @@ def run(self): solver_full_path = str(Path(self.solver_path).resolve()) command = [solver_full_path, "-i", str(self.study_path)] + self.use_ortools = True + self.ortools_solver = "sirius" if self.use_ortools: command.append('--use-ortools') command.append('--ortools-solver=' + self.ortools_solver) From 3fdc8fc9a077a514d539825111a0d8493f29fd6f Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Mon, 14 Oct 2024 09:59:59 +0200 Subject: [PATCH 11/29] fix simtest version --- simtest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simtest.json b/simtest.json index 3b08452241..0126e1bd30 100644 --- a/simtest.json +++ b/simtest.json @@ -1,3 +1,3 @@ { - "version": "v9.2.0e-ortools" + "version": "v9.2.0.e-ortools" } From 89724ea72d0a853afdcc51a2fcfceed67cf28ad6 Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Mon, 14 Oct 2024 10:06:38 +0200 Subject: [PATCH 12/29] fix clang format --- src/solver/optimisation/LegacyOrtoolsFiller.cpp | 11 +++++------ .../antares/solver/optimisation/LegacyOrtoolsFiller.h | 8 +++++--- .../optimisation/opt_appel_solveur_lineaire.cpp | 8 +++++--- .../include/antares/solver/utils/ortools_utils.h | 3 +-- src/solver/utils/ortools_utils.cpp | 3 +-- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/solver/optimisation/LegacyOrtoolsFiller.cpp b/src/solver/optimisation/LegacyOrtoolsFiller.cpp index 9b14e98b2d..d271ce6cf4 100644 --- a/src/solver/optimisation/LegacyOrtoolsFiller.cpp +++ b/src/solver/optimisation/LegacyOrtoolsFiller.cpp @@ -1,10 +1,10 @@ #include "antares/solver/optimisation/LegacyOrtoolsFiller.h" - namespace Antares::Optimization { -LegacyOrtoolsFiller::LegacyOrtoolsFiller(const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe) : +LegacyOrtoolsFiller::LegacyOrtoolsFiller( + const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe): problemeSimplexe_(problemeSimplexe) { if (problemeSimplexe_->UseNamedProblems()) @@ -17,7 +17,7 @@ LegacyOrtoolsFiller::LegacyOrtoolsFiller(const Antares::Optimization::PROBLEME_S void LegacyOrtoolsFiller::addVariables(ILinearProblem& pb, LinearProblemData& data) { auto* mpSolver = dynamic_cast(&pb); - if(mpSolver) + if (mpSolver) { // Create the variables and set objective cost. CopyVariables(mpSolver); @@ -32,7 +32,7 @@ void LegacyOrtoolsFiller::addVariables(ILinearProblem& pb, LinearProblemData& da void LegacyOrtoolsFiller::addConstraints(ILinearProblem& pb, LinearProblemData& data) { auto* mpSolver = dynamic_cast(&pb); - if(mpSolver) + if (mpSolver) { // Create constraints and set coefs CopyRows(mpSolver); @@ -118,5 +118,4 @@ void LegacyOrtoolsFiller::CopyRows(MPSolver* solver) const UpdateContraints(idxRow, solver); } } -} - +} // namespace Antares::Optimization diff --git a/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h b/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h index cae771aefa..4084bf6df0 100644 --- a/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h +++ b/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h @@ -1,10 +1,11 @@ #pragma once #include "antares/solver/modeler/api/linearProblemFiller.h" -#include "ortools/linear_solver/linear_solver.h" #include "antares/solver/utils/named_problem.h" #include "antares/solver/utils/ortools_utils.h" +#include "ortools/linear_solver/linear_solver.h" + using namespace Antares::Solver::Modeler::Api; namespace Antares::Optimization @@ -12,7 +13,8 @@ namespace Antares::Optimization class LegacyOrtoolsFiller: public LinearProblemFiller { public: - explicit LegacyOrtoolsFiller(const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe); + explicit LegacyOrtoolsFiller( + const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe); void addVariables(ILinearProblem& pb, LinearProblemData& data) override; void addConstraints(ILinearProblem& pb, LinearProblemData& data) override; void addObjective(ILinearProblem& pb, LinearProblemData& data) override; @@ -29,4 +31,4 @@ class LegacyOrtoolsFiller: public LinearProblemFiller void CopyRows(MPSolver* solver) const; void CopyMatrix(const MPSolver* solver) const; }; -} +} // namespace Antares::Optimization diff --git a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp index 7d2e4d8fda..0103296926 100644 --- a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp +++ b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp @@ -27,9 +27,9 @@ #include #include "antares/optimization-options/options.h" #include "antares/solver/infeasible-problem-analysis/unfeasible-pb-analyzer.h" -#include "antares/solver/optimisation/LegacyOrtoolsFiller.h" #include "antares/solver/modeler/api/linearProblemBuilder.h" #include "antares/solver/modeler/ortoolsImpl/linearProblem.h" +#include "antares/solver/optimisation/LegacyOrtoolsFiller.h" #include "antares/solver/optimisation/opt_structure_probleme_a_resoudre.h" #include "antares/solver/simulation/sim_structure_probleme_economique.h" #include "antares/solver/utils/filename.h" @@ -206,7 +206,8 @@ static SimplexResult OPT_TryToCallSimplex(const OptimizationOptions& options, Probleme.NombreDeContraintesCoupes = 0; - auto ortoolsProblem = std::make_unique(Probleme.isMIP(), options.ortoolsSolver); + auto ortoolsProblem = std::make_unique(Probleme.isMIP(), + options.ortoolsSolver); auto legacyOrtoolsFiller = std::make_unique(&Probleme); std::vector fillersCollection = {legacyOrtoolsFiller.get()}; LinearProblemData LP_Data; @@ -382,7 +383,8 @@ bool OPT_AppelDuSimplexe(const OptimizationOptions& options, Probleme.SetUseNamedProblems(true); - auto ortoolsProblem = std::make_unique(Probleme.isMIP(), options.ortoolsSolver); + auto ortoolsProblem = std::make_unique(Probleme.isMIP(), + options.ortoolsSolver); auto legacyOrtoolsFiller = std::make_unique(&Probleme); std::vector fillersCollection = {legacyOrtoolsFiller.get()}; LinearProblemData LP_Data; diff --git a/src/solver/utils/include/antares/solver/utils/ortools_utils.h b/src/solver/utils/include/antares/solver/utils/ortools_utils.h index cb8a604d01..20a26e57af 100644 --- a/src/solver/utils/include/antares/solver/utils/ortools_utils.h +++ b/src/solver/utils/include/antares/solver/utils/ortools_utils.h @@ -58,8 +58,7 @@ std::string availableOrToolsSolversString(); * * \return MPSolver */ -MPSolver* MPSolverFactory(const bool isMip, - const std::string& solverName); +MPSolver* MPSolverFactory(const bool isMip, const std::string& solverName); std::string generateTempPath(const std::string& filename); void removeTemporaryFile(const std::string& tmpPath); diff --git a/src/solver/utils/ortools_utils.cpp b/src/solver/utils/ortools_utils.cpp index 57866651d0..d45357f382 100644 --- a/src/solver/utils/ortools_utils.cpp +++ b/src/solver/utils/ortools_utils.cpp @@ -354,8 +354,7 @@ std::string availableOrToolsSolversString() return solvers.str(); } -MPSolver* MPSolverFactory(const bool isMip, - const std::string& solverName) +MPSolver* MPSolverFactory(const bool isMip, const std::string& solverName) { MPSolver* solver; try From f03e7057fb288a43dd6dc4cd94f9706ebf5b630f Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Mon, 14 Oct 2024 10:07:54 +0200 Subject: [PATCH 13/29] fix simtest version --- simtest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simtest.json b/simtest.json index 0126e1bd30..f4a0977717 100644 --- a/simtest.json +++ b/simtest.json @@ -1,3 +1,3 @@ { - "version": "v9.2.0.e-ortools" + "version": "v9.2.0.d-ortools" } From 836a73a20ddb2180683c95355bf78b6812073017 Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Mon, 14 Oct 2024 10:35:44 +0200 Subject: [PATCH 14/29] fix after merge --- src/solver/optimisation/LegacyOrtoolsFiller.cpp | 6 +++--- .../antares/solver/optimisation/LegacyOrtoolsFiller.h | 6 +++--- src/solver/optimisation/opt_appel_solveur_lineaire.cpp | 6 ++++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/solver/optimisation/LegacyOrtoolsFiller.cpp b/src/solver/optimisation/LegacyOrtoolsFiller.cpp index d271ce6cf4..20fd1073ae 100644 --- a/src/solver/optimisation/LegacyOrtoolsFiller.cpp +++ b/src/solver/optimisation/LegacyOrtoolsFiller.cpp @@ -14,7 +14,7 @@ LegacyOrtoolsFiller::LegacyOrtoolsFiller( } } -void LegacyOrtoolsFiller::addVariables(ILinearProblem& pb, LinearProblemData& data) +void LegacyOrtoolsFiller::addVariables(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) { auto* mpSolver = dynamic_cast(&pb); if (mpSolver) @@ -29,7 +29,7 @@ void LegacyOrtoolsFiller::addVariables(ILinearProblem& pb, LinearProblemData& da } } -void LegacyOrtoolsFiller::addConstraints(ILinearProblem& pb, LinearProblemData& data) +void LegacyOrtoolsFiller::addConstraints(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) { auto* mpSolver = dynamic_cast(&pb); if (mpSolver) @@ -45,7 +45,7 @@ void LegacyOrtoolsFiller::addConstraints(ILinearProblem& pb, LinearProblemData& } } -void LegacyOrtoolsFiller::addObjective(ILinearProblem& pb, LinearProblemData& data) +void LegacyOrtoolsFiller::addObjective(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) { } diff --git a/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h b/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h index 4084bf6df0..d70b13c326 100644 --- a/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h +++ b/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h @@ -15,9 +15,9 @@ class LegacyOrtoolsFiller: public LinearProblemFiller public: explicit LegacyOrtoolsFiller( const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe); - void addVariables(ILinearProblem& pb, LinearProblemData& data) override; - void addConstraints(ILinearProblem& pb, LinearProblemData& data) override; - void addObjective(ILinearProblem& pb, LinearProblemData& data) override; + void addVariables(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) override; + void addConstraints(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) override; + void addObjective(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) override; private: operations_research::MPSolver* mpSolver_ = nullptr; diff --git a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp index 0103296926..7709e8f89b 100644 --- a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp +++ b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp @@ -211,11 +211,12 @@ static SimplexResult OPT_TryToCallSimplex(const OptimizationOptions& options, auto legacyOrtoolsFiller = std::make_unique(&Probleme); std::vector fillersCollection = {legacyOrtoolsFiller.get()}; LinearProblemData LP_Data; + FillContext fillCtx(0, 167); LinearProblemBuilder linearProblemBuilder(fillersCollection); if (options.ortoolsUsed && solver == nullptr) { - linearProblemBuilder.build(*ortoolsProblem, LP_Data); + linearProblemBuilder.build(*ortoolsProblem, LP_Data, fillCtx); solver = ortoolsProblem->MPSolver(); } const std::string filename = createMPSfilename(optPeriodStringGenerator, optimizationNumber); @@ -388,9 +389,10 @@ bool OPT_AppelDuSimplexe(const OptimizationOptions& options, auto legacyOrtoolsFiller = std::make_unique(&Probleme); std::vector fillersCollection = {legacyOrtoolsFiller.get()}; LinearProblemData LP_Data; + FillContext fillCtx(0, 167); LinearProblemBuilder linearProblemBuilder(fillersCollection); - linearProblemBuilder.build(*ortoolsProblem, LP_Data); + linearProblemBuilder.build(*ortoolsProblem, LP_Data, fillCtx); auto MPproblem = std::shared_ptr(ortoolsProblem->MPSolver()); auto analyzer = makeUnfeasiblePbAnalyzer(); From d3264285ea338c19b1731dc3e6684b9006720854 Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Mon, 14 Oct 2024 10:40:16 +0200 Subject: [PATCH 15/29] fix clang format --- src/solver/optimisation/LegacyOrtoolsFiller.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/solver/optimisation/LegacyOrtoolsFiller.cpp b/src/solver/optimisation/LegacyOrtoolsFiller.cpp index 20fd1073ae..00c099b811 100644 --- a/src/solver/optimisation/LegacyOrtoolsFiller.cpp +++ b/src/solver/optimisation/LegacyOrtoolsFiller.cpp @@ -14,7 +14,9 @@ LegacyOrtoolsFiller::LegacyOrtoolsFiller( } } -void LegacyOrtoolsFiller::addVariables(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) +void LegacyOrtoolsFiller::addVariables(ILinearProblem& pb, + LinearProblemData& data, + FillContext& ctx) { auto* mpSolver = dynamic_cast(&pb); if (mpSolver) @@ -29,7 +31,9 @@ void LegacyOrtoolsFiller::addVariables(ILinearProblem& pb, LinearProblemData& da } } -void LegacyOrtoolsFiller::addConstraints(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) +void LegacyOrtoolsFiller::addConstraints(ILinearProblem& pb, + LinearProblemData& data, + FillContext& ctx) { auto* mpSolver = dynamic_cast(&pb); if (mpSolver) @@ -45,7 +49,9 @@ void LegacyOrtoolsFiller::addConstraints(ILinearProblem& pb, LinearProblemData& } } -void LegacyOrtoolsFiller::addObjective(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) +void LegacyOrtoolsFiller::addObjective(ILinearProblem& pb, + LinearProblemData& data, + FillContext& ctx) { } From c2a02d882e65664f516b5d1deb63c419bfde141a Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Mon, 14 Oct 2024 16:09:56 +0200 Subject: [PATCH 16/29] Improve 3.1 (#2461) Signed-off-by: Peter Mitri --- .../solver/modeler/api/linearProblem.h | 6 + .../modeler/ortoolsImpl/linearProblem.h | 14 +- .../modeler/ortoolsImpl/linearProblem.cpp | 7 +- src/solver/optimisation/CMakeLists.txt | 255 +++++++++--------- .../optimisation/LegacyOrtoolsFiller.cpp | 70 ++--- .../solver/optimisation/LegacyOrtoolsFiller.h | 11 +- .../optimisation/LegacyOrtoolsLinearProblem.h | 45 ++++ .../opt_appel_solveur_lineaire.cpp | 14 +- .../actions_on_study/study_run.py | 6 +- 9 files changed, 234 insertions(+), 194 deletions(-) create mode 100644 src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsLinearProblem.h diff --git a/src/solver/modeler/api/include/antares/solver/modeler/api/linearProblem.h b/src/solver/modeler/api/include/antares/solver/modeler/api/linearProblem.h index 38006291e0..94c95e4e31 100644 --- a/src/solver/modeler/api/include/antares/solver/modeler/api/linearProblem.h +++ b/src/solver/modeler/api/include/antares/solver/modeler/api/linearProblem.h @@ -46,6 +46,9 @@ class ILinearProblem virtual IMipVariable* addNumVariable(double lb, double ub, const std::string& name) = 0; /// Create a integer variable virtual IMipVariable* addIntVariable(double lb, double ub, const std::string& name) = 0; + /// Create a continuous or integer variable + virtual IMipVariable* addVariable(double lb, double ub, bool integer, const std::string& name) + = 0; virtual IMipVariable* getVariable(const std::string& name) const = 0; virtual int variableCount() const = 0; @@ -68,6 +71,9 @@ class ILinearProblem /// Solve the problem, returns a IMipSolution virtual IMipSolution* solve(bool verboseSolver) = 0; + + // Definition of infinity + virtual double infinity() const = 0; }; } // namespace Antares::Solver::Modeler::Api diff --git a/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/linearProblem.h b/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/linearProblem.h index 5535606730..3d69ee98e9 100644 --- a/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/linearProblem.h +++ b/src/solver/modeler/ortoolsImpl/include/antares/solver/modeler/ortoolsImpl/linearProblem.h @@ -36,7 +36,7 @@ class MPObjective; namespace Antares::Solver::Modeler::OrtoolsImpl { -class OrtoolsLinearProblem final: public Api::ILinearProblem +class OrtoolsLinearProblem: public Api::ILinearProblem { public: OrtoolsLinearProblem(bool isMip, const std::string& solverName); @@ -44,6 +44,10 @@ class OrtoolsLinearProblem final: public Api::ILinearProblem OrtoolsMipVariable* addNumVariable(double lb, double ub, const std::string& name) override; OrtoolsMipVariable* addIntVariable(double lb, double ub, const std::string& name) override; + OrtoolsMipVariable* addVariable(double lb, + double ub, + bool integer, + const std::string& name) override; OrtoolsMipVariable* getVariable(const std::string& name) const override; int variableCount() const override; @@ -61,11 +65,13 @@ class OrtoolsLinearProblem final: public Api::ILinearProblem bool isMaximization() const override; OrtoolsMipSolution* solve(bool verboseSolver) override; - operations_research::MPSolver* MPSolver(); -private: - OrtoolsMipVariable* addVariable(double lb, double ub, bool integer, const std::string& name); + double infinity() const override; + +protected: + operations_research::MPSolver* MpSolver() const; +private: operations_research::MPSolver* mpSolver_; operations_research::MPObjective* objective_; operations_research::MPSolverParameters params_; diff --git a/src/solver/modeler/ortoolsImpl/linearProblem.cpp b/src/solver/modeler/ortoolsImpl/linearProblem.cpp index 49faef6676..6e8b942945 100644 --- a/src/solver/modeler/ortoolsImpl/linearProblem.cpp +++ b/src/solver/modeler/ortoolsImpl/linearProblem.cpp @@ -164,7 +164,7 @@ bool OrtoolsLinearProblem::isMaximization() const return objective_->maximization(); } -MPSolver* OrtoolsLinearProblem::MPSolver() +MPSolver* OrtoolsLinearProblem::MpSolver() const { return mpSolver_; } @@ -182,4 +182,9 @@ OrtoolsMipSolution* OrtoolsLinearProblem::solve(bool verboseSolver) return solution_.get(); } +double OrtoolsLinearProblem::infinity() const +{ + return MPSolver::infinity(); +} + } // namespace Antares::Solver::Modeler::OrtoolsImpl diff --git a/src/solver/optimisation/CMakeLists.txt b/src/solver/optimisation/CMakeLists.txt index 06fc0b8e16..2d5cad5091 100644 --- a/src/solver/optimisation/CMakeLists.txt +++ b/src/solver/optimisation/CMakeLists.txt @@ -4,11 +4,11 @@ set(RTESOLVER_OPT opt_gestion_second_membre_cas_lineaire.cpp opt_optimisation_lineaire.cpp opt_chainage_intercos.cpp - include/antares/solver/optimisation/opt_fonctions.h + include/antares/solver/optimisation/opt_fonctions.h opt_pilotage_optimisation_lineaire.cpp opt_pilotage_optimisation_quadratique.cpp - include/antares/solver/optimisation/opt_structure_probleme_a_resoudre.h - include/antares/solver/optimisation/opt_constants.h + include/antares/solver/optimisation/opt_structure_probleme_a_resoudre.h + include/antares/solver/optimisation/opt_constants.h opt_alloc_probleme_a_optimiser.cpp opt_gestion_des_bornes_cas_quadratique.cpp opt_construction_variables_optimisees_lineaire.cpp @@ -19,7 +19,7 @@ set(RTESOLVER_OPT opt_numero_de_jour_du_pas_de_temps.cpp opt_construction_variables_optimisees_quadratique.cpp opt_decompte_variables_et_contraintes.cpp - opt_decompte_variables_et_contraintes.cpp + opt_decompte_variables_et_contraintes.cpp opt_gestion_des_bornes_cas_lineaire.cpp opt_verification_presence_reserve_jmoins1.cpp opt_init_contraintes_hydrauliques.cpp @@ -27,7 +27,7 @@ set(RTESOLVER_OPT opt_liberation_problemes_simplexe.cpp opt_restaurer_les_donnees.cpp opt_gestion_des_couts_cas_quadratique.cpp - opt_gestion_des_couts_cas_quadratique.cpp + opt_gestion_des_couts_cas_quadratique.cpp opt_construction_variables_couts_demarrages.cpp opt_gestion_des_bornes_couts_demarrage.cpp opt_gestion_des_couts_couts_demarrage.cpp @@ -36,142 +36,143 @@ set(RTESOLVER_OPT opt_decompte_variables_et_contraintes_couts_demarrage.cpp opt_init_minmax_groupes_couts_demarrage.cpp opt_nombre_min_groupes_demarres_couts_demarrage.cpp - include/antares/solver/optimisation/opt_export_structure.h + include/antares/solver/optimisation/opt_export_structure.h opt_export_structure.cpp - include/antares/solver/optimisation/weekly_optimization.h + include/antares/solver/optimisation/weekly_optimization.h weekly_optimization.cpp - include/antares/solver/optimisation/optim_post_process_list.h + include/antares/solver/optimisation/optim_post_process_list.h optim_post_process_list.cpp - include/antares/solver/optimisation/post_process_commands.h + include/antares/solver/optimisation/post_process_commands.h post_process_commands.cpp - include/antares/solver/optimisation/adequacy_patch_csr/hourly_csr_problem.h - include/antares/solver/optimisation/adequacy_patch_csr/adq_patch_post_process_list.h - include/antares/solver/optimisation/adequacy_patch_csr/post_processing.h + include/antares/solver/optimisation/adequacy_patch_csr/hourly_csr_problem.h + include/antares/solver/optimisation/adequacy_patch_csr/adq_patch_post_process_list.h + include/antares/solver/optimisation/adequacy_patch_csr/post_processing.h adequacy_patch_csr/adq_patch_post_process_list.cpp adequacy_patch_csr/post_processing.cpp - include/antares/solver/optimisation/adequacy_patch_csr/adq_patch_curtailment_sharing.h + include/antares/solver/optimisation/adequacy_patch_csr/adq_patch_curtailment_sharing.h adequacy_patch_csr/adq_patch_curtailment_sharing.cpp adequacy_patch_csr/solve_problem.cpp adequacy_patch_csr/set_variable_boundaries.cpp adequacy_patch_csr/set_problem_cost_function.cpp adequacy_patch_csr/construct_problem_variables.cpp adequacy_patch_csr/construct_problem_constraints_RHS.cpp - include/antares/solver/optimisation/adequacy_patch_csr/csr_quadratic_problem.h + include/antares/solver/optimisation/adequacy_patch_csr/csr_quadratic_problem.h adequacy_patch_csr/csr_quadratic_problem.cpp - include/antares/solver/optimisation/adequacy_patch_csr/count_constraints_variables.h + include/antares/solver/optimisation/adequacy_patch_csr/count_constraints_variables.h adequacy_patch_csr/count_constraints_variables.cpp include/antares/solver/optimisation/adequacy_patch_csr/constraints/CsrFlowDissociation.h - adequacy_patch_csr/constraints/CsrFlowDissociation.cpp + adequacy_patch_csr/constraints/CsrFlowDissociation.cpp include/antares/solver/optimisation/adequacy_patch_csr/constraints/CsrAreaBalance.h - adequacy_patch_csr/constraints/CsrAreaBalance.cpp + adequacy_patch_csr/constraints/CsrAreaBalance.cpp include/antares/solver/optimisation/adequacy_patch_csr/constraints/CsrBindingConstraintHour.h - adequacy_patch_csr/constraints/CsrBindingConstraintHour.cpp + adequacy_patch_csr/constraints/CsrBindingConstraintHour.cpp - include/antares/solver/optimisation/opt_rename_problem.h + include/antares/solver/optimisation/opt_rename_problem.h opt_rename_problem.cpp constraints/ConstraintBuilder.cpp - include/antares/solver/optimisation/constraints/ConstraintBuilder.h + include/antares/solver/optimisation/constraints/ConstraintBuilder.h constraints/constraint_builder_utils.cpp include/antares/solver/optimisation/constraints/constraint_builder_utils.h include/antares/solver/optimisation/constraints/AreaBalance.h - constraints/AreaBalance.cpp - include/antares/solver/optimisation/constraints/FictitiousLoad.h - constraints/FictitiousLoad.cpp - include/antares/solver/optimisation/constraints/ShortTermStorageLevel.h - constraints/ShortTermStorageLevel.cpp - include/antares/solver/optimisation/constraints/FlowDissociation.h - constraints/FlowDissociation.cpp - include/antares/solver/optimisation/constraints/BindingConstraintHour.h - constraints/BindingConstraintHour.cpp - include/antares/solver/optimisation/constraints/BindingConstraintDay.h - constraints/BindingConstraintDay.cpp - include/antares/solver/optimisation/constraints/BindingConstraintWeek.h - constraints/BindingConstraintWeek.cpp - include/antares/solver/optimisation/constraints/HydroPower.h - constraints/HydroPower.cpp - include/antares/solver/optimisation/constraints/HydroPowerSmoothingUsingVariationSum.h - constraints/HydroPowerSmoothingUsingVariationSum.cpp - include/antares/solver/optimisation/constraints/HydroPowerSmoothingUsingVariationMaxDown.h - constraints/HydroPowerSmoothingUsingVariationMaxDown.cpp - include/antares/solver/optimisation/constraints/HydroPowerSmoothingUsingVariationMaxUp.h - constraints/HydroPowerSmoothingUsingVariationMaxUp.cpp - include/antares/solver/optimisation/constraints/MinHydroPower.h - constraints/MinHydroPower.cpp - include/antares/solver/optimisation/constraints/MaxHydroPower.h - constraints/MaxHydroPower.cpp - include/antares/solver/optimisation/constraints/MaxPumping.h - constraints/MaxPumping.cpp - include/antares/solver/optimisation/constraints/AreaHydroLevel.h - constraints/AreaHydroLevel.cpp - include/antares/solver/optimisation/constraints/FinalStockEquivalent.h - constraints/FinalStockEquivalent.cpp - include/antares/solver/optimisation/constraints/FinalStockExpression.h - constraints/FinalStockExpression.cpp - include/antares/solver/optimisation/constraints/PMaxDispatchableGeneration.h - constraints/PMaxDispatchableGeneration.cpp - include/antares/solver/optimisation/constraints/PMinDispatchableGeneration.h - constraints/PMinDispatchableGeneration.cpp - include/antares/solver/optimisation/constraints/ConsistenceNumberOfDispatchableUnits.h - constraints/ConsistenceNumberOfDispatchableUnits.cpp - include/antares/solver/optimisation/constraints/NbUnitsOutageLessThanNbUnitsStop.h - constraints/NbUnitsOutageLessThanNbUnitsStop.cpp - include/antares/solver/optimisation/constraints/NbDispUnitsMinBoundSinceMinUpTime.h - constraints/NbDispUnitsMinBoundSinceMinUpTime.cpp - include/antares/solver/optimisation/constraints/MinDownTime.h - constraints/MinDownTime.cpp + constraints/AreaBalance.cpp + include/antares/solver/optimisation/constraints/FictitiousLoad.h + constraints/FictitiousLoad.cpp + include/antares/solver/optimisation/constraints/ShortTermStorageLevel.h + constraints/ShortTermStorageLevel.cpp + include/antares/solver/optimisation/constraints/FlowDissociation.h + constraints/FlowDissociation.cpp + include/antares/solver/optimisation/constraints/BindingConstraintHour.h + constraints/BindingConstraintHour.cpp + include/antares/solver/optimisation/constraints/BindingConstraintDay.h + constraints/BindingConstraintDay.cpp + include/antares/solver/optimisation/constraints/BindingConstraintWeek.h + constraints/BindingConstraintWeek.cpp + include/antares/solver/optimisation/constraints/HydroPower.h + constraints/HydroPower.cpp + include/antares/solver/optimisation/constraints/HydroPowerSmoothingUsingVariationSum.h + constraints/HydroPowerSmoothingUsingVariationSum.cpp + include/antares/solver/optimisation/constraints/HydroPowerSmoothingUsingVariationMaxDown.h + constraints/HydroPowerSmoothingUsingVariationMaxDown.cpp + include/antares/solver/optimisation/constraints/HydroPowerSmoothingUsingVariationMaxUp.h + constraints/HydroPowerSmoothingUsingVariationMaxUp.cpp + include/antares/solver/optimisation/constraints/MinHydroPower.h + constraints/MinHydroPower.cpp + include/antares/solver/optimisation/constraints/MaxHydroPower.h + constraints/MaxHydroPower.cpp + include/antares/solver/optimisation/constraints/MaxPumping.h + constraints/MaxPumping.cpp + include/antares/solver/optimisation/constraints/AreaHydroLevel.h + constraints/AreaHydroLevel.cpp + include/antares/solver/optimisation/constraints/FinalStockEquivalent.h + constraints/FinalStockEquivalent.cpp + include/antares/solver/optimisation/constraints/FinalStockExpression.h + constraints/FinalStockExpression.cpp + include/antares/solver/optimisation/constraints/PMaxDispatchableGeneration.h + constraints/PMaxDispatchableGeneration.cpp + include/antares/solver/optimisation/constraints/PMinDispatchableGeneration.h + constraints/PMinDispatchableGeneration.cpp + include/antares/solver/optimisation/constraints/ConsistenceNumberOfDispatchableUnits.h + constraints/ConsistenceNumberOfDispatchableUnits.cpp + include/antares/solver/optimisation/constraints/NbUnitsOutageLessThanNbUnitsStop.h + constraints/NbUnitsOutageLessThanNbUnitsStop.cpp + include/antares/solver/optimisation/constraints/NbDispUnitsMinBoundSinceMinUpTime.h + constraints/NbDispUnitsMinBoundSinceMinUpTime.cpp + include/antares/solver/optimisation/constraints/MinDownTime.h + constraints/MinDownTime.cpp - include/antares/solver/optimisation/ProblemMatrixEssential.h - ProblemMatrixEssential.cpp - include/antares/solver/optimisation/LinearProblemMatrixStartUpCosts.h - LinearProblemMatrixStartUpCosts.cpp - include/antares/solver/optimisation/LinearProblemMatrix.h - LinearProblemMatrix.cpp - include/antares/solver/optimisation/QuadraticProblemMatrix.h - QuadraticProblemMatrix.cpp - include/antares/solver/optimisation/constraints/ConstraintGroup.h - include/antares/solver/optimisation/constraints/Group1.h - constraints/Group1.cpp - include/antares/solver/optimisation/constraints/BindingConstraintDayGroup.h - constraints/BindingConstraintDayGroup.cpp - include/antares/solver/optimisation/constraints/BindingConstraintWeekGroup.h - constraints/BindingConstraintWeekGroup.cpp - include/antares/solver/optimisation/constraints/HydroPowerGroup.h - constraints/HydroPowerGroup.cpp - include/antares/solver/optimisation/constraints/HydraulicSmoothingGroup.h - constraints/HydraulicSmoothingGroup.cpp - include/antares/solver/optimisation/constraints/MinMaxHydroPowerGroup.h - constraints/MinMaxHydroPowerGroup.cpp - include/antares/solver/optimisation/constraints/MaxPumpingGroup.h - constraints/MaxPumpingGroup.cpp - include/antares/solver/optimisation/constraints/AreaHydroLevelGroup.h - constraints/AreaHydroLevelGroup.cpp - include/antares/solver/optimisation/constraints/FinalStockGroup.h - constraints/FinalStockGroup.cpp - include/antares/solver/optimisation/constraints/AbstractStartUpCostsGroup.h - constraints/AbstractStartUpCostsGroup.cpp - include/antares/solver/optimisation/constraints/PMinMaxDispatchableGenerationGroup.h - constraints/PMinMaxDispatchableGenerationGroup.cpp - include/antares/solver/optimisation/constraints/ConsistenceNumberOfDispatchableUnitsGroup.h - constraints/ConsistenceNumberOfDispatchableUnitsGroup.cpp - include/antares/solver/optimisation/constraints/NbUnitsOutageLessThanNbUnitsStopGroup.h - constraints/NbUnitsOutageLessThanNbUnitsStopGroup.cpp - include/antares/solver/optimisation/constraints/NbDispUnitsMinBoundSinceMinUpTimeGroup.h - constraints/NbDispUnitsMinBoundSinceMinUpTimeGroup.cpp - include/antares/solver/optimisation/constraints/MinDownTimeGroup.h - constraints/MinDownTimeGroup.cpp - include/antares/solver/optimisation/constraints/ExchangeBalance.h - constraints/ExchangeBalance.cpp - include/antares/solver/optimisation/constraints/ExchangeBalanceGroup.h - constraints/ExchangeBalanceGroup.cpp - variables/VariableManagement.h - variables/VariableManagement.cpp - variables/VariableManagerUtils.h - variables/VariableManagerUtils.cpp - include/antares/solver/optimisation/HebdoProblemToLpsTranslator.h - HebdoProblemToLpsTranslator.cpp - include/antares/solver/optimisation/LegacyOrtoolsFiller.h - LegacyOrtoolsFiller.cpp + include/antares/solver/optimisation/ProblemMatrixEssential.h + ProblemMatrixEssential.cpp + include/antares/solver/optimisation/LinearProblemMatrixStartUpCosts.h + LinearProblemMatrixStartUpCosts.cpp + include/antares/solver/optimisation/LinearProblemMatrix.h + LinearProblemMatrix.cpp + include/antares/solver/optimisation/QuadraticProblemMatrix.h + QuadraticProblemMatrix.cpp + include/antares/solver/optimisation/constraints/ConstraintGroup.h + include/antares/solver/optimisation/constraints/Group1.h + constraints/Group1.cpp + include/antares/solver/optimisation/constraints/BindingConstraintDayGroup.h + constraints/BindingConstraintDayGroup.cpp + include/antares/solver/optimisation/constraints/BindingConstraintWeekGroup.h + constraints/BindingConstraintWeekGroup.cpp + include/antares/solver/optimisation/constraints/HydroPowerGroup.h + constraints/HydroPowerGroup.cpp + include/antares/solver/optimisation/constraints/HydraulicSmoothingGroup.h + constraints/HydraulicSmoothingGroup.cpp + include/antares/solver/optimisation/constraints/MinMaxHydroPowerGroup.h + constraints/MinMaxHydroPowerGroup.cpp + include/antares/solver/optimisation/constraints/MaxPumpingGroup.h + constraints/MaxPumpingGroup.cpp + include/antares/solver/optimisation/constraints/AreaHydroLevelGroup.h + constraints/AreaHydroLevelGroup.cpp + include/antares/solver/optimisation/constraints/FinalStockGroup.h + constraints/FinalStockGroup.cpp + include/antares/solver/optimisation/constraints/AbstractStartUpCostsGroup.h + constraints/AbstractStartUpCostsGroup.cpp + include/antares/solver/optimisation/constraints/PMinMaxDispatchableGenerationGroup.h + constraints/PMinMaxDispatchableGenerationGroup.cpp + include/antares/solver/optimisation/constraints/ConsistenceNumberOfDispatchableUnitsGroup.h + constraints/ConsistenceNumberOfDispatchableUnitsGroup.cpp + include/antares/solver/optimisation/constraints/NbUnitsOutageLessThanNbUnitsStopGroup.h + constraints/NbUnitsOutageLessThanNbUnitsStopGroup.cpp + include/antares/solver/optimisation/constraints/NbDispUnitsMinBoundSinceMinUpTimeGroup.h + constraints/NbDispUnitsMinBoundSinceMinUpTimeGroup.cpp + include/antares/solver/optimisation/constraints/MinDownTimeGroup.h + constraints/MinDownTimeGroup.cpp + include/antares/solver/optimisation/constraints/ExchangeBalance.h + constraints/ExchangeBalance.cpp + include/antares/solver/optimisation/constraints/ExchangeBalanceGroup.h + constraints/ExchangeBalanceGroup.cpp + variables/VariableManagement.h + variables/VariableManagement.cpp + variables/VariableManagerUtils.h + variables/VariableManagerUtils.cpp + include/antares/solver/optimisation/HebdoProblemToLpsTranslator.h + HebdoProblemToLpsTranslator.cpp + include/antares/solver/optimisation/LegacyOrtoolsLinearProblem.h + include/antares/solver/optimisation/LegacyOrtoolsFiller.h + LegacyOrtoolsFiller.cpp ) @@ -189,17 +190,17 @@ else () #set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} /wd 4101") # unused local variable endif () target_link_libraries(model_antares - PUBLIC - Antares::solverUtils - sirius_solver - antares-solver-simulation - Antares::benchmarking - Antares::optimization-options - Antares::lps - PRIVATE - infeasible_problem_analysis - Antares::modeler_api - Antares::modeler-ortools-impl + PUBLIC + Antares::solverUtils + sirius_solver + antares-solver-simulation + Antares::benchmarking + Antares::optimization-options + Antares::lps + PRIVATE + infeasible_problem_analysis + Antares::modeler_api + Antares::modeler-ortools-impl ) target_include_directories(model_antares diff --git a/src/solver/optimisation/LegacyOrtoolsFiller.cpp b/src/solver/optimisation/LegacyOrtoolsFiller.cpp index 00c099b811..3262190236 100644 --- a/src/solver/optimisation/LegacyOrtoolsFiller.cpp +++ b/src/solver/optimisation/LegacyOrtoolsFiller.cpp @@ -18,35 +18,17 @@ void LegacyOrtoolsFiller::addVariables(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) { - auto* mpSolver = dynamic_cast(&pb); - if (mpSolver) - { - // Create the variables and set objective cost. - CopyVariables(mpSolver); - } - else - { - logs.error() << "Invalid cast, ortools MPSolver expected."; - throw std::bad_cast(); - } + // Create the variables and set objective cost. + CopyVariables(pb); } void LegacyOrtoolsFiller::addConstraints(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) { - auto* mpSolver = dynamic_cast(&pb); - if (mpSolver) - { - // Create constraints and set coefs - CopyRows(mpSolver); - CopyMatrix(mpSolver); - } - else - { - logs.error() << "Invalid cast, ortools MPSolver expected."; - throw std::bad_cast(); - } + // Create constraints and set coefs + CopyRows(pb); + CopyMatrix(pb); } void LegacyOrtoolsFiller::addObjective(ILinearProblem& pb, @@ -55,52 +37,46 @@ void LegacyOrtoolsFiller::addObjective(ILinearProblem& pb, { } -void LegacyOrtoolsFiller::CopyMatrix(const MPSolver* solver) const +void LegacyOrtoolsFiller::CopyMatrix(ILinearProblem& pb) const { - auto variables = solver->variables(); - auto constraints = solver->constraints(); - for (int idxRow = 0; idxRow < problemeSimplexe_->NombreDeContraintes; ++idxRow) { - MPConstraint* const ct = constraints[idxRow]; + auto* ct = pb.getConstraint(constraintNameManager_.GetName(idxRow)); int debutLigne = problemeSimplexe_->IndicesDebutDeLigne[idxRow]; for (int idxCoef = 0; idxCoef < problemeSimplexe_->NombreDeTermesDesLignes[idxRow]; ++idxCoef) { int pos = debutLigne + idxCoef; - ct->SetCoefficient(variables[problemeSimplexe_->IndicesColonnes[pos]], - problemeSimplexe_->CoefficientsDeLaMatriceDesContraintes[pos]); + auto* var = pb.getVariable( + variableNameManager_.GetName(problemeSimplexe_->IndicesColonnes[pos])); + ct->setCoefficient(var, problemeSimplexe_->CoefficientsDeLaMatriceDesContraintes[pos]); } } } -void LegacyOrtoolsFiller::CreateVariable(unsigned idxVar, - MPSolver* solver, - MPObjective* const objective) const +void LegacyOrtoolsFiller::CreateVariable(unsigned idxVar, ILinearProblem& pb) const { double min_l = problemeSimplexe_->Xmin[idxVar]; double max_l = problemeSimplexe_->Xmax[idxVar]; bool isIntegerVariable = problemeSimplexe_->IntegerVariable(idxVar); - const MPVariable* var = solver->MakeVar(min_l, - max_l, - isIntegerVariable, - variableNameManager_.GetName(idxVar)); - objective->SetCoefficient(var, problemeSimplexe_->CoutLineaire[idxVar]); + auto* var = pb.addVariable(min_l, + max_l, + isIntegerVariable, + variableNameManager_.GetName(idxVar)); + pb.setObjectiveCoefficient(var, problemeSimplexe_->CoutLineaire[idxVar]); } -void LegacyOrtoolsFiller::CopyVariables(MPSolver* solver) const - +void LegacyOrtoolsFiller::CopyVariables(ILinearProblem& pb) const { - MPObjective* const objective = solver->MutableObjective(); for (int idxVar = 0; idxVar < problemeSimplexe_->NombreDeVariables; ++idxVar) { - CreateVariable(idxVar, solver, objective); + CreateVariable(idxVar, pb); } } -void LegacyOrtoolsFiller::UpdateContraints(unsigned idxRow, MPSolver* solver) const +void LegacyOrtoolsFiller::UpdateContraints(unsigned idxRow, ILinearProblem& pb) const { - double bMin = -MPSolver::infinity(), bMax = MPSolver::infinity(); + double bMin = -pb.infinity(), bMax = pb.infinity(); if (problemeSimplexe_->Sens[idxRow] == '=') { bMin = bMax = problemeSimplexe_->SecondMembre[idxRow]; @@ -114,14 +90,14 @@ void LegacyOrtoolsFiller::UpdateContraints(unsigned idxRow, MPSolver* solver) co bMin = problemeSimplexe_->SecondMembre[idxRow]; } - solver->MakeRowConstraint(bMin, bMax, constraintNameManager_.GetName(idxRow)); + pb.addConstraint(bMin, bMax, constraintNameManager_.GetName(idxRow)); } -void LegacyOrtoolsFiller::CopyRows(MPSolver* solver) const +void LegacyOrtoolsFiller::CopyRows(ILinearProblem& pb) const { for (int idxRow = 0; idxRow < problemeSimplexe_->NombreDeContraintes; ++idxRow) { - UpdateContraints(idxRow, solver); + UpdateContraints(idxRow, pb); } } } // namespace Antares::Optimization diff --git a/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h b/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h index d70b13c326..30ddf844f3 100644 --- a/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h +++ b/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h @@ -20,15 +20,14 @@ class LegacyOrtoolsFiller: public LinearProblemFiller void addObjective(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) override; private: - operations_research::MPSolver* mpSolver_ = nullptr; const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe_; Nomenclature variableNameManager_ = Nomenclature('x'); Nomenclature constraintNameManager_ = Nomenclature('c'); - void CreateVariable(unsigned idxVar, MPSolver* solver, MPObjective* const objective) const; - void CopyVariables(MPSolver* solver) const; - void UpdateContraints(unsigned idxRow, MPSolver* solver) const; - void CopyRows(MPSolver* solver) const; - void CopyMatrix(const MPSolver* solver) const; + void CreateVariable(unsigned idxVar, ILinearProblem& pb) const; + void CopyVariables(ILinearProblem& pb) const; + void UpdateContraints(unsigned idxRow, ILinearProblem& pb) const; + void CopyRows(ILinearProblem& pb) const; + void CopyMatrix(ILinearProblem& pb) const; }; } // namespace Antares::Optimization diff --git a/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsLinearProblem.h b/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsLinearProblem.h new file mode 100644 index 0000000000..dfeda76bd9 --- /dev/null +++ b/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsLinearProblem.h @@ -0,0 +1,45 @@ +/* + * Copyright 2007-2024, RTE (https://www.rte-france.com) + * See AUTHORS.txt + * SPDX-License-Identifier: MPL-2.0 + * This file is part of Antares-Simulator, + * Adequacy and Performance assessment for interconnected energy networks. + * + * Antares_Simulator is free software: you can redistribute it and/or modify + * it under the terms of the Mozilla Public Licence 2.0 as published by + * the Mozilla Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * Antares_Simulator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Mozilla Public Licence 2.0 for more details. + * + * You should have received a copy of the Mozilla Public Licence 2.0 + * along with Antares_Simulator. If not, see . + */ + +#pragma once + +#include + +namespace Antares::Optimization +{ + +class LegacyOrtoolsLinearProblem final + : public Antares::Solver::Modeler::OrtoolsImpl::OrtoolsLinearProblem +{ +public: + LegacyOrtoolsLinearProblem(bool isMip, const std::string& solverName): + OrtoolsLinearProblem(isMip, solverName) + { + // nothing else to do + } + + operations_research::MPSolver* getMpSolver() + { + return MpSolver(); + } +}; + +} // namespace Antares::Optimization diff --git a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp index 7709e8f89b..9ffd7af5c3 100644 --- a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp +++ b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp @@ -28,8 +28,8 @@ #include "antares/optimization-options/options.h" #include "antares/solver/infeasible-problem-analysis/unfeasible-pb-analyzer.h" #include "antares/solver/modeler/api/linearProblemBuilder.h" -#include "antares/solver/modeler/ortoolsImpl/linearProblem.h" #include "antares/solver/optimisation/LegacyOrtoolsFiller.h" +#include "antares/solver/optimisation/LegacyOrtoolsLinearProblem.h" #include "antares/solver/optimisation/opt_structure_probleme_a_resoudre.h" #include "antares/solver/simulation/sim_structure_probleme_economique.h" #include "antares/solver/utils/filename.h" @@ -206,8 +206,8 @@ static SimplexResult OPT_TryToCallSimplex(const OptimizationOptions& options, Probleme.NombreDeContraintesCoupes = 0; - auto ortoolsProblem = std::make_unique(Probleme.isMIP(), - options.ortoolsSolver); + auto ortoolsProblem = std::make_unique(Probleme.isMIP(), + options.ortoolsSolver); auto legacyOrtoolsFiller = std::make_unique(&Probleme); std::vector fillersCollection = {legacyOrtoolsFiller.get()}; LinearProblemData LP_Data; @@ -217,7 +217,7 @@ static SimplexResult OPT_TryToCallSimplex(const OptimizationOptions& options, if (options.ortoolsUsed && solver == nullptr) { linearProblemBuilder.build(*ortoolsProblem, LP_Data, fillCtx); - solver = ortoolsProblem->MPSolver(); + solver = ortoolsProblem->getMpSolver(); } const std::string filename = createMPSfilename(optPeriodStringGenerator, optimizationNumber); @@ -384,8 +384,8 @@ bool OPT_AppelDuSimplexe(const OptimizationOptions& options, Probleme.SetUseNamedProblems(true); - auto ortoolsProblem = std::make_unique(Probleme.isMIP(), - options.ortoolsSolver); + auto ortoolsProblem = std::make_unique(Probleme.isMIP(), + options.ortoolsSolver); auto legacyOrtoolsFiller = std::make_unique(&Probleme); std::vector fillersCollection = {legacyOrtoolsFiller.get()}; LinearProblemData LP_Data; @@ -393,7 +393,7 @@ bool OPT_AppelDuSimplexe(const OptimizationOptions& options, LinearProblemBuilder linearProblemBuilder(fillersCollection); linearProblemBuilder.build(*ortoolsProblem, LP_Data, fillCtx); - auto MPproblem = std::shared_ptr(ortoolsProblem->MPSolver()); + auto MPproblem = std::shared_ptr(ortoolsProblem->getMpSolver()); auto analyzer = makeUnfeasiblePbAnalyzer(); analyzer->run(MPproblem.get()); diff --git a/src/tests/run-study-tests/actions_on_study/study_run.py b/src/tests/run-study-tests/actions_on_study/study_run.py index 2ba259ed90..b00bb04921 100644 --- a/src/tests/run-study-tests/actions_on_study/study_run.py +++ b/src/tests/run-study-tests/actions_on_study/study_run.py @@ -23,11 +23,13 @@ def run(self): solver_full_path = str(Path(self.solver_path).resolve()) command = [solver_full_path, "-i", str(self.study_path)] - self.use_ortools = True - self.ortools_solver = "sirius" + if self.use_ortools: command.append('--use-ortools') command.append('--ortools-solver=' + self.ortools_solver) + else: + command.append('--use-ortools') + command.append('--ortools-solver=sirius') if self.named_mps_problems: command.append('--named-mps-problems') if self.parallel: From 678fea0ae5723d7fedfcc454e80d7177b9e56761 Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Mon, 14 Oct 2024 17:46:18 +0200 Subject: [PATCH 17/29] some fixes --- src/solver/optimisation/CMakeLists.txt | 2 +- .../optimisation/LegacyOrtoolsFiller.cpp | 23 +++++++----- .../solver/optimisation/LegacyFiller.h | 37 +++++++++++++++++++ .../solver/optimisation/LegacyOrtoolsFiller.h | 33 ----------------- .../opt_appel_solveur_lineaire.cpp | 6 +-- 5 files changed, 54 insertions(+), 47 deletions(-) create mode 100644 src/solver/optimisation/include/antares/solver/optimisation/LegacyFiller.h delete mode 100644 src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h diff --git a/src/solver/optimisation/CMakeLists.txt b/src/solver/optimisation/CMakeLists.txt index 2d5cad5091..673ef09b5a 100644 --- a/src/solver/optimisation/CMakeLists.txt +++ b/src/solver/optimisation/CMakeLists.txt @@ -171,7 +171,7 @@ set(RTESOLVER_OPT include/antares/solver/optimisation/HebdoProblemToLpsTranslator.h HebdoProblemToLpsTranslator.cpp include/antares/solver/optimisation/LegacyOrtoolsLinearProblem.h - include/antares/solver/optimisation/LegacyOrtoolsFiller.h + include/antares/solver/optimisation/LegacyFiller.h LegacyOrtoolsFiller.cpp ) diff --git a/src/solver/optimisation/LegacyOrtoolsFiller.cpp b/src/solver/optimisation/LegacyOrtoolsFiller.cpp index 3262190236..7e356c623f 100644 --- a/src/solver/optimisation/LegacyOrtoolsFiller.cpp +++ b/src/solver/optimisation/LegacyOrtoolsFiller.cpp @@ -1,9 +1,11 @@ -#include "antares/solver/optimisation/LegacyOrtoolsFiller.h" +#include "antares/solver/optimisation/LegacyFiller.h" + +using namespace Antares::Solver::Modeler::Api; namespace Antares::Optimization { -LegacyOrtoolsFiller::LegacyOrtoolsFiller( +LegacyFiller::LegacyFiller( const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe): problemeSimplexe_(problemeSimplexe) { @@ -14,7 +16,7 @@ LegacyOrtoolsFiller::LegacyOrtoolsFiller( } } -void LegacyOrtoolsFiller::addVariables(ILinearProblem& pb, +void LegacyFiller::addVariables(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) { @@ -22,7 +24,7 @@ void LegacyOrtoolsFiller::addVariables(ILinearProblem& pb, CopyVariables(pb); } -void LegacyOrtoolsFiller::addConstraints(ILinearProblem& pb, +void LegacyFiller::addConstraints(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) { @@ -31,13 +33,14 @@ void LegacyOrtoolsFiller::addConstraints(ILinearProblem& pb, CopyMatrix(pb); } -void LegacyOrtoolsFiller::addObjective(ILinearProblem& pb, +void LegacyFiller::addObjective(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) { + // nothing to do: objective coefficients are set along with variables definition } -void LegacyOrtoolsFiller::CopyMatrix(ILinearProblem& pb) const +void LegacyFiller::CopyMatrix(ILinearProblem& pb) const { for (int idxRow = 0; idxRow < problemeSimplexe_->NombreDeContraintes; ++idxRow) { @@ -54,7 +57,7 @@ void LegacyOrtoolsFiller::CopyMatrix(ILinearProblem& pb) const } } -void LegacyOrtoolsFiller::CreateVariable(unsigned idxVar, ILinearProblem& pb) const +void LegacyFiller::CreateVariable(unsigned idxVar, ILinearProblem& pb) const { double min_l = problemeSimplexe_->Xmin[idxVar]; double max_l = problemeSimplexe_->Xmax[idxVar]; @@ -66,7 +69,7 @@ void LegacyOrtoolsFiller::CreateVariable(unsigned idxVar, ILinearProblem& pb) co pb.setObjectiveCoefficient(var, problemeSimplexe_->CoutLineaire[idxVar]); } -void LegacyOrtoolsFiller::CopyVariables(ILinearProblem& pb) const +void LegacyFiller::CopyVariables(ILinearProblem& pb) const { for (int idxVar = 0; idxVar < problemeSimplexe_->NombreDeVariables; ++idxVar) { @@ -74,7 +77,7 @@ void LegacyOrtoolsFiller::CopyVariables(ILinearProblem& pb) const } } -void LegacyOrtoolsFiller::UpdateContraints(unsigned idxRow, ILinearProblem& pb) const +void LegacyFiller::UpdateContraints(unsigned idxRow, ILinearProblem& pb) const { double bMin = -pb.infinity(), bMax = pb.infinity(); if (problemeSimplexe_->Sens[idxRow] == '=') @@ -93,7 +96,7 @@ void LegacyOrtoolsFiller::UpdateContraints(unsigned idxRow, ILinearProblem& pb) pb.addConstraint(bMin, bMax, constraintNameManager_.GetName(idxRow)); } -void LegacyOrtoolsFiller::CopyRows(ILinearProblem& pb) const +void LegacyFiller::CopyRows(ILinearProblem& pb) const { for (int idxRow = 0; idxRow < problemeSimplexe_->NombreDeContraintes; ++idxRow) { diff --git a/src/solver/optimisation/include/antares/solver/optimisation/LegacyFiller.h b/src/solver/optimisation/include/antares/solver/optimisation/LegacyFiller.h new file mode 100644 index 0000000000..b450126a69 --- /dev/null +++ b/src/solver/optimisation/include/antares/solver/optimisation/LegacyFiller.h @@ -0,0 +1,37 @@ +#pragma once + +#include "antares/solver/modeler/api/linearProblemFiller.h" +#include "antares/solver/utils/named_problem.h" +#include "antares/solver/utils/ortools_utils.h" + +#include "ortools/linear_solver/linear_solver.h" + +namespace Antares::Optimization +{ +class LegacyFiller: public Antares::Solver::Modeler::Api::LinearProblemFiller +{ +public: + explicit LegacyFiller( + const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe); + void addVariables(Antares::Solver::Modeler::Api::ILinearProblem& pb, + Antares::Solver::Modeler::Api::LinearProblemData& data, + Antares::Solver::Modeler::Api::FillContext& ctx) override; + void addConstraints(Antares::Solver::Modeler::Api::ILinearProblem& pb, + Antares::Solver::Modeler::Api::LinearProblemData& data, + Antares::Solver::Modeler::Api::FillContext& ctx) override; + void addObjective(Antares::Solver::Modeler::Api::ILinearProblem& pb, + Antares::Solver::Modeler::Api::LinearProblemData& data, + Antares::Solver::Modeler::Api::FillContext& ctx) override; + +private: + const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe_; + Nomenclature variableNameManager_ = Nomenclature('x'); + Nomenclature constraintNameManager_ = Nomenclature('c'); + + void CreateVariable(unsigned idxVar, Antares::Solver::Modeler::Api::ILinearProblem& pb) const; + void CopyVariables(Antares::Solver::Modeler::Api::ILinearProblem& pb) const; + void UpdateContraints(unsigned idxRow, Antares::Solver::Modeler::Api::ILinearProblem& pb) const; + void CopyRows(Antares::Solver::Modeler::Api::ILinearProblem& pb) const; + void CopyMatrix(Antares::Solver::Modeler::Api::ILinearProblem& pb) const; +}; +} // namespace Antares::Optimization diff --git a/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h b/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h deleted file mode 100644 index 30ddf844f3..0000000000 --- a/src/solver/optimisation/include/antares/solver/optimisation/LegacyOrtoolsFiller.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include "antares/solver/modeler/api/linearProblemFiller.h" -#include "antares/solver/utils/named_problem.h" -#include "antares/solver/utils/ortools_utils.h" - -#include "ortools/linear_solver/linear_solver.h" - -using namespace Antares::Solver::Modeler::Api; - -namespace Antares::Optimization -{ -class LegacyOrtoolsFiller: public LinearProblemFiller -{ -public: - explicit LegacyOrtoolsFiller( - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe); - void addVariables(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) override; - void addConstraints(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) override; - void addObjective(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) override; - -private: - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe_; - Nomenclature variableNameManager_ = Nomenclature('x'); - Nomenclature constraintNameManager_ = Nomenclature('c'); - - void CreateVariable(unsigned idxVar, ILinearProblem& pb) const; - void CopyVariables(ILinearProblem& pb) const; - void UpdateContraints(unsigned idxRow, ILinearProblem& pb) const; - void CopyRows(ILinearProblem& pb) const; - void CopyMatrix(ILinearProblem& pb) const; -}; -} // namespace Antares::Optimization diff --git a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp index 9ffd7af5c3..4aee790ea9 100644 --- a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp +++ b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp @@ -28,7 +28,7 @@ #include "antares/optimization-options/options.h" #include "antares/solver/infeasible-problem-analysis/unfeasible-pb-analyzer.h" #include "antares/solver/modeler/api/linearProblemBuilder.h" -#include "antares/solver/optimisation/LegacyOrtoolsFiller.h" +#include "antares/solver/optimisation/LegacyFiller.h" #include "antares/solver/optimisation/LegacyOrtoolsLinearProblem.h" #include "antares/solver/optimisation/opt_structure_probleme_a_resoudre.h" #include "antares/solver/simulation/sim_structure_probleme_economique.h" @@ -208,7 +208,7 @@ static SimplexResult OPT_TryToCallSimplex(const OptimizationOptions& options, auto ortoolsProblem = std::make_unique(Probleme.isMIP(), options.ortoolsSolver); - auto legacyOrtoolsFiller = std::make_unique(&Probleme); + auto legacyOrtoolsFiller = std::make_unique(&Probleme); std::vector fillersCollection = {legacyOrtoolsFiller.get()}; LinearProblemData LP_Data; FillContext fillCtx(0, 167); @@ -386,7 +386,7 @@ bool OPT_AppelDuSimplexe(const OptimizationOptions& options, auto ortoolsProblem = std::make_unique(Probleme.isMIP(), options.ortoolsSolver); - auto legacyOrtoolsFiller = std::make_unique(&Probleme); + auto legacyOrtoolsFiller = std::make_unique(&Probleme); std::vector fillersCollection = {legacyOrtoolsFiller.get()}; LinearProblemData LP_Data; FillContext fillCtx(0, 167); From 41b9c836d47373303ea16301551184de547e84dc Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Mon, 14 Oct 2024 17:48:47 +0200 Subject: [PATCH 18/29] some fixes --- src/solver/optimisation/CMakeLists.txt | 2 +- .../{LegacyOrtoolsFiller.cpp => LegacyFiller.cpp} | 15 ++++----------- .../antares/solver/optimisation/LegacyFiller.h | 3 +-- 3 files changed, 6 insertions(+), 14 deletions(-) rename src/solver/optimisation/{LegacyOrtoolsFiller.cpp => LegacyFiller.cpp} (82%) diff --git a/src/solver/optimisation/CMakeLists.txt b/src/solver/optimisation/CMakeLists.txt index 673ef09b5a..e2472febd1 100644 --- a/src/solver/optimisation/CMakeLists.txt +++ b/src/solver/optimisation/CMakeLists.txt @@ -172,7 +172,7 @@ set(RTESOLVER_OPT HebdoProblemToLpsTranslator.cpp include/antares/solver/optimisation/LegacyOrtoolsLinearProblem.h include/antares/solver/optimisation/LegacyFiller.h - LegacyOrtoolsFiller.cpp + LegacyFiller.cpp ) diff --git a/src/solver/optimisation/LegacyOrtoolsFiller.cpp b/src/solver/optimisation/LegacyFiller.cpp similarity index 82% rename from src/solver/optimisation/LegacyOrtoolsFiller.cpp rename to src/solver/optimisation/LegacyFiller.cpp index 7e356c623f..0e491a8e9c 100644 --- a/src/solver/optimisation/LegacyOrtoolsFiller.cpp +++ b/src/solver/optimisation/LegacyFiller.cpp @@ -5,8 +5,7 @@ using namespace Antares::Solver::Modeler::Api; namespace Antares::Optimization { -LegacyFiller::LegacyFiller( - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe): +LegacyFiller::LegacyFiller(const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe): problemeSimplexe_(problemeSimplexe) { if (problemeSimplexe_->UseNamedProblems()) @@ -16,26 +15,20 @@ LegacyFiller::LegacyFiller( } } -void LegacyFiller::addVariables(ILinearProblem& pb, - LinearProblemData& data, - FillContext& ctx) +void LegacyFiller::addVariables(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) { // Create the variables and set objective cost. CopyVariables(pb); } -void LegacyFiller::addConstraints(ILinearProblem& pb, - LinearProblemData& data, - FillContext& ctx) +void LegacyFiller::addConstraints(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) { // Create constraints and set coefs CopyRows(pb); CopyMatrix(pb); } -void LegacyFiller::addObjective(ILinearProblem& pb, - LinearProblemData& data, - FillContext& ctx) +void LegacyFiller::addObjective(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) { // nothing to do: objective coefficients are set along with variables definition } diff --git a/src/solver/optimisation/include/antares/solver/optimisation/LegacyFiller.h b/src/solver/optimisation/include/antares/solver/optimisation/LegacyFiller.h index b450126a69..19323ce38c 100644 --- a/src/solver/optimisation/include/antares/solver/optimisation/LegacyFiller.h +++ b/src/solver/optimisation/include/antares/solver/optimisation/LegacyFiller.h @@ -11,8 +11,7 @@ namespace Antares::Optimization class LegacyFiller: public Antares::Solver::Modeler::Api::LinearProblemFiller { public: - explicit LegacyFiller( - const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe); + explicit LegacyFiller(const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe); void addVariables(Antares::Solver::Modeler::Api::ILinearProblem& pb, Antares::Solver::Modeler::Api::LinearProblemData& data, Antares::Solver::Modeler::Api::FillContext& ctx) override; From c37bf6c1982f861e7a9c6036b56be29116d6e4ea Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Tue, 15 Oct 2024 10:08:36 +0200 Subject: [PATCH 19/29] activate long tests --- .github/workflows/ubuntu.yml | 6 +++--- .github/workflows/windows-vcpkg.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 8a036b94b3..ea846a87f2 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -288,7 +288,7 @@ jobs: feature: "features/medium_tests.feature" - name: Run long-tests-1 - if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} @@ -296,7 +296,7 @@ jobs: os: ${{ env.os }} - name: Run long-tests-2 - if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} @@ -304,7 +304,7 @@ jobs: os: ${{ env.os }} - name: Run long-tests-3 - if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} diff --git a/.github/workflows/windows-vcpkg.yml b/.github/workflows/windows-vcpkg.yml index a8c73d5def..9770c7eac8 100644 --- a/.github/workflows/windows-vcpkg.yml +++ b/.github/workflows/windows-vcpkg.yml @@ -290,7 +290,7 @@ jobs: feature: "features/medium_tests.feature" - name: Run long-tests-1 - if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} @@ -298,7 +298,7 @@ jobs: os: ${{ env.os }} - name: Run long-tests-2 - if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} @@ -306,7 +306,7 @@ jobs: os: ${{ env.os }} - name: Run long-tests-3 - if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} From 0c7d0547fab5acd531f9d1dc80f08fd31de0ddf1 Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Tue, 15 Oct 2024 16:01:32 +0200 Subject: [PATCH 20/29] Update src/solver/optimisation/LegacyFiller.cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Florian Omnès --- src/solver/optimisation/LegacyFiller.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/solver/optimisation/LegacyFiller.cpp b/src/solver/optimisation/LegacyFiller.cpp index 0e491a8e9c..f2d3de0bdb 100644 --- a/src/solver/optimisation/LegacyFiller.cpp +++ b/src/solver/optimisation/LegacyFiller.cpp @@ -73,17 +73,17 @@ void LegacyFiller::CopyVariables(ILinearProblem& pb) const void LegacyFiller::UpdateContraints(unsigned idxRow, ILinearProblem& pb) const { double bMin = -pb.infinity(), bMax = pb.infinity(); - if (problemeSimplexe_->Sens[idxRow] == '=') + switch (problemeSimplexe_->Sens[idxRow]) { + case '=': bMin = bMax = problemeSimplexe_->SecondMembre[idxRow]; - } - else if (problemeSimplexe_->Sens[idxRow] == '<') - { + break; + case '<': bMax = problemeSimplexe_->SecondMembre[idxRow]; - } - else if (problemeSimplexe_->Sens[idxRow] == '>') - { + break; + case: '>': bMin = problemeSimplexe_->SecondMembre[idxRow]; + break; } pb.addConstraint(bMin, bMax, constraintNameManager_.GetName(idxRow)); From 4aa95a2126cbb8569debafbc9dd0fdc553a055e3 Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Tue, 15 Oct 2024 16:03:03 +0200 Subject: [PATCH 21/29] fix --- src/solver/optimisation/LegacyFiller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solver/optimisation/LegacyFiller.cpp b/src/solver/optimisation/LegacyFiller.cpp index f2d3de0bdb..e7e8696d46 100644 --- a/src/solver/optimisation/LegacyFiller.cpp +++ b/src/solver/optimisation/LegacyFiller.cpp @@ -81,7 +81,7 @@ void LegacyFiller::UpdateContraints(unsigned idxRow, ILinearProblem& pb) const case '<': bMax = problemeSimplexe_->SecondMembre[idxRow]; break; - case: '>': + case '>': bMin = problemeSimplexe_->SecondMembre[idxRow]; break; } From a0463b82c8e70f2306486e9439ace3875f8b1eaf Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Wed, 16 Oct 2024 09:41:00 +0200 Subject: [PATCH 22/29] revert CI test changes --- .github/workflows/ubuntu.yml | 10 +++++----- .github/workflows/windows-vcpkg.yml | 10 +++++----- simtest.json | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index ea846a87f2..2c73097adb 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -257,7 +257,7 @@ jobs: os: ${{ env.os }} - name: Run parallel tests - if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} @@ -275,7 +275,7 @@ jobs: variant: "tsgenerator" - name: Run medium-tests - if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} @@ -288,7 +288,7 @@ jobs: feature: "features/medium_tests.feature" - name: Run long-tests-1 - if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} @@ -296,7 +296,7 @@ jobs: os: ${{ env.os }} - name: Run long-tests-2 - if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} @@ -304,7 +304,7 @@ jobs: os: ${{ env.os }} - name: Run long-tests-3 - if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} diff --git a/.github/workflows/windows-vcpkg.yml b/.github/workflows/windows-vcpkg.yml index 9770c7eac8..5fb4b19603 100644 --- a/.github/workflows/windows-vcpkg.yml +++ b/.github/workflows/windows-vcpkg.yml @@ -259,7 +259,7 @@ jobs: os: ${{ env.os }} - name: Run parallel tests - if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} @@ -277,7 +277,7 @@ jobs: variant: "tsgenerator" - name: Run medium-tests - if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} @@ -290,7 +290,7 @@ jobs: feature: "features/medium_tests.feature" - name: Run long-tests-1 - if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} @@ -298,7 +298,7 @@ jobs: os: ${{ env.os }} - name: Run long-tests-2 - if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} @@ -306,7 +306,7 @@ jobs: os: ${{ env.os }} - name: Run long-tests-3 - if: ${{ env.RUN_SIMPLE_TESTS == 'true' && !cancelled() }} + if: ${{ env.RUN_EXTENDED_TESTS == 'true' && !cancelled() }} uses: ./.github/workflows/run-tests with: simtest-tag: ${{ env.SIMTEST }} diff --git a/simtest.json b/simtest.json index f4a0977717..e304314827 100644 --- a/simtest.json +++ b/simtest.json @@ -1,3 +1,3 @@ { - "version": "v9.2.0.d-ortools" + "version": "v9.2.0e" } From d0a068681f2c023de6c1212533500f1fd39d0013 Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Wed, 16 Oct 2024 10:52:39 +0200 Subject: [PATCH 23/29] revert CI test changes --- src/tests/run-study-tests/actions_on_study/study_run.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/tests/run-study-tests/actions_on_study/study_run.py b/src/tests/run-study-tests/actions_on_study/study_run.py index b00bb04921..8867aafda5 100644 --- a/src/tests/run-study-tests/actions_on_study/study_run.py +++ b/src/tests/run-study-tests/actions_on_study/study_run.py @@ -23,13 +23,9 @@ def run(self): solver_full_path = str(Path(self.solver_path).resolve()) command = [solver_full_path, "-i", str(self.study_path)] - if self.use_ortools: command.append('--use-ortools') command.append('--ortools-solver=' + self.ortools_solver) - else: - command.append('--use-ortools') - command.append('--ortools-solver=sirius') if self.named_mps_problems: command.append('--named-mps-problems') if self.parallel: From 6a018aa503a86fb0b0a45c118d895300d35f6ac3 Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Wed, 16 Oct 2024 11:14:34 +0200 Subject: [PATCH 24/29] revert CI test changes --- simtest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/simtest.json b/simtest.json index e304314827..716c690f21 100644 --- a/simtest.json +++ b/simtest.json @@ -1,3 +1,3 @@ { - "version": "v9.2.0e" -} + "version": "v9.2.0e" +} \ No newline at end of file From 33abc2f37f14c5431e3568a0a34c4985a250fbcc Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Wed, 16 Oct 2024 11:15:10 +0200 Subject: [PATCH 25/29] revert CI test changes --- simtest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simtest.json b/simtest.json index 716c690f21..03ea9af205 100644 --- a/simtest.json +++ b/simtest.json @@ -1,3 +1,3 @@ { "version": "v9.2.0e" -} \ No newline at end of file +} From bf386b9039094c5c0bdf53cc90b395fcfa16d836 Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Thu, 17 Oct 2024 10:07:12 +0200 Subject: [PATCH 26/29] add message in case of MPS check failure --- .../run-study-tests/check_on_results/compare_mps_files.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/run-study-tests/check_on_results/compare_mps_files.py b/src/tests/run-study-tests/check_on_results/compare_mps_files.py index 152aaa7a80..76cf96c333 100644 --- a/src/tests/run-study-tests/check_on_results/compare_mps_files.py +++ b/src/tests/run-study-tests/check_on_results/compare_mps_files.py @@ -26,10 +26,10 @@ def run(self): self.find_folders_to_compare() ref_mps_files = list(self.ref_folder.glob('*.mps')) - assert ref_mps_files + assert ref_mps_files, "Couldn't find reference MPS files" mps_files = list(self.dated_output_folder.glob('**/*.mps')) - assert mps_files + assert mps_files, "Couldn't find actual output MPS files" list_of_pairs = [(mps_ref, mps) for mps_ref in ref_mps_files for mps in mps_files if mps_ref.name == mps.name] for pair in list_of_pairs: From 6b217e94fe504667df1ab77062be8a2c0af35ebf Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Thu, 17 Oct 2024 11:21:48 +0200 Subject: [PATCH 27/29] revert ortools activation in test --- src/tests/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 36f530ede4..2babe91fab 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -49,13 +49,13 @@ if(Python3_Interpreter_FOUND) # TODO : add more study batches add_test( NAME unfeasible - COMMAND Python3::Interpreter -m pytest -m unfeasible --solver-path=$ --use-ortools --ortools-solver sirius + COMMAND Python3::Interpreter -m pytest -m unfeasible --solver-path=$ WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/run-study-tests" ) add_test( NAME json - COMMAND Python3::Interpreter -m pytest -m json --solver-path=$ --use-ortools --ortools-solver sirius + COMMAND Python3::Interpreter -m pytest -m json --solver-path=$ WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/run-study-tests" ) @@ -73,7 +73,7 @@ if(Python3_Interpreter_FOUND) add_test( NAME parallel - COMMAND Python3::Interpreter -m pytest -m json --solver-path=$ --force-parallel --use-ortools --ortools-solver sirius + COMMAND Python3::Interpreter -m pytest -m json --solver-path=$ --force-parallel WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/run-study-tests" ) From 62863e7c4fb56af3715960645fe4aaaa504ccfc0 Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Tue, 22 Oct 2024 14:10:03 +0200 Subject: [PATCH 28/29] PR comments Signed-off-by: Peter Mitri --- src/solver/optimisation/LegacyFiller.cpp | 37 ++++++++++++------- .../solver/optimisation/LegacyFiller.h | 7 +--- .../antares/solver/utils/ortools_utils.h | 37 ------------------- 3 files changed, 26 insertions(+), 55 deletions(-) diff --git a/src/solver/optimisation/LegacyFiller.cpp b/src/solver/optimisation/LegacyFiller.cpp index e7e8696d46..7cbcaff820 100644 --- a/src/solver/optimisation/LegacyFiller.cpp +++ b/src/solver/optimisation/LegacyFiller.cpp @@ -8,11 +8,6 @@ namespace Antares::Optimization LegacyFiller::LegacyFiller(const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe): problemeSimplexe_(problemeSimplexe) { - if (problemeSimplexe_->UseNamedProblems()) - { - variableNameManager_.SetTarget(problemeSimplexe_->VariableNames()); - constraintNameManager_.SetTarget(problemeSimplexe_->ConstraintNames()); - } } void LegacyFiller::addVariables(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) @@ -37,14 +32,13 @@ void LegacyFiller::CopyMatrix(ILinearProblem& pb) const { for (int idxRow = 0; idxRow < problemeSimplexe_->NombreDeContraintes; ++idxRow) { - auto* ct = pb.getConstraint(constraintNameManager_.GetName(idxRow)); + auto* ct = pb.getConstraint(GetConstraintName(idxRow)); int debutLigne = problemeSimplexe_->IndicesDebutDeLigne[idxRow]; for (int idxCoef = 0; idxCoef < problemeSimplexe_->NombreDeTermesDesLignes[idxRow]; ++idxCoef) { int pos = debutLigne + idxCoef; - auto* var = pb.getVariable( - variableNameManager_.GetName(problemeSimplexe_->IndicesColonnes[pos])); + auto* var = pb.getVariable(GetVariableName(problemeSimplexe_->IndicesColonnes[pos])); ct->setCoefficient(var, problemeSimplexe_->CoefficientsDeLaMatriceDesContraintes[pos]); } } @@ -55,10 +49,7 @@ void LegacyFiller::CreateVariable(unsigned idxVar, ILinearProblem& pb) const double min_l = problemeSimplexe_->Xmin[idxVar]; double max_l = problemeSimplexe_->Xmax[idxVar]; bool isIntegerVariable = problemeSimplexe_->IntegerVariable(idxVar); - auto* var = pb.addVariable(min_l, - max_l, - isIntegerVariable, - variableNameManager_.GetName(idxVar)); + auto* var = pb.addVariable(min_l, max_l, isIntegerVariable, GetVariableName(idxVar)); pb.setObjectiveCoefficient(var, problemeSimplexe_->CoutLineaire[idxVar]); } @@ -86,7 +77,7 @@ void LegacyFiller::UpdateContraints(unsigned idxRow, ILinearProblem& pb) const break; } - pb.addConstraint(bMin, bMax, constraintNameManager_.GetName(idxRow)); + pb.addConstraint(bMin, bMax, GetConstraintName(idxRow)); } void LegacyFiller::CopyRows(ILinearProblem& pb) const @@ -96,4 +87,24 @@ void LegacyFiller::CopyRows(ILinearProblem& pb) const UpdateContraints(idxRow, pb); } } + +std::string LegacyFiller::GetVariableName(unsigned int index) const +{ + if (!problemeSimplexe_->UseNamedProblems() + || problemeSimplexe_->VariableNames().at(index).empty()) + { + return 'x' + std::to_string(index); + } + return problemeSimplexe_->VariableNames().at(index); +} + +std::string LegacyFiller::GetConstraintName(unsigned int index) const +{ + if (!problemeSimplexe_->UseNamedProblems() + || problemeSimplexe_->ConstraintNames().at(index).empty()) + { + return 'c' + std::to_string(index); + } + return problemeSimplexe_->ConstraintNames().at(index); +} } // namespace Antares::Optimization diff --git a/src/solver/optimisation/include/antares/solver/optimisation/LegacyFiller.h b/src/solver/optimisation/include/antares/solver/optimisation/LegacyFiller.h index 19323ce38c..f682b3c16b 100644 --- a/src/solver/optimisation/include/antares/solver/optimisation/LegacyFiller.h +++ b/src/solver/optimisation/include/antares/solver/optimisation/LegacyFiller.h @@ -2,9 +2,6 @@ #include "antares/solver/modeler/api/linearProblemFiller.h" #include "antares/solver/utils/named_problem.h" -#include "antares/solver/utils/ortools_utils.h" - -#include "ortools/linear_solver/linear_solver.h" namespace Antares::Optimization { @@ -24,13 +21,13 @@ class LegacyFiller: public Antares::Solver::Modeler::Api::LinearProblemFiller private: const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe_; - Nomenclature variableNameManager_ = Nomenclature('x'); - Nomenclature constraintNameManager_ = Nomenclature('c'); void CreateVariable(unsigned idxVar, Antares::Solver::Modeler::Api::ILinearProblem& pb) const; void CopyVariables(Antares::Solver::Modeler::Api::ILinearProblem& pb) const; void UpdateContraints(unsigned idxRow, Antares::Solver::Modeler::Api::ILinearProblem& pb) const; void CopyRows(Antares::Solver::Modeler::Api::ILinearProblem& pb) const; void CopyMatrix(Antares::Solver::Modeler::Api::ILinearProblem& pb) const; + std::string GetVariableName(unsigned index) const; + std::string GetConstraintName(unsigned index) const; }; } // namespace Antares::Optimization diff --git a/src/solver/utils/include/antares/solver/utils/ortools_utils.h b/src/solver/utils/include/antares/solver/utils/ortools_utils.h index 20a26e57af..e5fae32c9d 100644 --- a/src/solver/utils/include/antares/solver/utils/ortools_utils.h +++ b/src/solver/utils/include/antares/solver/utils/ortools_utils.h @@ -72,40 +72,3 @@ class OrtoolsUtils }; static const std::map solverMap; }; - -namespace Antares -{ -namespace Optimization -{ - -class Nomenclature -{ -public: - Nomenclature() = delete; - - explicit Nomenclature(char prefix): - prefix_(prefix) - { - } - - void SetTarget(const std::vector& target) - { - target_ = ⌖ - } - - std::string GetName(unsigned index) const - { - if (target_ == nullptr || target_->at(index).empty()) - { - return prefix_ + std::to_string(index); - } - return target_->at(index); - } - -private: - const std::vector* target_ = nullptr; - char prefix_; -}; - -} // namespace Optimization -} // namespace Antares From 5237a6fe4a611c5374dc55c154ff1c00313f92dd Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Wed, 23 Oct 2024 09:39:39 +0200 Subject: [PATCH 29/29] remove useless include Signed-off-by: Peter Mitri --- src/solver/modeler/api/linearProblemBuilder.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/solver/modeler/api/linearProblemBuilder.cpp b/src/solver/modeler/api/linearProblemBuilder.cpp index 5363647c3f..ca93744cc6 100644 --- a/src/solver/modeler/api/linearProblemBuilder.cpp +++ b/src/solver/modeler/api/linearProblemBuilder.cpp @@ -20,7 +20,6 @@ */ #include -#include #include