From c2a02d882e65664f516b5d1deb63c419bfde141a Mon Sep 17 00:00:00 2001 From: Peter Mitri Date: Mon, 14 Oct 2024 16:09:56 +0200 Subject: [PATCH] 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: