diff --git a/antares-deps-version.json b/antares-deps-version.json index 8df1d6ff78..ced7f5add0 100644 --- a/antares-deps-version.json +++ b/antares-deps-version.json @@ -1,3 +1,3 @@ { - "antares_deps_version": "2.0.2a" + "antares_deps_version": "2.0.2b" } diff --git a/src/antares-deps b/src/antares-deps index 2788a3a409..0d6bebfb90 160000 --- a/src/antares-deps +++ b/src/antares-deps @@ -1 +1 @@ -Subproject commit 2788a3a409f3d2b6a04ab90819f3c61bd6a2b282 +Subproject commit 0d6bebfb901e47ec6ac1c73cb61a522803c81b98 diff --git a/src/libs/antares/study/area/area.h b/src/libs/antares/study/area/area.h index 1f7287c7f1..68eae75305 100644 --- a/src/libs/antares/study/area/area.h +++ b/src/libs/antares/study/area/area.h @@ -865,6 +865,14 @@ void AreaListEnsureDataRenewableTimeSeries(AreaList* l); */ void AreaListEnsureDataThermalPrepro(AreaList* l); +/*! +** \brief to check that Area name does not contains character * +*/ +inline bool CheckForbiddenCharacterInAreaName(const AnyString& name) +{ + return name.contains('*'); +} + } // namespace Data } // namespace Antares diff --git a/src/libs/antares/study/area/list.cpp b/src/libs/antares/study/area/list.cpp index 2e245060a7..c9aee7c564 100644 --- a/src/libs/antares/study/area/list.cpp +++ b/src/libs/antares/study/area/list.cpp @@ -483,7 +483,6 @@ Area* AreaList::add(Area* a) } return a; } - Area* AreaListAddFromName(AreaList& list, const AnyString& name, uint nbParallelYears) { // Initializing names @@ -506,7 +505,6 @@ Area* AreaListAddFromNames(AreaList& list, // Look up if (!AreaListLFind(&list, lname.c_str())) { - // Creating the area Area* area = new Area(name, lname, nbParallelYears); // Adding it Area* ret = list.add(area); @@ -559,6 +557,11 @@ bool AreaList::loadListFromFile(const AnyString& filename) << ": line " << line; continue; } + if (CheckForbiddenCharacterInAreaName(name)) + { + logs.error() << "character '*' is forbidden in area name: `" << name << "`"; + continue; + } // Add the area in the list AreaListAddFromNames(*this, name, lname, pStudy.maxNbYearsInParallel); } @@ -1406,6 +1409,11 @@ bool AreaList::renameArea(const AreaName& oldid, const AreaName& newid, const Ar if (!oldid || !newName || !newid || areas.empty()) return false; + if (CheckForbiddenCharacterInAreaName(newName)) + { + logs.error() << "character '*' is forbidden in area name: `" << newName << "`"; + return false; + } // Detaching the area from the list Area* area; { diff --git a/src/libs/antares/study/load-options.h b/src/libs/antares/study/load-options.h index d046851875..df655816ed 100644 --- a/src/libs/antares/study/load-options.h +++ b/src/libs/antares/study/load-options.h @@ -69,6 +69,8 @@ class StudyLoadOptions SimplexOptimization simplexOptimizationRange; //! Mps files export asked bool mpsToExport; + //! named problems + bool namedProblems = false; //! Ignore all constraints bool ignoreConstraints; //! Simulation mode diff --git a/src/libs/antares/study/parameters.cpp b/src/libs/antares/study/parameters.cpp index 60621be605..b9cb004e0e 100644 --- a/src/libs/antares/study/parameters.cpp +++ b/src/libs/antares/study/parameters.cpp @@ -325,6 +325,7 @@ void Parameters::reset() include.exportMPS = mpsExportStatus::NO_EXPORT; include.exportStructure = false; + namedProblems = false; include.unfeasibleProblemBehavior = UnfeasibleProblemBehavior::ERROR_MPS; @@ -1063,6 +1064,8 @@ bool Parameters::loadFromINI(const IniFile& ini, uint version, const StudyLoadOp ortoolsUsed = options.ortoolsUsed; ortoolsSolver = options.ortoolsSolver; + namedProblems = options.namedProblems; + // Attempt to fix bad values if any fixBadValues(); @@ -1470,6 +1473,12 @@ void Parameters::prepareForSimulation(const StudyLoadOptions& options) { logs.info() << " :: ortools solver " << ortoolsSolver << " used for problem resolution"; } + + // indicated that Problems will be named + if (namedProblems) + { + logs.info() << " :: The problems will contain named variables and constraints"; + } } void Parameters::resetPlaylist(uint nbOfYears) diff --git a/src/libs/antares/study/parameters.h b/src/libs/antares/study/parameters.h index d6abeb5e8e..18b951b409 100644 --- a/src/libs/antares/study/parameters.h +++ b/src/libs/antares/study/parameters.h @@ -521,6 +521,9 @@ class Parameters final // Format of results. Currently, only single files or zip archive are supported ResultFormat resultFormat = legacyFilesDirectories; + // Naming constraints and variables in problems + bool namedProblems; + private: //! Load data from an INI file bool loadFromINI(const IniFile& ini, uint version, const StudyLoadOptions& options); diff --git a/src/libs/antares/study/study.cpp b/src/libs/antares/study/study.cpp index ee89cc6cc9..fb5a71023a 100644 --- a/src/libs/antares/study/study.cpp +++ b/src/libs/antares/study/study.cpp @@ -780,6 +780,11 @@ Area* Study::areaAdd(const AreaName& name) { if (name.empty()) return nullptr; + if (CheckForbiddenCharacterInAreaName(name)) + { + logs.error() << "character '*' is forbidden in area name: `" << name << "`"; + return nullptr; + } // Result Area* area = nullptr; diff --git a/src/solver/misc/options.cpp b/src/solver/misc/options.cpp index e4d482a999..d0193e4b2c 100644 --- a/src/solver/misc/options.cpp +++ b/src/solver/misc/options.cpp @@ -169,6 +169,12 @@ std::unique_ptr CreateParser(Settings& settings, "mps-export", "Export in the mps format the optimization problems."); + // --named-problems + parser->addFlag(options.namedProblems, + ' ', + "named-mps-problems", + "Naming constraints and variables in problems."); + parser->addParagraph("\nMisc."); // --progress parser->addFlag( diff --git a/src/solver/optimisation/CMakeLists.txt b/src/solver/optimisation/CMakeLists.txt index c0fe6f8cc3..0f36df3fb1 100644 --- a/src/solver/optimisation/CMakeLists.txt +++ b/src/solver/optimisation/CMakeLists.txt @@ -69,6 +69,8 @@ set(RTESOLVER_OPT adequacy_patch_csr/count_constraints_variables.cpp opt_period_string_generator_base.h + opt_rename_problem.h + opt_rename_problem.cpp ) diff --git a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp index c13c234ac8..3d5715a8b7 100644 --- a/src/solver/optimisation/opt_appel_solveur_lineaire.cpp +++ b/src/solver/optimisation/opt_appel_solveur_lineaire.cpp @@ -94,7 +94,6 @@ class TimeMeasurement clock::time_point start_; clock::time_point end_; }; - bool OPT_AppelDuSimplexe(PROBLEME_HEBDO* problemeHebdo, int NumIntervalle, const int optimizationNumber, @@ -107,7 +106,8 @@ bool OPT_AppelDuSimplexe(PROBLEME_HEBDO* problemeHebdo, ProblemeAResoudre->StatutDesContraintes); bool PremierPassage = true; - auto ProbSpx = (PROBLEME_SPX*)(ProblemeAResoudre->ProblemesSpx->ProblemeSpx[(int)NumIntervalle]); + auto ProbSpx + = (PROBLEME_SPX*)(ProblemeAResoudre->ProblemesSpx->ProblemeSpx[(int)NumIntervalle]); auto solver = (MPSolver*)(ProblemeAResoudre->ProblemesSpx->ProblemeSpx[(int)NumIntervalle]); auto study = Data::Study::Current::Get(); diff --git a/src/solver/optimisation/opt_construction_contraintes_couts_demarrage.cpp b/src/solver/optimisation/opt_construction_contraintes_couts_demarrage.cpp index 7c6b57ee5c..d00968b9dc 100644 --- a/src/solver/optimisation/opt_construction_contraintes_couts_demarrage.cpp +++ b/src/solver/optimisation/opt_construction_contraintes_couts_demarrage.cpp @@ -40,6 +40,9 @@ #include #include #include "../simulation/sim_structure_donnees.h" +#include "opt_rename_problem.h" +#include "opt_export_structure.h" +using namespace Antares::Data; void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( PROBLEME_HEBDO* problemeHebdo, @@ -55,14 +58,14 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( double* Pi = ProblemeAResoudre->Pi; int* Colonne = ProblemeAResoudre->Colonne; - + ConstraintNamer constraintNamer(ProblemeAResoudre->NomDesContraintes, + problemeHebdo->NamedProblems); int nbTermesContraintesPourLesCoutsDeDemarrage = 0; - - for (int pays = 0; pays < problemeHebdo->NombreDePays; pays++) + for (unsigned int pays = 0; pays < problemeHebdo->NombreDePays; pays++) { const PALIERS_THERMIQUES& PaliersThermiquesDuPays = problemeHebdo->PaliersThermiquesDuPays[pays]; - + constraintNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); for (int index = 0; index < PaliersThermiquesDuPays.NombreDePaliersThermiques; index++) { double pminDUnGroupeDuPalierThermique @@ -72,8 +75,10 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( const int palier = PaliersThermiquesDuPays.NumeroDuPalierDansLEnsembleDesPaliersThermiques[index]; - for (int pdt = 0; pdt < nombreDePasDeTempsPourUneOptimisation; pdt++) + for (unsigned int pdt = 0; pdt < nombreDePasDeTempsPourUneOptimisation; pdt++) { + auto timeStepInYear = problemeHebdo->weekInTheYear * 168 + pdt; + constraintNamer.UpdateTimeStep(timeStepInYear); CorrespondanceVarNativesVarOptim = problemeHebdo->CorrespondanceVarNativesVarOptim[pdt]; @@ -112,6 +117,8 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( { if (nombreDeTermes > 0) { + constraintNamer.PMaxDispatchableGeneration( + ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '<'); } @@ -154,6 +161,8 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( { if (nombreDeTermes > 0) { + constraintNamer.PMinDispatchableGeneration( + ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '>'); } @@ -168,14 +177,16 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( { const PALIERS_THERMIQUES& PaliersThermiquesDuPays = problemeHebdo->PaliersThermiquesDuPays[pays]; - + constraintNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); for (int index = 0; index < PaliersThermiquesDuPays.NombreDePaliersThermiques; index++) { const int palier = PaliersThermiquesDuPays.NumeroDuPalierDansLEnsembleDesPaliersThermiques[index]; - for (int pdt = 0; pdt < nombreDePasDeTempsPourUneOptimisation; pdt++) + for (unsigned int pdt = 0; pdt < nombreDePasDeTempsPourUneOptimisation; pdt++) { + auto timeStepInYear = problemeHebdo->weekInTheYear * 168 + pdt; + constraintNamer.UpdateTimeStep(timeStepInYear); CorrespondanceVarNativesVarOptim = problemeHebdo->CorrespondanceVarNativesVarOptim[pdt]; @@ -250,6 +261,7 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( { if (nombreDeTermes > 0) { + constraintNamer.ConsistenceNODU(ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '='); } @@ -260,18 +272,21 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( } } - for (int pays = 0; pays < problemeHebdo->NombreDePays; pays++) + for (unsigned int pays = 0; pays < problemeHebdo->NombreDePays; pays++) { const PALIERS_THERMIQUES& PaliersThermiquesDuPays = problemeHebdo->PaliersThermiquesDuPays[pays]; + constraintNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); for (int index = 0; index < PaliersThermiquesDuPays.NombreDePaliersThermiques; index++) { const int palier = PaliersThermiquesDuPays.NumeroDuPalierDansLEnsembleDesPaliersThermiques[index]; - for (int pdt = 0; pdt < nombreDePasDeTempsPourUneOptimisation; pdt++) + for (unsigned int pdt = 0; pdt < nombreDePasDeTempsPourUneOptimisation; pdt++) { + auto timeStepInYear = problemeHebdo->weekInTheYear * 168 + pdt; + constraintNamer.UpdateTimeStep(timeStepInYear); CORRESPONDANCES_DES_CONTRAINTES& CorrespondanceCntNativesCntOptim = problemeHebdo->CorrespondanceCntNativesCntOptim[pdt]; CorrespondanceCntNativesCntOptim @@ -314,6 +329,8 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( { if (nombreDeTermes > 0) { + constraintNamer.NbUnitsOutageLessThanNbUnitsStop( + ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '<'); } @@ -324,11 +341,12 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( } } - for (int pays = 0; pays < problemeHebdo->NombreDePays; pays++) + for (unsigned int pays = 0; pays < problemeHebdo->NombreDePays; pays++) { const PALIERS_THERMIQUES& PaliersThermiquesDuPays = problemeHebdo->PaliersThermiquesDuPays[pays]; + constraintNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); for (int index = 0; index < PaliersThermiquesDuPays.NombreDePaliersThermiques; index++) { int DureeMinimaleDeMarcheDUnGroupeDuPalierThermique @@ -338,8 +356,10 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( const int palier = PaliersThermiquesDuPays.NumeroDuPalierDansLEnsembleDesPaliersThermiques[index]; - for (int pdt = 0; pdt < nombreDePasDeTempsPourUneOptimisation; pdt++) + for (unsigned int pdt = 0; pdt < nombreDePasDeTempsPourUneOptimisation; pdt++) { + auto timeStepInYear = problemeHebdo->weekInTheYear * 168 + pdt; + constraintNamer.UpdateTimeStep(timeStepInYear); CORRESPONDANCES_DES_CONTRAINTES& CorrespondanceCntNativesCntOptim = problemeHebdo->CorrespondanceCntNativesCntOptim[pdt]; CorrespondanceCntNativesCntOptim @@ -409,6 +429,8 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( .NumeroDeContrainteDesContraintesDeDureeMinDeMarche[palier] = ProblemeAResoudre->NombreDeContraintes; + constraintNamer.NbDispUnitsMinBoundSinceMinUpTime( + ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '>'); } @@ -424,6 +446,7 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( const PALIERS_THERMIQUES& PaliersThermiquesDuPays = problemeHebdo->PaliersThermiquesDuPays[pays]; + constraintNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); for (int index = 0; index < PaliersThermiquesDuPays.NombreDePaliersThermiques; index++) { int DureeMinimaleDArretDUnGroupeDuPalierThermique @@ -431,8 +454,10 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( const int palier = PaliersThermiquesDuPays.NumeroDuPalierDansLEnsembleDesPaliersThermiques[index]; - for (int pdt = 0; pdt < nombreDePasDeTempsPourUneOptimisation; pdt++) + for (unsigned int pdt = 0; pdt < nombreDePasDeTempsPourUneOptimisation; pdt++) { + auto timeStepInYear = problemeHebdo->weekInTheYear * 168 + pdt; + constraintNamer.UpdateTimeStep(timeStepInYear); CORRESPONDANCES_DES_CONTRAINTES& CorrespondanceCntNativesCntOptim = problemeHebdo->CorrespondanceCntNativesCntOptim[pdt]; CorrespondanceCntNativesCntOptim @@ -442,13 +467,6 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( CorrespondanceVarNativesVarOptim = problemeHebdo->CorrespondanceVarNativesVarOptim[pdt]; - if (!Simulation) - { - CorrespondanceCntNativesCntOptim - .NumeroDeContrainteDesContraintesDeDureeMinDArret[palier] - = -1; - } - int nombreDeTermes = 0; if (!Simulation) { @@ -496,6 +514,7 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaireCoutsDeDemarrage( .NumeroDeContrainteDesContraintesDeDureeMinDArret[palier] = ProblemeAResoudre->NombreDeContraintes; + constraintNamer.MinDownTime(ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '<'); } diff --git a/src/solver/optimisation/opt_construction_matrice_des_contraintes_cas_lineaire.cpp b/src/solver/optimisation/opt_construction_matrice_des_contraintes_cas_lineaire.cpp index 340a05b670..28654e6a6d 100644 --- a/src/solver/optimisation/opt_construction_matrice_des_contraintes_cas_lineaire.cpp +++ b/src/solver/optimisation/opt_construction_matrice_des_contraintes_cas_lineaire.cpp @@ -30,6 +30,7 @@ #include "../simulation/simulation.h" #include "../utils/filename.h" #include "opt_fonctions.h" +#include "opt_rename_problem.h" #include @@ -40,9 +41,7 @@ void exportPaliers(const PROBLEME_HEBDO& problemeHebdo, int pays, int& nombreDeTermes, double* Pi, - int* Colonne, - int timeStepInYear, - std::vector& varname) + int* Colonne) { const PALIERS_THERMIQUES& PaliersThermiquesDuPays = problemeHebdo.PaliersThermiquesDuPays[pays]; @@ -56,16 +55,6 @@ void exportPaliers(const PROBLEME_HEBDO& problemeHebdo, Pi[nombreDeTermes] = -1.0; Colonne[nombreDeTermes] = var; nombreDeTermes++; - - if (problemeHebdo.ExportStructure) - { - OPT_Export_add_variable(varname, - var, - Enum::ExportStructDict::PalierThermique, - timeStepInYear, // TODO[FOM] remove - pays, - palier); - } } } } @@ -80,8 +69,8 @@ static void shortTermStorageBalance( for (const auto& storage : shortTermStorageInput) { const int clusterGlobalIndex = storage.clusterGlobalIndex; - if (const int varInjection - = CorrespondanceVarNativesVarOptim.SIM_ShortTermStorage.InjectionVariable[clusterGlobalIndex]; + if (const int varInjection = CorrespondanceVarNativesVarOptim.SIM_ShortTermStorage + .InjectionVariable[clusterGlobalIndex]; varInjection >= 0) { Pi[nombreDeTermes] = 1.0; @@ -89,8 +78,8 @@ static void shortTermStorageBalance( nombreDeTermes++; } - if (const int varWithdrawal - = CorrespondanceVarNativesVarOptim.SIM_ShortTermStorage.WithdrawalVariable[clusterGlobalIndex]; + if (const int varWithdrawal = CorrespondanceVarNativesVarOptim.SIM_ShortTermStorage + .WithdrawalVariable[clusterGlobalIndex]; varWithdrawal >= 0) { Pi[nombreDeTermes] = -1.0; @@ -108,18 +97,21 @@ static void shortTermStorageLevels( double* Pi, int* Colonne, int nombreDePasDeTempsPourUneOptimisation, - int pdt) + int pdt, + ConstraintNamer& constraintNamer) { const auto& VarOptimCurrent = CorrespondanceVarNativesVarOptim[pdt]; // Cycle over the simulation period - const int timestepPrevious = (pdt - 1 + nombreDePasDeTempsPourUneOptimisation) % nombreDePasDeTempsPourUneOptimisation; + const int timestepPrevious + = (pdt - 1 + nombreDePasDeTempsPourUneOptimisation) % nombreDePasDeTempsPourUneOptimisation; const auto& VarOptimPrevious = CorrespondanceVarNativesVarOptim[timestepPrevious]; for (auto& storage : shortTermStorageInput) { int nombreDeTermes = 0; const int clusterGlobalIndex = storage.clusterGlobalIndex; // L[h] - L[h-1] - efficiency * injection[h] + withdrawal[h] = inflows[h] - if (const int varLevel = VarOptimCurrent->SIM_ShortTermStorage.LevelVariable[clusterGlobalIndex]; + if (const int varLevel + = VarOptimCurrent->SIM_ShortTermStorage.LevelVariable[clusterGlobalIndex]; varLevel >= 0) { Pi[nombreDeTermes] = 1.0; @@ -127,7 +119,8 @@ static void shortTermStorageLevels( nombreDeTermes++; } - if (const int varLevel_previous = VarOptimPrevious->SIM_ShortTermStorage.LevelVariable[clusterGlobalIndex]; + if (const int varLevel_previous + = VarOptimPrevious->SIM_ShortTermStorage.LevelVariable[clusterGlobalIndex]; varLevel_previous >= 0) { Pi[nombreDeTermes] = -1.0; @@ -135,7 +128,8 @@ static void shortTermStorageLevels( nombreDeTermes++; } - if (const int varInjection = VarOptimCurrent->SIM_ShortTermStorage.InjectionVariable[clusterGlobalIndex]; + if (const int varInjection + = VarOptimCurrent->SIM_ShortTermStorage.InjectionVariable[clusterGlobalIndex]; varInjection >= 0) { Pi[nombreDeTermes] = -1.0 * storage.efficiency; @@ -143,7 +137,8 @@ static void shortTermStorageLevels( nombreDeTermes++; } - if (const int varWithdrawal = VarOptimCurrent->SIM_ShortTermStorage.WithdrawalVariable[clusterGlobalIndex]; + if (const int varWithdrawal + = VarOptimCurrent->SIM_ShortTermStorage.WithdrawalVariable[clusterGlobalIndex]; varWithdrawal >= 0) { Pi[nombreDeTermes] = 1.0; @@ -152,6 +147,8 @@ static void shortTermStorageLevels( } CorrespondanceCntNativesCntOptim.ShortTermStorageLevelConstraint[clusterGlobalIndex] = ProblemeAResoudre->NombreDeContraintes; + + constraintNamer.ShortTermStorageLevel(ProblemeAResoudre->NombreDeContraintes, storage.name); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '='); } @@ -178,16 +175,13 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro ProblemeAResoudre->NombreDeContraintes = 0; ProblemeAResoudre->NombreDeTermesDansLaMatriceDesContraintes = 0; - - // For now only variable are exported, can't define name for constraints export - int nvars = ProblemeAResoudre->NombreDeVariables; - std::vector varname; - varname.assign(nvars, ""); + ConstraintNamer constraintNamer(ProblemeAResoudre->NomDesContraintes, + problemeHebdo->NamedProblems); for (int pdt = 0; pdt < nombreDePasDeTempsPourUneOptimisation; pdt++) { int timeStepInYear = problemeHebdo->weekInTheYear * 168 + pdt; - + constraintNamer.UpdateTimeStep(timeStepInYear); CorrespondanceVarNativesVarOptim = problemeHebdo->CorrespondanceVarNativesVarOptim[pdt]; CORRESPONDANCES_DES_CONTRAINTES& CorrespondanceCntNativesCntOptim = problemeHebdo->CorrespondanceCntNativesCntOptim[pdt]; @@ -197,6 +191,8 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro int nombreDeTermes = 0; int interco = problemeHebdo->IndexDebutIntercoOrigine[pays]; + constraintNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); + while (interco >= 0) { var = CorrespondanceVarNativesVarOptim->NumeroDeVariableDeLInterconnexion[interco]; @@ -205,17 +201,6 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro Pi[nombreDeTermes] = 1.0; Colonne[nombreDeTermes] = var; nombreDeTermes++; - - if (exportStructure) - { - OPT_Export_add_variable( - varname, - var, - Enum::ExportStructDict::ValeurDeNTCOrigineVersExtremite, - timeStepInYear, // TODO[FOM] remove - pays, - interco); - } } interco = problemeHebdo->IndexSuivantIntercoOrigine[interco]; } @@ -228,29 +213,12 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro Pi[nombreDeTermes] = -1.0; Colonne[nombreDeTermes] = var; nombreDeTermes++; - - if (exportStructure) - { - OPT_Export_add_variable( - varname, - var, - Enum::ExportStructDict::ValeurDeNTCOrigineVersExtremite, - timeStepInYear, // TODO[FOM] remove - pays, - interco); - } } interco = problemeHebdo->IndexSuivantIntercoExtremite[interco]; } - exportPaliers(*problemeHebdo, - *CorrespondanceVarNativesVarOptim, - pays, - nombreDeTermes, - Pi, - Colonne, - timeStepInYear, - varname); + exportPaliers( + *problemeHebdo, *CorrespondanceVarNativesVarOptim, pays, nombreDeTermes, Pi, Colonne); var = CorrespondanceVarNativesVarOptim->NumeroDeVariablesDeLaProdHyd[pays]; if (var >= 0) @@ -258,12 +226,6 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro Pi[nombreDeTermes] = -1.0; Colonne[nombreDeTermes] = var; nombreDeTermes++; - - if (exportStructure) - { - OPT_Export_add_variable( - varname, var, Enum::ExportStructDict::ProdHyd, timeStepInYear, pays); - } } var = CorrespondanceVarNativesVarOptim->NumeroDeVariablesDePompage[pays]; @@ -280,15 +242,6 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro Pi[nombreDeTermes] = -1.0; Colonne[nombreDeTermes] = var; nombreDeTermes++; - - if (exportStructure) - { - OPT_Export_add_variable(varname, - var, - Enum::ExportStructDict::DefaillancePositive, - timeStepInYear, // TODO[FOM] remove - pays); - } } var = CorrespondanceVarNativesVarOptim->NumeroDeVariableDefaillanceNegative[pays]; if (var >= 0) @@ -296,15 +249,6 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro Pi[nombreDeTermes] = 1.0; Colonne[nombreDeTermes] = var; nombreDeTermes++; - - if (exportStructure) - { - OPT_Export_add_variable(varname, - var, - Enum::ExportStructDict::DefaillanceNegative, - timeStepInYear, // TODO[FOM] remove - pays); - } } shortTermStorageBalance(problemeHebdo->ShortTermStorage[pays], @@ -316,32 +260,19 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro CorrespondanceCntNativesCntOptim.NumeroDeContrainteDesBilansPays[pays] = ProblemeAResoudre->NombreDeContraintes; + constraintNamer.AreaBalance(ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '='); - nombreDeTermes = 0; - exportPaliers(*problemeHebdo, - *CorrespondanceVarNativesVarOptim, - pays, - nombreDeTermes, - Pi, - Colonne, - timeStepInYear, - varname); - + exportPaliers( + *problemeHebdo, *CorrespondanceVarNativesVarOptim, pays, nombreDeTermes, Pi, Colonne); var = CorrespondanceVarNativesVarOptim->NumeroDeVariablesDeLaProdHyd[pays]; if (var >= 0) { Pi[nombreDeTermes] = -problemeHebdo->DefaillanceNegativeUtiliserHydro[pays]; Colonne[nombreDeTermes] = var; nombreDeTermes++; - - if (exportStructure) - { - OPT_Export_add_variable( - varname, var, Enum::ExportStructDict::ProdHyd, timeStepInYear, pays); - } } var = CorrespondanceVarNativesVarOptim->NumeroDeVariableDefaillanceNegative[pays]; @@ -350,26 +281,14 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro Pi[nombreDeTermes] = 1.0; Colonne[nombreDeTermes] = var; nombreDeTermes++; - - if (exportStructure) - { - OPT_Export_add_variable(varname, - var, - Enum::ExportStructDict::DefaillanceNegative, - timeStepInYear, // TODO[FOM] remove - pays); - } } CorrespondanceCntNativesCntOptim.NumeroDeContraintePourEviterLesChargesFictives[pays] = ProblemeAResoudre->NombreDeContraintes; - std::string NomDeLaContrainte = "fict_load::" + std::to_string(timeStepInYear + 1) - + "::" + problemeHebdo->NomsDesPays[pays]; - + constraintNamer.FictiveLoads(ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( - ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '<', NomDeLaContrainte); - + ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '<'); // Short term storage shortTermStorageLevels(problemeHebdo->ShortTermStorage[pays], ProblemeAResoudre, @@ -378,7 +297,8 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro Pi, Colonne, nombreDePasDeTempsPourUneOptimisation, - pdt); + pdt, + constraintNamer); } for (int interco = 0; interco < problemeHebdo->NombreDInterconnexions; interco++) @@ -392,21 +312,6 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro Pi[nombreDeTermes] = 1.0; Colonne[nombreDeTermes] = var; nombreDeTermes++; - - // TODO VP: var "pays" is used in function call below but is previously used to - // loop - // until NombreDePays, check if it's expected behavior - // I added the next line to keep the same behavior as before - int pays = problemeHebdo->NombreDePays; - - if (exportStructure) - { - OPT_Export_add_variable(varname, - var, - Enum::ExportStructDict::DefaillanceNegative, - timeStepInYear, // TODO[FOM] remove - pays); - } } var = CorrespondanceVarNativesVarOptim ->NumeroDeVariableCoutOrigineVersExtremiteDeLInterconnexion[interco]; @@ -415,16 +320,6 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro Pi[nombreDeTermes] = -1.0; Colonne[nombreDeTermes] = var; nombreDeTermes++; - - if (exportStructure) - { - OPT_Export_add_variable( - varname, - var, - Enum::ExportStructDict::CoutOrigineVersExtremiteDeLInterconnexion, - timeStepInYear, // TODO[FOM] remove - interco); - } } var = CorrespondanceVarNativesVarOptim ->NumeroDeVariableCoutExtremiteVersOrigineDeLInterconnexion[interco]; @@ -433,21 +328,18 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro Pi[nombreDeTermes] = 1.0; Colonne[nombreDeTermes] = var; nombreDeTermes++; - - if (exportStructure) - { - OPT_Export_add_variable( - varname, - var, - Enum::ExportStructDict::CoutExtremiteVersOrigineDeLInterconnexion, - timeStepInYear, // TODO[FOM] remove - interco); - } } CorrespondanceCntNativesCntOptim.NumeroDeContrainteDeDissociationDeFlux[interco] = ProblemeAResoudre->NombreDeContraintes; - + const auto origin + = problemeHebdo + ->NomsDesPays[problemeHebdo->PaysOrigineDeLInterconnexion[interco]]; + const auto destination + = problemeHebdo + ->NomsDesPays[problemeHebdo->PaysExtremiteDeLInterconnexion[interco]]; + constraintNamer.FlowDissociation( + ProblemeAResoudre->NombreDeContraintes, origin, destination); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '='); } @@ -525,34 +417,21 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro Pi[nombreDeTermes] = poids; Colonne[nombreDeTermes] = var; nombreDeTermes++; - - if (exportStructure) - { - OPT_Export_add_variable( - varname, - var, - Enum::ExportStructDict::CorrespondanceVarNativesVarOptim, - pdt1, // TODO[FOM] remove - palier); - } } } - CorrespondanceCntNativesCntOptim .NumeroDeContrainteDesContraintesCouplantes[cntCouplante] = ProblemeAResoudre->NombreDeContraintes; - std::string NomDeLaContrainte - = "bc::hourly::" + std::to_string(timeStepInYear + 1) - + "::" + MatriceDesContraintesCouplantes.NomDeLaContrainteCouplante; - + constraintNamer.BindingConstraintHour( + ProblemeAResoudre->NombreDeContraintes, + MatriceDesContraintesCouplantes.NomDeLaContrainteCouplante); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, - MatriceDesContraintesCouplantes.SensDeLaContrainteCouplante, - NomDeLaContrainte); + MatriceDesContraintesCouplantes.SensDeLaContrainteCouplante); } } @@ -648,23 +527,23 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro .NumeroDeContrainteDesContraintesCouplantes[cntCouplante] = ProblemeAResoudre->NombreDeContraintes; - std::string NomDeLaContrainte - = "bc::daily::" + std::to_string(jour + 1) - + "::" + MatriceDesContraintesCouplantes.NomDeLaContrainteCouplante; - + constraintNamer.UpdateTimeStep(jour); + constraintNamer.BindingConstraintDay( + ProblemeAResoudre->NombreDeContraintes, + MatriceDesContraintesCouplantes.NomDeLaContrainteCouplante); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, - MatriceDesContraintesCouplantes.SensDeLaContrainteCouplante, - NomDeLaContrainte); + MatriceDesContraintesCouplantes.SensDeLaContrainteCouplante); pdtDebut += nombreDePasDeTempsDUneJournee; } } if (nombreDePasDeTempsPourUneOptimisation > nombreDePasDeTempsDUneJournee) { + int semaine = problemeHebdo->weekInTheYear; CORRESPONDANCES_DES_CONTRAINTES_HEBDOMADAIRES& CorrespondanceCntNativesCntOptimHebdomadaires = problemeHebdo->CorrespondanceCntNativesCntOptimHebdomadaires; for (int cntCouplante = 0; cntCouplante < problemeHebdo->NombreDeContraintesCouplantes; @@ -749,22 +628,22 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro .NumeroDeContrainteDesContraintesCouplantes[cntCouplante] = ProblemeAResoudre->NombreDeContraintes; - std::string NomDeLaContrainte - = std::string("bc::weekly::") - + MatriceDesContraintesCouplantes.NomDeLaContrainteCouplante; - + constraintNamer.UpdateTimeStep(semaine); + constraintNamer.BindingConstraintWeek( + ProblemeAResoudre->NombreDeContraintes, + MatriceDesContraintesCouplantes.NomDeLaContrainteCouplante); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, - MatriceDesContraintesCouplantes.SensDeLaContrainteCouplante, - NomDeLaContrainte); + MatriceDesContraintesCouplantes.SensDeLaContrainteCouplante); } } for (int pays = 0; pays < problemeHebdo->NombreDePays; pays++) { + constraintNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); bool presenceHydro = problemeHebdo->CaracteristiquesHydrauliques[pays].PresenceDHydrauliqueModulable; bool TurbEntreBornes @@ -781,6 +660,7 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro { var = problemeHebdo->CorrespondanceVarNativesVarOptim[pdt] ->NumeroDeVariablesDeLaProdHyd[pays]; + if (var >= 0) { Pi[nombreDeTermes] = 1.0; @@ -816,7 +696,8 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro problemeHebdo->NumeroDeContrainteEnergieHydraulique[pays] = ProblemeAResoudre->NombreDeContraintes; - + constraintNamer.UpdateTimeStep(problemeHebdo->weekInTheYear); + constraintNamer.HydroPower(ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '='); } @@ -831,8 +712,11 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro if (!problemeHebdo->CaracteristiquesHydrauliques[pays].PresenceDHydrauliqueModulable) continue; + constraintNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); for (int pdt = 0; pdt < nombreDePasDeTempsPourUneOptimisation; pdt++) { + int timeStepInYear = problemeHebdo->weekInTheYear * 168 + pdt; + constraintNamer.UpdateTimeStep(timeStepInYear); CorrespondanceVarNativesVarOptim = problemeHebdo->CorrespondanceVarNativesVarOptim[pdt]; int nombreDeTermes = 0; @@ -874,6 +758,8 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro nombreDeTermes++; } + constraintNamer.HydroPowerSmoothingUsingVariationSum( + ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '='); } @@ -886,8 +772,11 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro if (!problemeHebdo->CaracteristiquesHydrauliques[pays].PresenceDHydrauliqueModulable) continue; + constraintNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); for (int pdt = 0; pdt < nombreDePasDeTempsPourUneOptimisation; pdt++) { + int timeStepInYear = problemeHebdo->weekInTheYear * 168 + pdt; + constraintNamer.UpdateTimeStep(timeStepInYear); CorrespondanceVarNativesVarOptim = problemeHebdo->CorrespondanceVarNativesVarOptim[pdt]; int nombreDeTermes = 0; @@ -907,6 +796,8 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro nombreDeTermes++; } + constraintNamer.HydroPowerSmoothingUsingVariationMaxDown( + ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '<'); @@ -926,6 +817,8 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro nombreDeTermes++; } + constraintNamer.HydroPowerSmoothingUsingVariationMaxUp( + ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '>'); } @@ -940,6 +833,7 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro = problemeHebdo->CaracteristiquesHydrauliques[pays].PresenceDePompageModulable; const bool TurbEntreBornes = problemeHebdo->CaracteristiquesHydrauliques[pays].TurbinageEntreBornes; + constraintNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); if (presenceHydro && (TurbEntreBornes || presencePompage)) { int nombreDeTermes = 0; @@ -957,7 +851,8 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro problemeHebdo->NumeroDeContrainteMinEnergieHydraulique[pays] = ProblemeAResoudre->NombreDeContraintes; - + constraintNamer.UpdateTimeStep(problemeHebdo->weekInTheYear); + constraintNamer.MinHydroPower(ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '>'); } @@ -971,6 +866,7 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro int nombreDeTermes = 0; for (int pdt = 0; pdt < nombreDePasDeTempsPourUneOptimisation; pdt++) { + constraintNamer.UpdateTimeStep(problemeHebdo->weekInTheYear * 168 + pdt); var = problemeHebdo->CorrespondanceVarNativesVarOptim[pdt] ->NumeroDeVariablesDeLaProdHyd[pays]; if (var >= 0) @@ -983,7 +879,8 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro problemeHebdo->NumeroDeContrainteMaxEnergieHydraulique[pays] = ProblemeAResoudre->NombreDeContraintes; - + constraintNamer.UpdateTimeStep(problemeHebdo->weekInTheYear); + constraintNamer.MaxHydroPower(ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '<'); } @@ -993,6 +890,7 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro for (int pays = 0; pays < problemeHebdo->NombreDePays; pays++) { + constraintNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); if (problemeHebdo->CaracteristiquesHydrauliques[pays].PresenceDePompageModulable) { int nombreDeTermes = 0; @@ -1011,6 +909,8 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro problemeHebdo->NumeroDeContrainteMaxPompage[pays] = ProblemeAResoudre->NombreDeContraintes; + constraintNamer.UpdateTimeStep(problemeHebdo->weekInTheYear); + constraintNamer.MaxPumping(ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '<'); } @@ -1025,9 +925,10 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro = problemeHebdo->CorrespondanceCntNativesCntOptim[pdt]; int timeStepInYear = problemeHebdo->weekInTheYear * 168 + pdt; - + constraintNamer.UpdateTimeStep(timeStepInYear); for (int pays = 0; pays < problemeHebdo->NombreDePays; pays++) { + constraintNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); if (problemeHebdo->CaracteristiquesHydrauliques[pays].SuiviNiveauHoraire) { int nombreDeTermes = 0; @@ -1081,11 +982,9 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro CorrespondanceCntNativesCntOptim.NumeroDeContrainteDesNiveauxPays[pays] = ProblemeAResoudre->NombreDeContraintes; - std::string NomDeLaContrainte = "hydro_level::" + std::to_string(timeStepInYear + 1) - + "::" + problemeHebdo->NomsDesPays[pays]; - + constraintNamer.AreaHydroLevel(ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( - ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '=', NomDeLaContrainte); + ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '='); } else CorrespondanceCntNativesCntOptim.NumeroDeContrainteDesNiveauxPays[pays] = -1; @@ -1095,6 +994,10 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro /* For each area with ad hoc properties, two possible sets of two additional constraints */ for (int pays = 0; pays < problemeHebdo->NombreDePays; pays++) { + const auto& week = problemeHebdo->weekInTheYear; + constraintNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); + constraintNamer.UpdateTimeStep(week * 168 + nombreDePasDeTempsPourUneOptimisation - 1); + if (problemeHebdo->CaracteristiquesHydrauliques[pays].AccurateWaterValue && problemeHebdo->CaracteristiquesHydrauliques[pays].DirectLevelAccess) /* equivalence constraint : StockFinal- Niveau[T]= 0*/ @@ -1119,6 +1022,7 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro problemeHebdo->NumeroDeContrainteEquivalenceStockFinal[pays] = ProblemeAResoudre->NombreDeContraintes; + constraintNamer.FinalStockEquivalent(ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '='); } @@ -1148,6 +1052,7 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro problemeHebdo->NumeroDeContrainteExpressionStockFinal[pays] = ProblemeAResoudre->NombreDeContraintes; + constraintNamer.FinalStockExpression(ProblemeAResoudre->NombreDeContraintes); OPT_ChargerLaContrainteDansLaMatriceDesContraintes( ProblemeAResoudre, Pi, Colonne, nombreDeTermes, '='); } @@ -1160,17 +1065,10 @@ void OPT_ConstruireLaMatriceDesContraintesDuProblemeLineaire(PROBLEME_HEBDO* pro } // Export structure - if (exportStructure) + if (exportStructure && firstWeekOfSimulation) { - if (firstWeekOfSimulation) - { - OPT_ExportInterco(study->resultWriter, problemeHebdo); - OPT_ExportAreaName(study->resultWriter, study->areas); - } - - const auto filename = getFilenameWithExtension( - "variables", "txt", problemeHebdo->year, problemeHebdo->weekInTheYear, 0); - OPT_ExportVariables(study->resultWriter, varname, filename); + OPT_ExportInterco(study->resultWriter, problemeHebdo); + OPT_ExportAreaName(study->resultWriter, study->areas); } return; diff --git a/src/solver/optimisation/opt_construction_matrice_des_contraintes_outils.cpp b/src/solver/optimisation/opt_construction_matrice_des_contraintes_outils.cpp index f1472363b9..f111f91c4b 100644 --- a/src/solver/optimisation/opt_construction_matrice_des_contraintes_outils.cpp +++ b/src/solver/optimisation/opt_construction_matrice_des_contraintes_outils.cpp @@ -38,8 +38,7 @@ void OPT_ChargerLaContrainteDansLaMatriceDesContraintes( double* Pi, int* Colonne, int NombreDeTermesDeLaContrainte, - char SensContrainte, - const std::string& NomDeLaContrainte) + char SensContrainte) { int& nombreDeTermes = ProblemeAResoudre->NombreDeTermesDansLaMatriceDesContraintes; int& nombreDeContraintes = ProblemeAResoudre->NombreDeContraintes; @@ -56,7 +55,6 @@ void OPT_ChargerLaContrainteDansLaMatriceDesContraintes( } } ProblemeAResoudre->NombreDeTermesDesLignes[nombreDeContraintes] = NombreDeTermesDeLaContrainte; - ProblemeAResoudre->NomDesContraintes[nombreDeContraintes] = NomDeLaContrainte; ProblemeAResoudre->Sens[nombreDeContraintes] = SensContrainte; nombreDeContraintes++; diff --git a/src/solver/optimisation/opt_construction_variables_couts_demarrages.cpp b/src/solver/optimisation/opt_construction_variables_couts_demarrages.cpp index cd2c58e96d..7e5e6c7e5c 100644 --- a/src/solver/optimisation/opt_construction_variables_couts_demarrages.cpp +++ b/src/solver/optimisation/opt_construction_variables_couts_demarrages.cpp @@ -32,6 +32,7 @@ #include "../simulation/sim_extern_variables_globales.h" #include "opt_fonctions.h" +#include "opt_rename_problem.h" #include #include "spx_constantes_externes.h" @@ -45,18 +46,21 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaireCoutsDeDemarra int nombreDePasDeTempsPourUneOptimisation = problemeHebdo->NombreDePasDeTempsPourUneOptimisation; int nombreDeVariables = ProblemeAResoudre->NombreDeVariables; - + VariableNamer variableNamer(ProblemeAResoudre->NomDesVariables, problemeHebdo->NamedProblems); for (int pays = 0; pays < problemeHebdo->NombreDePays; pays++) { + variableNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); const PALIERS_THERMIQUES& PaliersThermiquesDuPays = problemeHebdo->PaliersThermiquesDuPays[pays]; for (int index = 0; index < PaliersThermiquesDuPays.NombreDePaliersThermiques; index++) { const int palier = PaliersThermiquesDuPays.NumeroDuPalierDansLEnsembleDesPaliersThermiques[index]; + const auto& clusterName = PaliersThermiquesDuPays.NomsDesPaliersThermiques[index]; for (int pdt = 0; pdt < nombreDePasDeTempsPourUneOptimisation; pdt++) { + variableNamer.UpdateTimeStep(problemeHebdo->weekInTheYear * 168 + pdt); if (Simulation) { nombreDeVariables += 4; @@ -70,6 +74,7 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaireCoutsDeDemarra = nombreDeVariables; ProblemeAResoudre->TypeDeVariable[nombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.NODU(nombreDeVariables, clusterName); nombreDeVariables++; CorrespondanceVarNativesVarOptim @@ -78,6 +83,7 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaireCoutsDeDemarra ProblemeAResoudre->TypeDeVariable[nombreDeVariables] = VARIABLE_BORNEE_INFERIEUREMENT; + variableNamer.NumberStartingDispatchableUnits(nombreDeVariables, clusterName); nombreDeVariables++; CorrespondanceVarNativesVarOptim @@ -85,6 +91,7 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaireCoutsDeDemarra = nombreDeVariables; ProblemeAResoudre->TypeDeVariable[nombreDeVariables] = VARIABLE_BORNEE_INFERIEUREMENT; + variableNamer.NumberStoppingDispatchableUnits(nombreDeVariables, clusterName); nombreDeVariables++; CorrespondanceVarNativesVarOptim @@ -92,6 +99,7 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaireCoutsDeDemarra = nombreDeVariables; ProblemeAResoudre->TypeDeVariable[nombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.NumberBreakingDownDispatchableUnits(nombreDeVariables, clusterName); nombreDeVariables++; } } diff --git a/src/solver/optimisation/opt_construction_variables_optimisees_lineaire.cpp b/src/solver/optimisation/opt_construction_variables_optimisees_lineaire.cpp index f29d52b8d2..0b084c99c3 100644 --- a/src/solver/optimisation/opt_construction_variables_optimisees_lineaire.cpp +++ b/src/solver/optimisation/opt_construction_variables_optimisees_lineaire.cpp @@ -31,6 +31,7 @@ #include "../simulation/sim_extern_variables_globales.h" #include "opt_fonctions.h" +#include "opt_rename_problem.h" #include #include "spx_constantes_externes.h" @@ -42,9 +43,11 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaire(PROBLEME_HEBD int NombreDePasDeTempsPourUneOptimisation = problemeHebdo->NombreDePasDeTempsPourUneOptimisation; int NombreDeVariables = 0; + VariableNamer variableNamer(ProblemeAResoudre->NomDesVariables, problemeHebdo->NamedProblems); for (int pdt = 0; pdt < NombreDePasDeTempsPourUneOptimisation; pdt++) { + variableNamer.UpdateTimeStep(problemeHebdo->weekInTheYear * 168 + pdt); CORRESPONDANCES_DES_VARIABLES* CorrespondanceVarNativesVarOptim = problemeHebdo->CorrespondanceVarNativesVarOptim[pdt]; @@ -53,6 +56,12 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaire(PROBLEME_HEBD CorrespondanceVarNativesVarOptim->NumeroDeVariableDeLInterconnexion[interco] = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + + const auto origin + = problemeHebdo->NomsDesPays[problemeHebdo->PaysOrigineDeLInterconnexion[interco]]; + const auto destination + = problemeHebdo->NomsDesPays[problemeHebdo->PaysExtremiteDeLInterconnexion[interco]]; + variableNamer.NTCDirect(NombreDeVariables, origin, destination); NombreDeVariables++; if (problemeHebdo->CoutDeTransport[interco].IntercoGereeAvecDesCouts) @@ -62,12 +71,14 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaire(PROBLEME_HEBD = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.IntercoDirectCost(NombreDeVariables, origin, destination); NombreDeVariables++; CorrespondanceVarNativesVarOptim ->NumeroDeVariableCoutExtremiteVersOrigineDeLInterconnexion[interco] = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.IntercoIndirectCost(NombreDeVariables, origin, destination); NombreDeVariables++; } } @@ -76,14 +87,17 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaire(PROBLEME_HEBD { const PALIERS_THERMIQUES& PaliersThermiquesDuPays = problemeHebdo->PaliersThermiquesDuPays[pays]; + variableNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); for (int index = 0; index < PaliersThermiquesDuPays.NombreDePaliersThermiques; index++) { const int palier = PaliersThermiquesDuPays.NumeroDuPalierDansLEnsembleDesPaliersThermiques[index]; + const auto& clusterName = PaliersThermiquesDuPays.NomsDesPaliersThermiques[index]; CorrespondanceVarNativesVarOptim->NumeroDeVariableDuPalierThermique[palier] = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.DispatchableProduction(NombreDeVariables, clusterName); NombreDeVariables++; } @@ -95,18 +109,21 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaire(PROBLEME_HEBD = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.ShortTermStorageInjection(NombreDeVariables, storage.name); NombreDeVariables++; // 2. Withdrawal CorrespondanceVarNativesVarOptim->SIM_ShortTermStorage.WithdrawalVariable[clusterGlobalIndex] = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.ShortTermStorageWithdrawal(NombreDeVariables, storage.name); NombreDeVariables++; // 3. Level CorrespondanceVarNativesVarOptim->SIM_ShortTermStorage.LevelVariable[clusterGlobalIndex] = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.ShortTermStorageLevel(NombreDeVariables, storage.name); NombreDeVariables++; } @@ -114,23 +131,27 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaire(PROBLEME_HEBD = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.PositiveUnsuppliedEnergy(NombreDeVariables); NombreDeVariables++; CorrespondanceVarNativesVarOptim->NumeroDeVariableDefaillanceNegative[pays] = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_INFERIEUREMENT; + variableNamer.NegativeUnsuppliedEnergy(NombreDeVariables); NombreDeVariables++; } for (int pays = 0; pays < problemeHebdo->NombreDePays; pays++) { + variableNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); if (problemeHebdo->CaracteristiquesHydrauliques[pays].PresenceDHydrauliqueModulable) { CorrespondanceVarNativesVarOptim->NumeroDeVariablesDeLaProdHyd[pays] = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.HydProd(NombreDeVariables); NombreDeVariables++; } else @@ -147,11 +168,13 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaire(PROBLEME_HEBD = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_INFERIEUREMENT; + variableNamer.HydProdDown(NombreDeVariables); NombreDeVariables++; CorrespondanceVarNativesVarOptim->NumeroDeVariablesVariationHydALaHausse[pays] = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_INFERIEUREMENT; + variableNamer.HydProdUp(NombreDeVariables); NombreDeVariables++; } } @@ -166,12 +189,14 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaire(PROBLEME_HEBD ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.HydProdDown(NombreDeVariables); NombreDeVariables++; CorrespondanceVarNativesVarOptim->NumeroDeVariablesVariationHydALaHausse[pays] = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.HydProdUp(NombreDeVariables); NombreDeVariables++; } @@ -181,6 +206,7 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaire(PROBLEME_HEBD = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.Pumping(NombreDeVariables); NombreDeVariables++; } else @@ -192,11 +218,13 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaire(PROBLEME_HEBD = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.HydroLevel(NombreDeVariables); NombreDeVariables++; CorrespondanceVarNativesVarOptim->NumeroDeVariablesDeDebordement[pays] = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.Overflow(NombreDeVariables); NombreDeVariables++; } else @@ -209,10 +237,14 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaire(PROBLEME_HEBD for (int pays = 0; pays < problemeHebdo->NombreDePays; pays++) { + variableNamer.UpdateTimeStep(problemeHebdo->weekInTheYear * 168 + + NombreDePasDeTempsPourUneOptimisation - 1); + variableNamer.UpdateArea(problemeHebdo->NomsDesPays[pays]); if (problemeHebdo->CaracteristiquesHydrauliques[pays].AccurateWaterValue) { problemeHebdo->NumeroDeVariableStockFinal[pays] = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_NON_BORNEE; + variableNamer.FinalStorage(NombreDeVariables); NombreDeVariables++; for (uint nblayer = 0; nblayer < 100; nblayer++) @@ -220,6 +252,7 @@ void OPT_ConstruireLaListeDesVariablesOptimiseesDuProblemeLineaire(PROBLEME_HEBD problemeHebdo->NumeroDeVariableDeTrancheDeStock[pays][nblayer] = NombreDeVariables; ProblemeAResoudre->TypeDeVariable[NombreDeVariables] = VARIABLE_BORNEE_DES_DEUX_COTES; + variableNamer.LayerStorage(NombreDeVariables, nblayer); NombreDeVariables++; } } diff --git a/src/solver/optimisation/opt_export_structure.cpp b/src/solver/optimisation/opt_export_structure.cpp index 0797458d91..43eda93dcf 100644 --- a/src/solver/optimisation/opt_export_structure.cpp +++ b/src/solver/optimisation/opt_export_structure.cpp @@ -34,31 +34,6 @@ // Export de la structure des LPs //////////////////////////////////////////////////////////////////// -namespace Antares -{ -namespace Data -{ -namespace Enum -{ -template<> -const std::initializer_list& getNames() -{ - static std::initializer_list s_exportStructDictNames{ - "ValeurDeNTCOrigineVersExtremite", - "PalierThermique", - "ProdHyd", - "DefaillancePositive", - "DefaillanceNegative", - "BilansPays", - "CoutOrigineVersExtremiteDeLInterconnexion", - "CoutExtremiteVersOrigineDeLInterconnexion", - "CorrespondanceVarNativesVarOptim"}; - return s_exportStructDictNames; -} -} // namespace Enum -} // namespace Data -} // namespace Antares - void OPT_ExportInterco(const Antares::Solver::IResultWriter::Ptr writer, PROBLEME_HEBDO* problemeHebdo) { @@ -87,37 +62,3 @@ void OPT_ExportAreaName(Antares::Solver::IResultWriter::Ptr writer, } writer->addEntryFromBuffer(filename, Flot); } - -void OPT_Export_add_variable(std::vector& varname, - int var, - Antares::Data::Enum::ExportStructDict structDict, - int ts, // TODO remove - int firstVal, - std::optional secondVal) -{ - if ((int)varname.size() > var && varname[var].empty()) - { - std::stringstream buffer; - buffer << var << " "; - buffer << Antares::Data::Enum::toString(structDict) << " "; - buffer << firstVal << " "; - if (secondVal.has_value()) - { - buffer << secondVal.value() << " "; - } - buffer << ts << " "; - varname[var] = buffer.str(); - } -} - -void OPT_ExportVariables(const Antares::Solver::IResultWriter::Ptr writer, - const std::vector& varname, - const std::string& filename) -{ - Yuni::Clob Flot; - for (auto const& line : varname) - { - Flot.appendFormat("%s\n", line.c_str()); - } - writer->addEntryFromBuffer(filename, Flot); -} diff --git a/src/solver/optimisation/opt_export_structure.h b/src/solver/optimisation/opt_export_structure.h index 8b0b3fdc22..a0450e9ab8 100644 --- a/src/solver/optimisation/opt_export_structure.h +++ b/src/solver/optimisation/opt_export_structure.h @@ -41,22 +41,6 @@ namespace Antares { namespace Data { -namespace Enum -{ -/*! Enum class to define export structure dictionnary */ -enum class ExportStructDict : unsigned char -{ - ValeurDeNTCOrigineVersExtremite, - PalierThermique, - ProdHyd, - DefaillancePositive, - DefaillanceNegative, - BilansPays, - CoutOrigineVersExtremiteDeLInterconnexion, - CoutExtremiteVersOrigineDeLInterconnexion, - CorrespondanceVarNativesVarOptim -}; -} // namespace Enum class Study; } // namespace Data @@ -64,18 +48,9 @@ class Study; struct PROBLEME_HEBDO; -void OPT_Export_add_variable(std::vector& varname, - int var, - Antares::Data::Enum::ExportStructDict structDict, - int ts, // TODO remove - int firstVal, - std::optional secondVal = std::nullopt); void OPT_ExportInterco(const Antares::Solver::IResultWriter::Ptr writer, PROBLEME_HEBDO* problemeHebdo); void OPT_ExportAreaName(Antares::Solver::IResultWriter::Ptr writer, const Antares::Data::AreaList& areas); -void OPT_ExportVariables(const Antares::Solver::IResultWriter::Ptr writer, - const std::vector& varname, - const std::string& filename); #endif diff --git a/src/solver/optimisation/opt_fonctions.h b/src/solver/optimisation/opt_fonctions.h index 66f6ab8321..4b9d3e6e06 100644 --- a/src/solver/optimisation/opt_fonctions.h +++ b/src/solver/optimisation/opt_fonctions.h @@ -92,8 +92,7 @@ void OPT_ChargerLaContrainteDansLaMatriceDesContraintes(PROBLEME_ANTARES_A_RESOU double*, int*, int, - char, - const std::string& NomDeLaContrainte = ""); + char); void OPT_ChainagesDesIntercoPartantDUnNoeud(PROBLEME_HEBDO*); void OPT_AllocateFromNumberOfVariableConstraints(PROBLEME_ANTARES_A_RESOUDRE* ProblemeAResoudre, diff --git a/src/solver/optimisation/opt_rename_problem.cpp b/src/solver/optimisation/opt_rename_problem.cpp new file mode 100644 index 0000000000..024f34fcbb --- /dev/null +++ b/src/solver/optimisation/opt_rename_problem.cpp @@ -0,0 +1,364 @@ +#include "opt_rename_problem.h" +#include + +const std::string HOUR("hour"); +const std::string DAY("day"); +const std::string WEEK("week"); +const std::map BindingConstraintTimeGranularity + = {{HOUR, "hourly"}, {DAY, "daily"}, {WEEK, "weekly"}}; +const std::string LINK("link"); +const std::string AREA("area"); + +std::string BuildName(const std::string& name, + const std::string& location, + const std::string& timeIdentifier) +{ + std::string result = name + SEPARATOR + location + SEPARATOR + timeIdentifier; + std::replace(result.begin(), result.end(), ' ', '*'); + return result; +} + +void VariableNamer::SetLinkVariableName(unsigned int var, const std::string& variableType) +{ + const auto location = origin_ + AREA_SEP + destination_; + targetUpdater_.UpdateTargetAtIndex( + BuildName(variableType, LocationIdentifier(location, LINK), TimeIdentifier(timeStep_, HOUR)), + var); +} + +void VariableNamer::SetAreaVariableName(unsigned int var, const std::string& variableType) +{ + targetUpdater_.UpdateTargetAtIndex( + BuildName(variableType, LocationIdentifier(area_, AREA), TimeIdentifier(timeStep_, HOUR)), + var); +} + +void VariableNamer::SetAreaVariableName(unsigned int var, const std::string& variableType, int layerIndex) +{ + targetUpdater_.UpdateTargetAtIndex(BuildName(variableType, + LocationIdentifier(area_, AREA) + SEPARATOR + + "Layer<" + std::to_string(layerIndex) + ">", + TimeIdentifier(timeStep_, HOUR)), + var); +} + +void VariableNamer::SetThermalClusterVariableName(unsigned int var, + const std::string& variableType, + const std::string& clusterName) +{ + const auto location + = LocationIdentifier(area_, AREA) + SEPARATOR + "ThermalCluster" + "<" + clusterName + ">"; + + targetUpdater_.UpdateTargetAtIndex( + BuildName(variableType, location, TimeIdentifier(timeStep_, HOUR)), var); +} + +void VariableNamer::DispatchableProduction(unsigned int var, const std::string& clusterName) +{ + SetThermalClusterVariableName(var, "DispatchableProduction", clusterName); +} + +void VariableNamer::NODU(unsigned int var, const std::string& clusterName) +{ + SetThermalClusterVariableName(var, "NODU", clusterName); +} + +void VariableNamer::NumberStoppingDispatchableUnits(unsigned int var, const std::string& clusterName) +{ + SetThermalClusterVariableName(var, "NumberStoppingDispatchableUnits", clusterName); +} + +void VariableNamer::NumberStartingDispatchableUnits(unsigned int var, const std::string& clusterName) +{ + SetThermalClusterVariableName(var, "NumberStartingDispatchableUnits", clusterName); +} + +void VariableNamer::NumberBreakingDownDispatchableUnits(unsigned int var, const std::string& clusterName) +{ + SetThermalClusterVariableName(var, "NumberBreakingDownDispatchableUnits", clusterName); +} + +void VariableNamer::NTCDirect(unsigned int var, const std::string& origin, const std::string& destination) +{ + origin_ = origin; + destination_ = destination; + SetLinkVariableName(var, "NTCDirect"); +} + +void VariableNamer::IntercoDirectCost(unsigned int var, + const std::string& origin, + const std::string& destination) +{ + origin_ = origin; + destination_ = destination; + SetLinkVariableName(var, "IntercoDirectCost"); +} + +void VariableNamer::IntercoIndirectCost(unsigned int var, + const std::string& origin, + const std::string& destination) +{ + origin_ = origin; + destination_ = destination; + SetLinkVariableName(var, "IntercoIndirectCost"); +} + +void VariableNamer::SetShortTermStorageVariableName(unsigned int var, + const std::string& variableType, + const std::string& shortTermStorageName) +{ + const auto location = LocationIdentifier(area_, AREA) + SEPARATOR + "ShortTermStorage" + "<" + + shortTermStorageName + ">"; + targetUpdater_.UpdateTargetAtIndex( + BuildName(variableType, location, TimeIdentifier(timeStep_, HOUR)), var); +} + +void VariableNamer::ShortTermStorageInjection(unsigned int var, const std::string& shortTermStorageName) +{ + SetShortTermStorageVariableName(var, "Injection", shortTermStorageName); +} + +void VariableNamer::ShortTermStorageWithdrawal(unsigned int var, const std::string& shortTermStorageName) +{ + SetShortTermStorageVariableName(var, "Withdrawal", shortTermStorageName); +} + +void VariableNamer::ShortTermStorageLevel(unsigned int var, const std::string& shortTermStorageName) +{ + SetShortTermStorageVariableName(var, "Level", shortTermStorageName); +} + +void VariableNamer::HydProd(unsigned int var) +{ + SetAreaVariableName(var, "HydProd"); +} + +void VariableNamer::HydProdDown(unsigned int var) +{ + SetAreaVariableName(var, "HydProdDown"); +} + +void VariableNamer::HydProdUp(unsigned int var) +{ + SetAreaVariableName(var, "HydProdUp"); +} + +void VariableNamer::Pumping(unsigned int var) +{ + SetAreaVariableName(var, "Pumping"); +} + +void VariableNamer::HydroLevel(unsigned int var) +{ + SetAreaVariableName(var, "HydroLevel"); +} + +void VariableNamer::Overflow(unsigned int var) +{ + SetAreaVariableName(var, "Overflow"); +} + +void VariableNamer::LayerStorage(unsigned int var, int layerIndex) +{ + SetAreaVariableName(var, "LayerStorage", layerIndex); +} + +void VariableNamer::FinalStorage(unsigned int var) +{ + SetAreaVariableName(var, "FinalStorage"); +} + +void VariableNamer::PositiveUnsuppliedEnergy(unsigned int var) +{ + SetAreaVariableName(var, "PositiveUnsuppliedEnergy"); +} + +void VariableNamer::NegativeUnsuppliedEnergy(unsigned int var) +{ + SetAreaVariableName(var, "NegativeUnsuppliedEnergy"); +} + +void VariableNamer::AreaBalance(unsigned int var) +{ + SetAreaVariableName(var, "AreaBalance"); +} + +void ConstraintNamer::FlowDissociation(unsigned int numConstraint, + const std::string& origin, + const std::string& destination) +{ + targetUpdater_.UpdateTargetAtIndex( + BuildName("FlowDissociation", + LocationIdentifier(origin + AREA_SEP + destination, LINK), + TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::AreaBalance(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex( + BuildName("AreaBalance", LocationIdentifier(area_, AREA), TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::FictiveLoads(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex( + BuildName("FictiveLoads", LocationIdentifier(area_, AREA), TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::HydroPower(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex( + BuildName("HydroPower", LocationIdentifier(area_, AREA), TimeIdentifier(timeStep_, WEEK)), + numConstraint); +} + +void ConstraintNamer::HydroPowerSmoothingUsingVariationSum(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex(BuildName("HydroPowerSmoothingUsingVariationSum", + LocationIdentifier(area_, AREA), + TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::HydroPowerSmoothingUsingVariationMaxDown(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex(BuildName("HydroPowerSmoothingUsingVariationMaxDown", + LocationIdentifier(area_, AREA), + TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::HydroPowerSmoothingUsingVariationMaxUp(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex(BuildName("HydroPowerSmoothingUsingVariationMaxUp", + LocationIdentifier(area_, AREA), + TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::MinHydroPower(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex( + BuildName("MinHydroPower", LocationIdentifier(area_, AREA), TimeIdentifier(timeStep_, WEEK)), + numConstraint); +} + +void ConstraintNamer::MaxHydroPower(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex( + BuildName("MaxHydroPower", LocationIdentifier(area_, AREA), TimeIdentifier(timeStep_, WEEK)), + numConstraint); +} + +void ConstraintNamer::MaxPumping(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex( + BuildName("MaxPumping", LocationIdentifier(area_, AREA), TimeIdentifier(timeStep_, WEEK)), + numConstraint); +} + +void ConstraintNamer::AreaHydroLevel(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex( + BuildName("AreaHydroLevel", LocationIdentifier(area_, AREA), TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::FinalStockEquivalent(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex( + BuildName( + "FinalStockEquivalent", LocationIdentifier(area_, AREA), TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::FinalStockExpression(unsigned int numConstraint ) +{ + targetUpdater_.UpdateTargetAtIndex( + BuildName( + "FinalStockExpression", LocationIdentifier(area_, AREA), TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::nameWithTimeGranularity(unsigned int numConstraint, + const std::string& name, + const std::string& type) +{ + targetUpdater_.UpdateTargetAtIndex( + BuildName(name, BindingConstraintTimeGranularity.at(type), TimeIdentifier(timeStep_, type)), + numConstraint); +} + +void ConstraintNamer::NbUnitsOutageLessThanNbUnitsStop(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex(BuildName("NbUnitsOutageLessThanNbUnitsStop", + LocationIdentifier(area_, AREA), + TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::NbDispUnitsMinBoundSinceMinUpTime(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex(BuildName("NbDispUnitsMinBoundSinceMinUpTime", + LocationIdentifier(area_, AREA), + TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::MinDownTime(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex( + BuildName("MinDownTime", LocationIdentifier(area_, AREA), TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::PMaxDispatchableGeneration(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex(BuildName("PMaxDispatchableGeneration", + LocationIdentifier(area_, AREA), + TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::PMinDispatchableGeneration(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex(BuildName("PMinDispatchableGeneration", + LocationIdentifier(area_, AREA), + TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::ConsistenceNODU(unsigned int numConstraint) +{ + targetUpdater_.UpdateTargetAtIndex( + BuildName( + "ConsistenceNODU", LocationIdentifier(area_, AREA), TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::ShortTermStorageLevel(unsigned int numConstraint, const std::string& name) +{ + targetUpdater_.UpdateTargetAtIndex( + BuildName("Level", + LocationIdentifier(area_, AREA) + SEPARATOR + "ShortTermStorage" + "<" + name + ">", + TimeIdentifier(timeStep_, HOUR)), + numConstraint); +} + +void ConstraintNamer::BindingConstraintHour(unsigned int numConstraint, const std::string& name) +{ + nameWithTimeGranularity(numConstraint, name, HOUR); +} + +void ConstraintNamer::BindingConstraintDay(unsigned int numConstraint, const std::string& name) +{ + nameWithTimeGranularity(numConstraint, name, DAY); +} + +void ConstraintNamer::BindingConstraintWeek(unsigned int numConstraint, const std::string& name) +{ + nameWithTimeGranularity(numConstraint, name, WEEK); +} diff --git a/src/solver/optimisation/opt_rename_problem.h b/src/solver/optimisation/opt_rename_problem.h new file mode 100644 index 0000000000..bac4c73041 --- /dev/null +++ b/src/solver/optimisation/opt_rename_problem.h @@ -0,0 +1,143 @@ +#pragma once +#include "opt_structure_probleme_a_resoudre.h" +#include "opt_export_structure.h" + +const std::string SEPARATOR = "::"; +const std::string AREA_SEP = "$$"; + +class TargetVectorUpdater +{ +public: + TargetVectorUpdater(bool isRenamingProcessed, std::vector& target) : + target_(target), isRenamingProcessed_(isRenamingProcessed) + { + } + + void UpdateTargetAtIndex(const std::string& full_name, unsigned int index) + { + if (isRenamingProcessed_) + { + target_[index] = full_name; + } + } + +private: + std::vector& target_; + bool isRenamingProcessed_; +}; + +class Namer +{ +public: + Namer(std::vector& target, bool namedProblems) : + targetUpdater_(namedProblems, target) + { + } + + void UpdateTimeStep(int timeStep) + { + timeStep_ = timeStep; + } + + void UpdateArea(const std::string& area) + { + area_ = area; + } + + unsigned int timeStep_ = 0; + std::string origin_; + std::string destination_; + std::string area_; + TargetVectorUpdater targetUpdater_; +}; + +class VariableNamer : public Namer +{ +public: + using Namer::Namer; + void DispatchableProduction(unsigned int var, const std::string& clusterName); + void NODU(unsigned int var, const std::string& clusterName); + void NumberStoppingDispatchableUnits(unsigned int var, const std::string& clusterName); + void NumberStartingDispatchableUnits(unsigned int var, const std::string& clusterName); + void NumberBreakingDownDispatchableUnits(unsigned int var, const std::string& clusterName); + void NTCDirect(unsigned int var, const std::string& origin, const std::string& destination); + void IntercoDirectCost(unsigned int var, + const std::string& origin, + const std::string& destination); + void IntercoIndirectCost(unsigned int var, + const std::string& origin, + const std::string& destination); + void ShortTermStorageInjection(unsigned int var, const std::string& shortTermStorageName); + void ShortTermStorageWithdrawal(unsigned int var, const std::string& shortTermStorageName); + void ShortTermStorageLevel(unsigned int var, const std::string& shortTermStorageName); + void HydProd(unsigned int var); + void HydProdDown(unsigned int var); + void HydProdUp(unsigned int var); + void Pumping(unsigned int var); + void HydroLevel(unsigned int var); + void Overflow(unsigned int var); + void FinalStorage(unsigned int var); + void LayerStorage(unsigned int var, int layerIndex); + void PositiveUnsuppliedEnergy(unsigned int var); + void NegativeUnsuppliedEnergy(unsigned int var); + void AreaBalance(unsigned int var); + +private: + void SetThermalClusterVariableName(unsigned int var, + const std::string& variableType, + const std::string& clusterName); + void SetAreaVariableName(unsigned int var, const std::string& variableType); + + void SetAreaVariableName(unsigned int var, const std::string& variableType, int layerIndex); + void SetLinkVariableName(unsigned int var, const std::string& variableType); + void SetShortTermStorageVariableName(unsigned int var, + const std::string& variableType, + const std::string& shortTermStorageName); +}; + +class ConstraintNamer : public Namer +{ +public: + using Namer::Namer; + + void FlowDissociation(unsigned int numConstraint, + const std::string& origin, + const std::string& destination); + void AreaBalance(unsigned int numConstraint); + void FictiveLoads(unsigned int numConstraint); + void HydroPower(unsigned int numConstraint); + void HydroPowerSmoothingUsingVariationSum(unsigned int numConstraint); + void HydroPowerSmoothingUsingVariationMaxDown(unsigned int numConstraint); + void HydroPowerSmoothingUsingVariationMaxUp(unsigned int numConstraint); + void MinHydroPower(unsigned int numConstraint); + void MaxHydroPower(unsigned int numConstraint); + void MaxPumping(unsigned int numConstraint); + void AreaHydroLevel(unsigned int numConstraint); + void FinalStockEquivalent(unsigned int numConstraint); + void FinalStockExpression(unsigned int numConstraint); + void NbUnitsOutageLessThanNbUnitsStop(unsigned int numConstraint); + void NbDispUnitsMinBoundSinceMinUpTime(unsigned int numConstraint); + void MinDownTime(unsigned int numConstraint); + void PMaxDispatchableGeneration(unsigned int numConstraint); + void PMinDispatchableGeneration(unsigned int numConstraint); + void ConsistenceNODU(unsigned int numConstraint); + void ShortTermStorageLevel(unsigned int numConstraint, const std::string& name); + void BindingConstraintHour(unsigned int numConstraint, const std::string& name); + void BindingConstraintDay(unsigned int numConstraint, const std::string& name); + void BindingConstraintWeek(unsigned int numConstraint, const std::string& name); + +private: + void nameWithTimeGranularity(unsigned int numConstraint, + const std::string& name, + const std::string& type); +}; + +inline std::string TimeIdentifier(int timeStep, const std::string& timeStepType) +{ + return timeStepType + "<" + std::to_string(timeStep) + ">"; +} + +inline std::string LocationIdentifier(const std::string& location, const std::string& locationType) +{ + return locationType + "<" + location + ">"; +} diff --git a/src/solver/simulation/sim_alloc_probleme_hebdo.cpp b/src/solver/simulation/sim_alloc_probleme_hebdo.cpp index 73b4f293f9..a5a1c95718 100644 --- a/src/solver/simulation/sim_alloc_probleme_hebdo.cpp +++ b/src/solver/simulation/sim_alloc_probleme_hebdo.cpp @@ -347,6 +347,7 @@ void SIM_AllocationProblemeHebdo(PROBLEME_HEBDO& problem, unsigned NombreDePasDe .assign(nbPaliers, 0); problem.PaliersThermiquesDuPays[k].DureeMinimaleDArretDUnGroupeDuPalierThermique .assign(nbPaliers, 0); + problem.PaliersThermiquesDuPays[k].NomsDesPaliersThermiques.assign(nbPaliers, ""); problem.CaracteristiquesHydrauliques[k].CntEnergieH2OParIntervalleOptimise .assign(7, 0.); diff --git a/src/solver/simulation/sim_calcul_economique.cpp b/src/solver/simulation/sim_calcul_economique.cpp index ec51bb8012..562de0f470 100644 --- a/src/solver/simulation/sim_calcul_economique.cpp +++ b/src/solver/simulation/sim_calcul_economique.cpp @@ -60,6 +60,7 @@ static void importShortTermStorages( toInsert.injectionNominalCapacity = st->properties.injectionNominalCapacity.value(); toInsert.withdrawalNominalCapacity = st->properties.withdrawalNominalCapacity.value(); toInsert.initialLevel = st->properties.initialLevel; + toInsert.name = st->properties.name; toInsert.series = st->series; @@ -112,6 +113,7 @@ void SIM_InitialisationProblemeHebdo(Data::Study& study, problem.ExportMPS = study.parameters.include.exportMPS; problem.ExportStructure = study.parameters.include.exportStructure; + problem.NamedProblems = study.parameters.namedProblems; problem.exportMPSOnError = Data::exportMPS(parameters.include.unfeasibleProblemBehavior); problem.OptimisationAvecCoutsDeDemarrage @@ -273,27 +275,32 @@ void SIM_InitialisationProblemeHebdo(Data::Study& study, auto& pbPalier = problem.PaliersThermiquesDuPays[i]; pbPalier.NombreDePaliersThermiques = area.thermal.list.size(); - for (uint l = 0; l != area.thermal.list.size(); ++l) + for (uint clusterIndex = 0; clusterIndex != area.thermal.list.size(); ++clusterIndex) { - auto& cluster = *(area.thermal.list.byIndex[l]); - pbPalier.NumeroDuPalierDansLEnsembleDesPaliersThermiques[l] = NombrePaliers + l; - pbPalier.TailleUnitaireDUnGroupeDuPalierThermique[l] + auto& cluster = *(area.thermal.list.byIndex[clusterIndex]); + pbPalier.NumeroDuPalierDansLEnsembleDesPaliersThermiques[clusterIndex] + = NombrePaliers + clusterIndex; + pbPalier.TailleUnitaireDUnGroupeDuPalierThermique[clusterIndex] + = cluster.nominalCapacityWithSpinning; + pbPalier.PminDuPalierThermiquePendantUneHeure[clusterIndex] = cluster.minStablePower; + pbPalier.PminDuPalierThermiquePendantUnJour[clusterIndex] = 0; + pbPalier.minUpDownTime[clusterIndex] = cluster.minUpDownTime; + + pbPalier.CoutDeDemarrageDUnGroupeDuPalierThermique[clusterIndex] = cluster.startupCost; + pbPalier.CoutDArretDUnGroupeDuPalierThermique[clusterIndex] = 0; + pbPalier.CoutFixeDeMarcheDUnGroupeDuPalierThermique[clusterIndex] = cluster.fixedCost; + pbPalier.DureeMinimaleDeMarcheDUnGroupeDuPalierThermique[clusterIndex] + = cluster.minUpTime; + pbPalier.DureeMinimaleDArretDUnGroupeDuPalierThermique[clusterIndex] + = cluster.minDownTime; + + pbPalier.PmaxDUnGroupeDuPalierThermique[clusterIndex] = cluster.nominalCapacityWithSpinning; - pbPalier.PminDuPalierThermiquePendantUneHeure[l] = cluster.minStablePower; - pbPalier.PminDuPalierThermiquePendantUnJour[l] = 0; - pbPalier.minUpDownTime[l] = cluster.minUpDownTime; - - pbPalier.CoutDeDemarrageDUnGroupeDuPalierThermique[l] = cluster.startupCost; - pbPalier.CoutDArretDUnGroupeDuPalierThermique[l] = 0; - pbPalier.CoutFixeDeMarcheDUnGroupeDuPalierThermique[l] = cluster.fixedCost; - pbPalier.DureeMinimaleDeMarcheDUnGroupeDuPalierThermique[l] = cluster.minUpTime; - pbPalier.DureeMinimaleDArretDUnGroupeDuPalierThermique[l] = cluster.minDownTime; - - pbPalier.PmaxDUnGroupeDuPalierThermique[l] = cluster.nominalCapacityWithSpinning; - pbPalier.pminDUnGroupeDuPalierThermique[l] - = (pbPalier.PmaxDUnGroupeDuPalierThermique[l] < cluster.minStablePower) - ? pbPalier.PmaxDUnGroupeDuPalierThermique[l] + pbPalier.pminDUnGroupeDuPalierThermique[clusterIndex] + = (pbPalier.PmaxDUnGroupeDuPalierThermique[clusterIndex] < cluster.minStablePower) + ? pbPalier.PmaxDUnGroupeDuPalierThermique[clusterIndex] : cluster.minStablePower; + pbPalier.NomsDesPaliersThermiques[clusterIndex] = cluster.name().c_str(); } NombrePaliers += area.thermal.list.size(); diff --git a/src/solver/simulation/sim_structure_probleme_economique.h b/src/solver/simulation/sim_structure_probleme_economique.h index 695e842566..58756758d0 100644 --- a/src/solver/simulation/sim_structure_probleme_economique.h +++ b/src/solver/simulation/sim_structure_probleme_economique.h @@ -172,6 +172,7 @@ struct PROPERTIES std::shared_ptr series; int clusterGlobalIndex; + std::string name; }; using AREA_INPUT = std::vector<::ShortTermStorage::PROPERTIES>; // index is local @@ -280,6 +281,7 @@ struct PALIERS_THERMIQUES std::vector PmaxDUnGroupeDuPalierThermique; std::vector DureeMinimaleDeMarcheDUnGroupeDuPalierThermique; std::vector DureeMinimaleDArretDUnGroupeDuPalierThermique; + std::vector NomsDesPaliersThermiques; }; struct ENERGIES_ET_PUISSANCES_HYDRAULIQUES @@ -542,6 +544,7 @@ struct PROBLEME_HEBDO Data::mpsExportStatus ExportMPS = Data::mpsExportStatus::NO_EXPORT; bool exportMPSOnError = false; bool ExportStructure = false; + bool NamedProblems = false; unsigned int HeureDansLAnnee = 0; bool LeProblemeADejaEteInstancie = false; diff --git a/src/solver/utils/mps_utils.cpp b/src/solver/utils/mps_utils.cpp index afd5c7e4ed..1a88a35d08 100644 --- a/src/solver/utils/mps_utils.cpp +++ b/src/solver/utils/mps_utils.cpp @@ -55,6 +55,15 @@ using namespace Yuni; #define SEP IO::Separator +static char** VectorOfStringToCharPP(std::vector& in, std::vector& pointerVec) +{ + std::transform(in.begin(), + in.end(), + std::back_inserter(pointerVec), + [](std::string& str) { return str.empty() ? nullptr : str.data(); }); + return pointerVec.data(); +} + class ProblemConverter { public: @@ -84,10 +93,16 @@ class ProblemConverter dest->NbTerm = src->NombreDeTermesDesLignes; dest->B = src->SecondMembre; dest->SensDeLaContrainte = src->Sens; + + // Names + dest->LabelDeLaVariable = VectorOfStringToCharPP(src->NomDesVariables, mVariableNames); + dest->LabelDeLaContrainte = VectorOfStringToCharPP(src->NomDesContraintes, mConstraintNames); } private: std::vector mVariableType; + std::vector mVariableNames; + std::vector mConstraintNames; }; void OPT_EcrireJeuDeDonneesLineaireAuFormatMPS(PROBLEME_SIMPLEXE_NOMME* Prob, diff --git a/src/solver/utils/named_problem.cpp b/src/solver/utils/named_problem.cpp index 8411838207..7f22c0c02e 100644 --- a/src/solver/utils/named_problem.cpp +++ b/src/solver/utils/named_problem.cpp @@ -1,13 +1,17 @@ #include "named_problem.h" +#include +#include namespace Antares { namespace Optimization { + PROBLEME_SIMPLEXE_NOMME::PROBLEME_SIMPLEXE_NOMME(const std::vector& NomDesVariables, const std::vector& NomDesContraintes, std::vector& StatutDesVariables, std::vector& StatutDesContraintes) : + NomDesVariables(NomDesVariables), NomDesContraintes(NomDesContraintes), StatutDesVariables(StatutDesVariables), diff --git a/src/solver/utils/named_problem.h b/src/solver/utils/named_problem.h index c83fa7d32d..9c393b9a07 100644 --- a/src/solver/utils/named_problem.h +++ b/src/solver/utils/named_problem.h @@ -12,15 +12,14 @@ namespace Optimization { struct PROBLEME_SIMPLEXE_NOMME : public PROBLEME_SIMPLEXE { -private: public: PROBLEME_SIMPLEXE_NOMME(const std::vector& NomDesVariables, const std::vector& NomDesContraintes, std::vector& StatutDesVariables, std::vector& StatutDesContraintes); - const std::vector& NomDesVariables; - const std::vector& NomDesContraintes; + std::vector NomDesVariables; + std::vector NomDesContraintes; std::vector& StatutDesVariables; std::vector& StatutDesContraintes;