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/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/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 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..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; @@ -62,10 +66,13 @@ class OrtoolsLinearProblem final: public Api::ILinearProblem OrtoolsMipSolution* solve(bool verboseSolver) override; -private: - OrtoolsMipVariable* addVariable(double lb, double ub, bool integer, const std::string& name); + double infinity() const override; + +protected: + operations_research::MPSolver* MpSolver() const; - std::shared_ptr mpSolver_; +private: + 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 1d8bf981bc..6e8b942945 100644 --- a/src/solver/modeler/ortoolsImpl/linearProblem.cpp +++ b/src/solver/modeler/ortoolsImpl/linearProblem.cpp @@ -31,16 +31,8 @@ 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_ = MPSolverFactory(isMip, solverName); + objective_ = mpSolver_->MutableObjective(); } class ElemAlreadyExists: public std::exception @@ -172,6 +164,11 @@ bool OrtoolsLinearProblem::isMaximization() const return objective_->maximization(); } +MPSolver* OrtoolsLinearProblem::MpSolver() const +{ + return mpSolver_; +} + OrtoolsMipSolution* OrtoolsLinearProblem::solve(bool verboseSolver) { if (verboseSolver) @@ -185,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/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) { diff --git a/src/solver/optimisation/CMakeLists.txt b/src/solver/optimisation/CMakeLists.txt index a0d74288e7..e2472febd1 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,140 +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/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/LegacyFiller.h + LegacyFiller.cpp ) @@ -187,15 +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 + PUBLIC + Antares::solverUtils + sirius_solver + antares-solver-simulation + Antares::benchmarking Antares::optimization-options - Antares::lps - PRIVATE - infeasible_problem_analysis + Antares::lps + PRIVATE + infeasible_problem_analysis + Antares::modeler_api + Antares::modeler-ortools-impl ) target_include_directories(model_antares diff --git a/src/solver/optimisation/LegacyFiller.cpp b/src/solver/optimisation/LegacyFiller.cpp new file mode 100644 index 0000000000..7cbcaff820 --- /dev/null +++ b/src/solver/optimisation/LegacyFiller.cpp @@ -0,0 +1,110 @@ +#include "antares/solver/optimisation/LegacyFiller.h" + +using namespace Antares::Solver::Modeler::Api; + +namespace Antares::Optimization +{ + +LegacyFiller::LegacyFiller(const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* problemeSimplexe): + problemeSimplexe_(problemeSimplexe) +{ +} + +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) +{ + // Create constraints and set coefs + CopyRows(pb); + CopyMatrix(pb); +} + +void LegacyFiller::addObjective(ILinearProblem& pb, LinearProblemData& data, FillContext& ctx) +{ + // nothing to do: objective coefficients are set along with variables definition +} + +void LegacyFiller::CopyMatrix(ILinearProblem& pb) const +{ + for (int idxRow = 0; idxRow < problemeSimplexe_->NombreDeContraintes; ++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(GetVariableName(problemeSimplexe_->IndicesColonnes[pos])); + ct->setCoefficient(var, problemeSimplexe_->CoefficientsDeLaMatriceDesContraintes[pos]); + } + } +} + +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, GetVariableName(idxVar)); + pb.setObjectiveCoefficient(var, problemeSimplexe_->CoutLineaire[idxVar]); +} + +void LegacyFiller::CopyVariables(ILinearProblem& pb) const +{ + for (int idxVar = 0; idxVar < problemeSimplexe_->NombreDeVariables; ++idxVar) + { + CreateVariable(idxVar, pb); + } +} + +void LegacyFiller::UpdateContraints(unsigned idxRow, ILinearProblem& pb) const +{ + double bMin = -pb.infinity(), bMax = pb.infinity(); + switch (problemeSimplexe_->Sens[idxRow]) + { + case '=': + bMin = bMax = problemeSimplexe_->SecondMembre[idxRow]; + break; + case '<': + bMax = problemeSimplexe_->SecondMembre[idxRow]; + break; + case '>': + bMin = problemeSimplexe_->SecondMembre[idxRow]; + break; + } + + pb.addConstraint(bMin, bMax, GetConstraintName(idxRow)); +} + +void LegacyFiller::CopyRows(ILinearProblem& pb) const +{ + for (int idxRow = 0; idxRow < problemeSimplexe_->NombreDeContraintes; ++idxRow) + { + 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 new file mode 100644 index 0000000000..f682b3c16b --- /dev/null +++ b/src/solver/optimisation/include/antares/solver/optimisation/LegacyFiller.h @@ -0,0 +1,33 @@ +#pragma once + +#include "antares/solver/modeler/api/linearProblemFiller.h" +#include "antares/solver/utils/named_problem.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_; + + 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/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 94eae39fc8..4aee790ea9 100644 --- a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp +++ b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp @@ -27,12 +27,17 @@ #include #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/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" #include "antares/solver/utils/filename.h" #include "antares/solver/utils/mps_utils.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,18 @@ static SimplexResult OPT_TryToCallSimplex(const OptimizationOptions& options, Probleme.NombreDeContraintesCoupes = 0; - if (options.ortoolsUsed) + auto ortoolsProblem = std::make_unique(Probleme.isMIP(), + options.ortoolsSolver); + 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) { - solver = ORTOOLS_ConvertIfNeeded(options.ortoolsSolver, &Probleme, solver); + linearProblemBuilder.build(*ortoolsProblem, LP_Data, fillCtx); + solver = ortoolsProblem->getMpSolver(); } const std::string filename = createMPSfilename(optPeriodStringGenerator, optimizationNumber); @@ -370,8 +384,16 @@ 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(&Probleme); + std::vector fillersCollection = {legacyOrtoolsFiller.get()}; + LinearProblemData LP_Data; + FillContext fillCtx(0, 167); + LinearProblemBuilder linearProblemBuilder(fillersCollection); + + linearProblemBuilder.build(*ortoolsProblem, LP_Data, fillCtx); + auto MPproblem = std::shared_ptr(ortoolsProblem->getMpSolver()); 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 3dd0970ecc..e5fae32c9d 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 Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* probleme, - 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); @@ -73,61 +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_; -}; - -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 4f688dda4a..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,10 +34,6 @@ 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); - 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 2cc81b80fa..d45357f382 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,21 +224,6 @@ 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) -{ - if (solver == nullptr) - { - Antares::Optimization::ProblemSimplexeNommeConverter converter(solverName, Probleme); - return converter.Convert(); - } - else - { - return solver; - } -} - MPSolver* ORTOOLS_Simplexe(Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* Probleme, MPSolver* solver, bool keepBasis, @@ -474,13 +354,12 @@ std::string availableOrToolsSolversString() return solvers.str(); } -MPSolver* MPSolverFactory(const Antares::Optimization::PROBLEME_SIMPLEXE_NOMME* probleme, - const std::string& solverName) +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); } 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: