From 11c120eaa2fcc5ec310b881f26560d1a4ca11992 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Thu, 19 Dec 2024 18:54:05 +0100 Subject: [PATCH 01/42] update --- src/libs/antares/study/CMakeLists.txt | 4 +- ...alConstraint.h => AdditionalConstraints.h} | 21 ++++++-- .../study/parts/short-term-storage/cluster.h | 4 +- .../parts/short-term-storage/container.h | 1 - .../study/parts/short-term-storage/series.h | 2 +- ...nstraint.cpp => AdditionalConstraints.cpp} | 31 +++++++---- .../parts/short-term-storage/container.cpp | 51 ++++++++++++++----- .../study/parts/short-term-storage/series.cpp | 14 ++--- .../ShortTermStorageCumulation.cpp | 34 +++++++------ .../sim_structure_probleme_economique.h | 2 +- .../simulation/sim_calcul_economique.cpp | 9 ++-- 11 files changed, 115 insertions(+), 58 deletions(-) rename src/libs/antares/study/include/antares/study/parts/short-term-storage/{AdditionalConstraint.h => AdditionalConstraints.h} (81%) rename src/libs/antares/study/parts/short-term-storage/{AdditionalConstraint.cpp => AdditionalConstraints.cpp} (67%) diff --git a/src/libs/antares/study/CMakeLists.txt b/src/libs/antares/study/CMakeLists.txt index e7336d020c..dd82930032 100644 --- a/src/libs/antares/study/CMakeLists.txt +++ b/src/libs/antares/study/CMakeLists.txt @@ -102,9 +102,9 @@ set(SRC_STUDY_PART_SHORT_TERM_STORAGE parts/short-term-storage/series.cpp include/antares/study/parts/short-term-storage/series.h include/antares/study/parts/short-term-storage/cluster.h - include/antares/study/parts/short-term-storage/AdditionalConstraint.h + include/antares/study/parts/short-term-storage/AdditionalConstraints.h parts/short-term-storage/cluster.cpp - parts/short-term-storage/AdditionalConstraint.cpp + parts/short-term-storage/AdditionalConstraints.cpp ) source_group("study\\part\\short-term-storage" FILES ${SRC_STUDY_PART_SHORT_TERM_SOTRAGE}) diff --git a/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraint.h b/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h similarity index 81% rename from src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraint.h rename to src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h index e16b991a05..7e27c9a60f 100644 --- a/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraint.h +++ b/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h @@ -22,20 +22,30 @@ #pragma once #include #include +#include namespace Antares::Data::ShortTermStorage { +struct SingleAdditionalConstraint +{ + std::set hours; + unsigned int globalIndex = 0; + unsigned int localIndex = 0; + + bool isValidHoursRange() const; +}; -struct AdditionalConstraint +struct AdditionalConstraints { std::string name; std::string cluster_id; std::string variable; std::string operatorType; - std::set hours; - double rhs; + // TODO a lot unused entries + //std::array rhs = {}; + std::vector rhs = {}; - unsigned int globalIndex = 0; + std::vector constraints = {}; struct ValidateResult { @@ -48,6 +58,7 @@ struct AdditionalConstraint private: bool isValidVariable() const; bool isValidOperatorType() const; - bool isValidHoursRange() const; + + bool isValidHours() const; }; } // namespace Antares::Data::ShortTermStorage diff --git a/src/libs/antares/study/include/antares/study/parts/short-term-storage/cluster.h b/src/libs/antares/study/include/antares/study/parts/short-term-storage/cluster.h index df74a350b0..c117111efe 100644 --- a/src/libs/antares/study/include/antares/study/parts/short-term-storage/cluster.h +++ b/src/libs/antares/study/include/antares/study/parts/short-term-storage/cluster.h @@ -26,7 +26,7 @@ #include -#include "AdditionalConstraint.h" +#include "AdditionalConstraints.h" #include "properties.h" #include "series.h" @@ -51,6 +51,6 @@ class STStorageCluster std::shared_ptr series = std::make_shared(); mutable Properties properties; - std::vector additional_constraints; + std::vector additional_constraints; }; } // namespace Antares::Data::ShortTermStorage diff --git a/src/libs/antares/study/include/antares/study/parts/short-term-storage/container.h b/src/libs/antares/study/include/antares/study/parts/short-term-storage/container.h index d4e0233b5c..65dc8145bc 100644 --- a/src/libs/antares/study/include/antares/study/parts/short-term-storage/container.h +++ b/src/libs/antares/study/include/antares/study/parts/short-term-storage/container.h @@ -23,7 +23,6 @@ #include #include -#include "AdditionalConstraint.h" #include "cluster.h" namespace Antares::Data::ShortTermStorage diff --git a/src/libs/antares/study/include/antares/study/parts/short-term-storage/series.h b/src/libs/antares/study/include/antares/study/parts/short-term-storage/series.h index 80f90b94f2..1f53a220fe 100644 --- a/src/libs/antares/study/include/antares/study/parts/short-term-storage/series.h +++ b/src/libs/antares/study/include/antares/study/parts/short-term-storage/series.h @@ -63,5 +63,5 @@ class Series bool loadFile(const std::filesystem::path& folder, std::vector& vect); bool writeVectorToFile(const std::string& path, const std::vector& vect); - +void fillIfEmpty(std::vector& v, double value); } // namespace Antares::Data::ShortTermStorage diff --git a/src/libs/antares/study/parts/short-term-storage/AdditionalConstraint.cpp b/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp similarity index 67% rename from src/libs/antares/study/parts/short-term-storage/AdditionalConstraint.cpp rename to src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp index 2ca904041c..8775ffe561 100644 --- a/src/libs/antares/study/parts/short-term-storage/AdditionalConstraint.cpp +++ b/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp @@ -18,11 +18,12 @@ ** You should have received a copy of the Mozilla Public Licence 2.0 ** along with Antares_Simulator. If not, see . */ -#include "antares/study/parts/short-term-storage/AdditionalConstraint.h" +#include "antares/study/parts/short-term-storage/AdditionalConstraints.h" +#include namespace Antares::Data::ShortTermStorage { -AdditionalConstraint::ValidateResult AdditionalConstraint::validate() const +AdditionalConstraints::ValidateResult AdditionalConstraints::validate() const { if (cluster_id.empty()) { @@ -39,26 +40,38 @@ AdditionalConstraint::ValidateResult AdditionalConstraint::validate() const return {false, "Invalid operator type. Must be 'less', 'equal', or 'greater'."}; } - if (!isValidHoursRange()) + if (!isValidHours()) { - return {false, "Hours set contains invalid values. Must be between 1 and 168."}; + return {false, "Hours sets contains invalid values. Must be between 1 and 168."}; } return {true, ""}; } - -bool AdditionalConstraint::isValidHoursRange() const +bool SingleAdditionalConstraint::isValidHoursRange() const { // `hours` is a sorted set; begin() gives the smallest and prev(end()) gives the largest. - return !hours.empty() && *hours.begin() >= 1 && *std::prev(hours.end()) <= 168; + return !hours.empty() && *hours.begin() + >= 1 && *std::prev( + hours.end()) <= 168; } -bool AdditionalConstraint::isValidVariable() const +bool AdditionalConstraints::isValidHours() const +{ + return std::ranges::all_of(constraints.begin(), + constraints.end(), + [](const auto& constraint) + { + return constraint.isValidHoursRange(); + }); +} + + +bool AdditionalConstraints::isValidVariable() const { return variable == "injection" || variable == "withdrawal" || variable == "netting"; } -bool AdditionalConstraint::isValidOperatorType() const +bool AdditionalConstraints::isValidOperatorType() const { return operatorType == "less" || operatorType == "equal" || operatorType == "greater"; } diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 39a958c5c7..897c234550 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -87,7 +88,7 @@ bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) for (auto* section = ini.firstSection; section; section = section->next) { - AdditionalConstraint constraint; + AdditionalConstraints constraint; constraint.name = section->name.c_str(); for (auto* property = section->firstProperty; property; property = property->next) { @@ -111,24 +112,50 @@ bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) } else if (key == "hours") { - std::stringstream ss(value.c_str()); - std::string hour; - while (std::getline(ss, hour, ',')) + // + // std::stringstream ss(value.c_str()); + // std::string hour; + // while (std::getline(ss, hour, ',')) + // { + // int hourVal = std::stoi(hour); + // constraint.hours.insert(hourVal); + // } + + // Split the `hours` field into multiple groups + std::string hoursStr = value.c_str(); + std::regex groupRegex(R"(\[(.*?)\])"); + // Match each group enclosed in square brackets + auto groupsBegin = std::sregex_iterator(hoursStr.begin(), + hoursStr.end(), + groupRegex); + auto groupsEnd = std::sregex_iterator(); + for (auto it = groupsBegin; it != groupsEnd; ++it) { - int hourVal = std::stoi(hour); - constraint.hours.insert(hourVal); + // Extract the contents of the square brackets + std::string group = (*it)[1].str(); + std::stringstream ss(group); + std::string hour; + std::set hourSet; + + while (std::getline(ss, hour, ',')) + { + int hourVal = std::stoi(hour); + hourSet.insert(hourVal); + } + + constraint.hours.push_back(hourSet); // Add this group to the `hours` vector } } - else if (key == "rhs") - { - property->value.to(constraint.rhs); - } + + // try to read the rhs + loadFile(parent_path / ("rhs_" + constraint.name + ".txt"), constraint.rhs); + fillIfEmpty(constraint.rhs, 0.0); } - if (auto ret = constraint.validate(); !ret.ok) + if (auto [ok, error_msg] = constraint.validate(); !ok) { logs.error() << "Invalid constraint in section: " << section->name; - logs.error() << ret.error_msg; + logs.error() << error_msg; return false; } diff --git a/src/libs/antares/study/parts/short-term-storage/series.cpp b/src/libs/antares/study/parts/short-term-storage/series.cpp index 6c341c948d..4ee93d8a73 100644 --- a/src/libs/antares/study/parts/short-term-storage/series.cpp +++ b/src/libs/antares/study/parts/short-term-storage/series.cpp @@ -107,16 +107,16 @@ bool loadFile(const fs::path& path, std::vector& vect) return true; } -void Series::fillDefaultSeriesIfEmpty() +void fillIfEmpty(std::vector& v, double value) { - auto fillIfEmpty = [](std::vector& v, double value) + if (v.empty()) { - if (v.empty()) - { - v.resize(HOURS_PER_YEAR, value); - } - }; + v.resize(HOURS_PER_YEAR, value); + } +}; +void Series::fillDefaultSeriesIfEmpty() +{ fillIfEmpty(maxInjectionModulation, 1.0); fillIfEmpty(maxWithdrawalModulation, 1.0); fillIfEmpty(inflows, 0.0); diff --git a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp index f6e684db83..f00d39d56e 100644 --- a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp +++ b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp @@ -130,28 +130,32 @@ void ShortTermStorageCumulation::add(int pays) for (const auto& storage: data.ShortTermStorage[pays]) { - for (const auto& constraint: storage.additional_constraints) + for (const auto& additional_constraints: storage.additional_constraints) { // sum (var[h]) sign rhs, h in list provided by user where: // var = injection for InjectionCumulationConstraint // var = withdrawal for WithdrawalCumulationConstraint // var = injectionEfficiency * injection - withdrawalEfficiency * withdrawal for Netting - auto constraintHelper = cumulationConstraintFromVariable(constraint.variable); - namer.ShortTermStorageCumulation(constraintHelper->name(), - builder.data.nombreDeContraintes, - storage.name, - constraint.name); - const auto index = storage.clusterGlobalIndex; - data.CorrespondanceCntNativesCntOptimHebdomadaires - .ShortTermStorageCumulation[constraint.globalIndex] - = builder.data.nombreDeContraintes; - - for (const auto& hour: constraint.hours) + auto constraintHelper = cumulationConstraintFromVariable( + additional_constraints.variable); + for (auto& constraint: additional_constraints.constraints) { - builder.updateHourWithinWeek(hour - 1); - constraintHelper->build(builder, index, storage); + namer.ShortTermStorageCumulation(constraintHelper->name() +, + builder.data.nombreDeContraintes, + storage.name, + additional_constraints.name); + const auto index = storage.clusterGlobalIndex; + data.CorrespondanceCntNativesCntOptimHebdomadaires + .ShortTermStorageCumulation[additional_constraints.globalIndex] + = builder.data.nombreDeContraintes; + + for (const auto& hour: additional_constraints.hours) + { + builder.updateHourWithinWeek(hour - 1); + constraintHelper->build(builder, index, storage); + } + builder.SetOperator(ConvertSense(additional_constraints.operatorType)).build(); } - builder.SetOperator(ConvertSense(constraint.operatorType)).build(); } } } diff --git a/src/solver/simulation/include/antares/solver/simulation/sim_structure_probleme_economique.h b/src/solver/simulation/include/antares/solver/simulation/sim_structure_probleme_economique.h index 35051ba2d5..52b7e8dc0d 100644 --- a/src/solver/simulation/include/antares/solver/simulation/sim_structure_probleme_economique.h +++ b/src/solver/simulation/include/antares/solver/simulation/sim_structure_probleme_economique.h @@ -183,7 +183,7 @@ struct PROPERTIES bool penalizeVariationInjection; std::shared_ptr series; - std::vector additional_constraints; + std::vector additional_constraints; int clusterGlobalIndex; std::string name; }; diff --git a/src/solver/simulation/sim_calcul_economique.cpp b/src/solver/simulation/sim_calcul_economique.cpp index 786b1b5aa6..cdecaaa1cd 100644 --- a/src/solver/simulation/sim_calcul_economique.cpp +++ b/src/solver/simulation/sim_calcul_economique.cpp @@ -61,10 +61,13 @@ static void importShortTermStorages( toInsert.penalizeVariationWithdrawal = st.properties.penalizeVariationWithdrawal; toInsert.name = st.properties.name; toInsert.additional_constraints = st.additional_constraints; - for (auto& constraint: toInsert.additional_constraints) + for (auto& additional_constraints: toInsert.additional_constraints) { - constraint.globalIndex = clusterCumulativeConstraintGlobalIndex; - ++clusterCumulativeConstraintGlobalIndex; + for (auto& [_, globalIndex]: additional_constraints.constraints) + { + globalIndex = clusterCumulativeConstraintGlobalIndex; + ++clusterCumulativeConstraintGlobalIndex; + } } toInsert.series = st.series; From f100200599c2abbe18319e2ddfc87cc0c1705679 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Fri, 20 Dec 2024 11:36:07 +0100 Subject: [PATCH 02/42] update --- .../parts/short-term-storage/container.cpp | 32 +++++++++++-------- .../ShortTermStorageCumulation.cpp | 15 +++++---- .../opt_decompte_variables_et_contraintes.cpp | 6 +++- ...opt_gestion_second_membre_cas_lineaire.cpp | 29 +++++++++++++---- .../simulation/sim_calcul_economique.cpp | 2 +- 5 files changed, 56 insertions(+), 28 deletions(-) diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 897c234550..5dee3106dc 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -88,8 +88,8 @@ bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) for (auto* section = ini.firstSection; section; section = section->next) { - AdditionalConstraints constraint; - constraint.name = section->name.c_str(); + AdditionalConstraints additional_constraints; + additional_constraints.name = section->name.c_str(); for (auto* property = section->firstProperty; property; property = property->next) { const std::string key = property->key; @@ -100,15 +100,15 @@ bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) // TODO do i have to transform the name to id? TransformNameIntoID std::string clusterName; value.to(clusterName); - constraint.cluster_id = transformNameIntoID(clusterName); + additional_constraints.cluster_id = transformNameIntoID(clusterName); } else if (key == "variable") { - value.to(constraint.variable); + value.to(additional_constraints.variable); } else if (key == "operator") { - value.to(constraint.operatorType); + value.to(additional_constraints.operatorType); } else if (key == "hours") { @@ -129,6 +129,7 @@ bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) hoursStr.end(), groupRegex); auto groupsEnd = std::sregex_iterator(); + unsigned int localIndex = 0; for (auto it = groupsBegin; it != groupsEnd; ++it) { // Extract the contents of the square brackets @@ -142,17 +143,20 @@ bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) int hourVal = std::stoi(hour); hourSet.insert(hourVal); } - - constraint.hours.push_back(hourSet); // Add this group to the `hours` vector + // Add this group to the `hours` vec + additional_constraints.constraints.push_back( + {.hours = hourSet, .localIndex = localIndex}); + ++localIndex; } } // try to read the rhs - loadFile(parent_path / ("rhs_" + constraint.name + ".txt"), constraint.rhs); - fillIfEmpty(constraint.rhs, 0.0); + loadFile(parent_path / ("rhs_" + additional_constraints.name + ".txt"), + additional_constraints.rhs); + fillIfEmpty(additional_constraints.rhs, 0.0); } - if (auto [ok, error_msg] = constraint.validate(); !ok) + if (auto [ok, error_msg] = additional_constraints.validate(); !ok) { logs.error() << "Invalid constraint in section: " << section->name; logs.error() << error_msg; @@ -161,8 +165,10 @@ bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) auto it = std::find_if(storagesByIndex.begin(), storagesByIndex.end(), - [&constraint](const STStorageCluster& cluster) - { return cluster.id == constraint.cluster_id; }); + [&additional_constraints](const STStorageCluster& cluster) + { + return cluster.id == additional_constraints.cluster_id; + }); if (it == storagesByIndex.end()) { logs.warning() << " from file " << pathIni; @@ -172,7 +178,7 @@ bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) } else { - it->additional_constraints.push_back(constraint); + it->additional_constraints.push_back(additional_constraints); } } diff --git a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp index f00d39d56e..bf6cf51f94 100644 --- a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp +++ b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp @@ -138,18 +138,19 @@ void ShortTermStorageCumulation::add(int pays) // var = injectionEfficiency * injection - withdrawalEfficiency * withdrawal for Netting auto constraintHelper = cumulationConstraintFromVariable( additional_constraints.variable); - for (auto& constraint: additional_constraints.constraints) + for (const auto& [hours, globalIndex, localIndex]: additional_constraints.constraints) { - namer.ShortTermStorageCumulation(constraintHelper->name() +, - builder.data.nombreDeContraintes, - storage.name, - additional_constraints.name); + namer.ShortTermStorageCumulation( + constraintHelper->name() + std::to_string(localIndex), + builder.data.nombreDeContraintes, + storage.name, + additional_constraints.name); const auto index = storage.clusterGlobalIndex; data.CorrespondanceCntNativesCntOptimHebdomadaires - .ShortTermStorageCumulation[additional_constraints.globalIndex] + .ShortTermStorageCumulation[globalIndex] = builder.data.nombreDeContraintes; - for (const auto& hour: additional_constraints.hours) + for (const auto& hour: hours) { builder.updateHourWithinWeek(hour - 1); constraintHelper->build(builder, index, storage); diff --git a/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp b/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp index 79c29c58ab..7de6203d69 100644 --- a/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp +++ b/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp @@ -247,7 +247,11 @@ int OPT_DecompteDesVariablesEtDesContraintesDuProblemeAOptimiser(PROBLEME_HEBDO* } if (!storage.additional_constraints.empty()) { - ProblemeAResoudre->NombreDeContraintes += storage.additional_constraints.size(); + for (const auto& additional_constraints: storage.additional_constraints) + { + ProblemeAResoudre->NombreDeContraintes += additional_constraints.constraints + .size(); + } } } } diff --git a/src/solver/optimisation/opt_gestion_second_membre_cas_lineaire.cpp b/src/solver/optimisation/opt_gestion_second_membre_cas_lineaire.cpp index c04d416f00..c3d0d16f95 100644 --- a/src/solver/optimisation/opt_gestion_second_membre_cas_lineaire.cpp +++ b/src/solver/optimisation/opt_gestion_second_membre_cas_lineaire.cpp @@ -19,6 +19,8 @@ ** along with Antares_Simulator. If not, see . */ +#include + #include "antares/solver/simulation/sim_structure_probleme_economique.h" double OPT_SommeDesPminThermiques(const PROBLEME_HEBDO*, int, uint); @@ -47,17 +49,32 @@ static void shortTermStorageCumulationRHS( const std::vector<::ShortTermStorage::AREA_INPUT>& shortTermStorageInput, int numberOfAreas, std::vector& SecondMembre, - const CORRESPONDANCES_DES_CONTRAINTES_HEBDOMADAIRES& CorrespondancesDesContraintesHebdomadaires) + const CORRESPONDANCES_DES_CONTRAINTES_HEBDOMADAIRES& CorrespondancesDesContraintesHebdomadaires, + int weekFirstHour) { for (int areaIndex = 0; areaIndex < numberOfAreas; areaIndex++) { for (auto& storage: shortTermStorageInput[areaIndex]) { - for (const auto& constraint: storage.additional_constraints) + for (const auto& additional_constraints: storage.additional_constraints) { - int cnt = CorrespondancesDesContraintesHebdomadaires + for (const auto& constraint: additional_constraints.constraints) + { + const int cnt = CorrespondancesDesContraintesHebdomadaires .ShortTermStorageCumulation[constraint.globalIndex]; - SecondMembre[cnt] = constraint.rhs; + + SecondMembre[cnt] = std::accumulate(constraint.hours.begin(), + constraint.hours.end(), + 0.0, + [weekFirstHour, &additional_constraints + ]( + const double sum, + const int hour) + { + return sum + additional_constraints.rhs[ + weekFirstHour + hour - 1]; + }); + } } } } @@ -395,11 +412,11 @@ void OPT_InitialiserLeSecondMembreDuProblemeLineaire(PROBLEME_HEBDO* problemeHeb } } } - shortTermStorageCumulationRHS(problemeHebdo->ShortTermStorage, problemeHebdo->NombreDePays, ProblemeAResoudre->SecondMembre, - problemeHebdo->CorrespondanceCntNativesCntOptimHebdomadaires); + problemeHebdo->CorrespondanceCntNativesCntOptimHebdomadaires, + weekFirstHour); if (problemeHebdo->OptimisationAvecCoutsDeDemarrage) { OPT_InitialiserLeSecondMembreDuProblemeLineaireCoutsDeDemarrage(problemeHebdo, diff --git a/src/solver/simulation/sim_calcul_economique.cpp b/src/solver/simulation/sim_calcul_economique.cpp index cdecaaa1cd..ace517889e 100644 --- a/src/solver/simulation/sim_calcul_economique.cpp +++ b/src/solver/simulation/sim_calcul_economique.cpp @@ -63,7 +63,7 @@ static void importShortTermStorages( toInsert.additional_constraints = st.additional_constraints; for (auto& additional_constraints: toInsert.additional_constraints) { - for (auto& [_, globalIndex]: additional_constraints.constraints) + for (auto& [_, globalIndex,__]: additional_constraints.constraints) { globalIndex = clusterCumulativeConstraintGlobalIndex; ++clusterCumulativeConstraintGlobalIndex; From 88698d48df1468898ef3d2771a15e79f9cc73801 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Fri, 20 Dec 2024 11:53:55 +0100 Subject: [PATCH 03/42] read new folder --- src/libs/antares/study/area/list.cpp | 10 ++++++---- .../study/parts/short-term-storage/container.cpp | 11 +++++------ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/libs/antares/study/area/list.cpp b/src/libs/antares/study/area/list.cpp index 7af3a6a5a7..868c3d5490 100644 --- a/src/libs/antares/study/area/list.cpp +++ b/src/libs/antares/study/area/list.cpp @@ -1194,12 +1194,14 @@ bool AreaList::loadFromFolder(const StudyLoadOptions& options) if (fs::exists(stsFolder)) { - for (const auto& [id, area]: areas) + for (const auto& area: areas | std::views::values) { - fs::path folder = stsFolder / "clusters" / area->id.c_str(); + fs::path cluster_folder = stsFolder / "clusters" / area->id.c_str(); + ret = area->shortTermStorage.createSTStorageClustersFromIniFile(cluster_folder) && + ret; - ret = area->shortTermStorage.createSTStorageClustersFromIniFile(folder) && ret; - ret = area->shortTermStorage.LoadConstraintsFromIniFile(folder) && ret; + const auto constraints_folder = stsFolder / "constraints" / area->id.c_str(); + ret = area->shortTermStorage.LoadConstraintsFromIniFile(cluster_folder) && ret; } } else diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 5dee3106dc..1e46be0a5f 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -163,12 +163,11 @@ bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) return false; } - auto it = std::find_if(storagesByIndex.begin(), - storagesByIndex.end(), - [&additional_constraints](const STStorageCluster& cluster) - { - return cluster.id == additional_constraints.cluster_id; - }); + auto it = std::ranges::find_if(storagesByIndex, + [&additional_constraints](const STStorageCluster& cluster) + { + return cluster.id == additional_constraints.cluster_id; + }); if (it == storagesByIndex.end()) { logs.warning() << " from file " << pathIni; From ffb6a42788fe56be20d5063f300dd45988de00fe Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Fri, 20 Dec 2024 12:31:16 +0100 Subject: [PATCH 04/42] update outer-inner constraint count --- src/libs/antares/study/area/list.cpp | 2 +- .../parts/short-term-storage/container.cpp | 25 +++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/libs/antares/study/area/list.cpp b/src/libs/antares/study/area/list.cpp index 868c3d5490..153ff7c19b 100644 --- a/src/libs/antares/study/area/list.cpp +++ b/src/libs/antares/study/area/list.cpp @@ -1201,7 +1201,7 @@ bool AreaList::loadFromFolder(const StudyLoadOptions& options) ret; const auto constraints_folder = stsFolder / "constraints" / area->id.c_str(); - ret = area->shortTermStorage.LoadConstraintsFromIniFile(cluster_folder) && ret; + ret = area->shortTermStorage.LoadConstraintsFromIniFile(constraints_folder) && ret; } } else diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 1e46be0a5f..25077864b5 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -149,13 +149,13 @@ bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) ++localIndex; } } - - // try to read the rhs - loadFile(parent_path / ("rhs_" + additional_constraints.name + ".txt"), - additional_constraints.rhs); - fillIfEmpty(additional_constraints.rhs, 0.0); } + // try to read the rhs + loadFile(parent_path / ("rhs_" + additional_constraints.name + ".txt"), + additional_constraints.rhs); + fillIfEmpty(additional_constraints.rhs, 0.0); + if (auto [ok, error_msg] = additional_constraints.validate(); !ok) { logs.error() << "Invalid constraint in section: " << section->name; @@ -229,8 +229,19 @@ std::size_t STStorageInput::cumulativeConstraintCount() const return std::accumulate(storagesByIndex.begin(), storagesByIndex.end(), 0, - [](int acc, const auto& cluster) - { return acc + cluster.additional_constraints.size(); }); + [](size_t outer_constraint_count, const auto& cluster) + { + return outer_constraint_count + std::accumulate( + cluster.additional_constraints.begin(), + cluster.additional_constraints.end(), + 0, + [](size_t inner_constraint_count, + const auto& additional_constraints) + { + return inner_constraint_count + + additional_constraints.constraints.size(); + }); + }); } std::size_t STStorageInput::count() const From de7c893e8ba0748584e89d9e19247d0f21976bae Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Fri, 20 Dec 2024 12:35:30 +0100 Subject: [PATCH 05/42] update unpacked constraints --- .../optimisation/constraints/ShortTermStorageCumulation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp index bf6cf51f94..d72adac1e2 100644 --- a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp +++ b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp @@ -141,10 +141,10 @@ void ShortTermStorageCumulation::add(int pays) for (const auto& [hours, globalIndex, localIndex]: additional_constraints.constraints) { namer.ShortTermStorageCumulation( - constraintHelper->name() + std::to_string(localIndex), + constraintHelper->name(), builder.data.nombreDeContraintes, storage.name, - additional_constraints.name); + additional_constraints.name + std::to_string(localIndex)); const auto index = storage.clusterGlobalIndex; data.CorrespondanceCntNativesCntOptimHebdomadaires .ShortTermStorageCumulation[globalIndex] From 1fcc874ed0790971d226939c83bf8fffca7b5ebb Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Fri, 20 Dec 2024 12:41:08 +0100 Subject: [PATCH 06/42] update name of unpacked constraints --- .../optimisation/constraints/ShortTermStorageCumulation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp index d72adac1e2..82796aabd3 100644 --- a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp +++ b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp @@ -144,7 +144,7 @@ void ShortTermStorageCumulation::add(int pays) constraintHelper->name(), builder.data.nombreDeContraintes, storage.name, - additional_constraints.name + std::to_string(localIndex)); + additional_constraints.name + "_" + std::to_string(localIndex)); const auto index = storage.clusterGlobalIndex; data.CorrespondanceCntNativesCntOptimHebdomadaires .ShortTermStorageCumulation[globalIndex] From be9f17416e2af328d9e4101be5627b8ff6132326 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Fri, 20 Dec 2024 14:38:31 +0100 Subject: [PATCH 07/42] update --- .../study/parts/short-term-storage/container.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 25077864b5..51ef512005 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -143,10 +143,13 @@ bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) int hourVal = std::stoi(hour); hourSet.insert(hourVal); } - // Add this group to the `hours` vec - additional_constraints.constraints.push_back( - {.hours = hourSet, .localIndex = localIndex}); - ++localIndex; + if (!hourSet.empty()) + { + // Add this group to the `hours` vec + additional_constraints.constraints.push_back( + {.hours = hourSet, .localIndex = localIndex}); + ++localIndex; + } } } } From 11169e18aac70a867d289abe7d31330c90dd1abb Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Fri, 20 Dec 2024 15:30:52 +0100 Subject: [PATCH 08/42] add UT --- .../short-term-storage-input-output.cpp | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 265135c7d4..16451dc2e5 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -30,6 +30,7 @@ #include #include "antares/study/parts/short-term-storage/container.h" +#include "antares/study/parts/short-term-storage/AdditionalConstraints.h" using namespace std; using namespace Antares::Data; @@ -451,3 +452,84 @@ BOOST_FIXTURE_TEST_CASE(check_series_save, Fixture) } BOOST_AUTO_TEST_SUITE_END() + +BOOST_AUTO_TEST_SUITE(AdditionalConstraintsTests) + +BOOST_AUTO_TEST_CASE(Validate_ClusterIdEmpty) +{ + ShortTermStorage::AdditionalConstraints constraints; + constraints.cluster_id = ""; // Cluster ID is empty + constraints.variable = "injection"; + constraints.operatorType = "less"; + + auto [ok, error_msg] = constraints.validate(); + BOOST_CHECK_EQUAL(ok, false); + BOOST_CHECK_EQUAL(error_msg, "Cluster ID is empty."); +} + +BOOST_AUTO_TEST_CASE(Validate_InvalidVariable) +{ + ShortTermStorage::AdditionalConstraints constraints; + constraints.cluster_id = "ClusterA"; + constraints.variable = "invalid"; // Invalid variable type + constraints.operatorType = "less"; + + auto [ok, error_msg] = constraints.validate(); + BOOST_CHECK_EQUAL(ok, false); + BOOST_CHECK_EQUAL(error_msg, + "Invalid variable type. Must be 'injection', 'withdrawal', or 'netting'."); +} + +BOOST_AUTO_TEST_CASE(Validate_InvalidOperatorType) +{ + ShortTermStorage::AdditionalConstraints constraints; + constraints.cluster_id = "ClusterA"; + constraints.variable = "injection"; + constraints.operatorType = "invalid"; // Invalid operator type + + auto [ok, error_msg] = constraints.validate(); + BOOST_CHECK_EQUAL(ok, false); + BOOST_CHECK_EQUAL(error_msg, + "Invalid operator type. Must be 'less', 'equal', or 'greater'."); +} + +BOOST_AUTO_TEST_CASE(Validate_InvalidHours) +{ + ShortTermStorage::AdditionalConstraints constraints; + constraints.cluster_id = "ClusterA"; + constraints.variable = "injection"; + constraints.operatorType = "less"; + + ShortTermStorage::SingleAdditionalConstraint constraint; + constraint.hours = {0, 169}; // Invalid hours range (out of 1-168) + constraints.constraints.push_back(constraint); + + auto [ok, error_msg] = constraints.validate(); + BOOST_CHECK_EQUAL(ok, false); + BOOST_CHECK_EQUAL(error_msg, + "Hours sets contains invalid values. Must be between 1 and 168."); +} + +BOOST_AUTO_TEST_CASE(Validate_ValidConstraints) +{ + ShortTermStorage::AdditionalConstraints constraints; + constraints.cluster_id = "ClusterA"; + constraints.variable = "injection"; + constraints.operatorType = "less"; + + ShortTermStorage::SingleAdditionalConstraint constraint1; + constraint1.hours = {1, 2, 3}; // Valid hours + + ShortTermStorage::SingleAdditionalConstraint constraint2; + constraint2.hours = {100, 150, 168}; // Valid hours + + constraints.constraints.push_back(constraint1); + constraints.constraints.push_back(constraint2); + + auto [ok, error_msg] = constraints.validate(); + BOOST_CHECK_EQUAL(ok, true); + BOOST_CHECK(error_msg.empty()); +} + +BOOST_AUTO_TEST_SUITE_END() + From cf2e4bcf51fea52f880138d452f80b8661a181a9 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Fri, 20 Dec 2024 16:09:07 +0100 Subject: [PATCH 09/42] add UT --- .../short-term-storage-input-output.cpp | 253 +++++++++++++++++- 1 file changed, 248 insertions(+), 5 deletions(-) diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 16451dc2e5..c5e74d4d8d 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -29,6 +29,7 @@ #include +#include "antares/antares/constants.h" #include "antares/study/parts/short-term-storage/container.h" #include "antares/study/parts/short-term-storage/AdditionalConstraints.h" @@ -500,14 +501,24 @@ BOOST_AUTO_TEST_CASE(Validate_InvalidHours) constraints.variable = "injection"; constraints.operatorType = "less"; - ShortTermStorage::SingleAdditionalConstraint constraint; - constraint.hours = {0, 169}; // Invalid hours range (out of 1-168) - constraints.constraints.push_back(constraint); + // Case 1: Empty hours + ShortTermStorage::SingleAdditionalConstraint constraint1; + constraint1.hours = {}; // Invalid: empty + constraints.constraints.push_back(constraint1); + + // Case 2: Out of range + ShortTermStorage::SingleAdditionalConstraint constraint2; + constraint2.hours = {120, 169}; // Invalid: out of range + constraints.constraints.push_back(constraint2); + + // Case 3: Below minimum + ShortTermStorage::SingleAdditionalConstraint constraint3; + constraint3.hours = {0, 1}; // Invalid: below minimum + constraints.constraints.push_back(constraint3); auto [ok, error_msg] = constraints.validate(); BOOST_CHECK_EQUAL(ok, false); - BOOST_CHECK_EQUAL(error_msg, - "Hours sets contains invalid values. Must be between 1 and 168."); + BOOST_CHECK_EQUAL(error_msg, "Hours sets contains invalid values. Must be between 1 and 168."); } BOOST_AUTO_TEST_CASE(Validate_ValidConstraints) @@ -531,5 +542,237 @@ BOOST_AUTO_TEST_CASE(Validate_ValidConstraints) BOOST_CHECK(error_msg.empty()); } +BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidFile) +{ + std::filesystem::path testPath = "test_data"; + std::filesystem::create_directory(testPath); + + std::ofstream iniFile(testPath / "additional-constraints.ini"); + iniFile << "[constraint1]\n"; + iniFile << "cluster=cluster1\n"; + iniFile << "variable=injection\n"; + iniFile << "operator=less\n"; + iniFile << "hours=[1,2,3]\n"; + iniFile.close(); + + ShortTermStorage::STStorageInput storageInput; + ShortTermStorage::STStorageCluster cluster; + cluster.id = "cluster1"; + storageInput.storagesByIndex.push_back(cluster); + + bool result = storageInput.LoadConstraintsFromIniFile(testPath); + + BOOST_CHECK_EQUAL(result, true); + BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints.size(), 1); + BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints[0].name, + "constraint1"); + + std::filesystem::remove_all(testPath); +} + +BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_InvalidHours) +{ + std::filesystem::path testPath = "test_data"; + std::filesystem::create_directory(testPath); + + std::ofstream iniFile(testPath / "additional-constraints.ini"); + iniFile << "[constraint1]\n"; + iniFile << "cluster=ClusterA\n"; + iniFile << "variable=injection\n"; + iniFile << "operator=less\n"; + iniFile << "hours=[0,1]\n"; // Invalid hours + iniFile.close(); + + ShortTermStorage::STStorageInput storageInput; + ShortTermStorage::STStorageCluster cluster; + cluster.id = "ClusterA"; + storageInput.storagesByIndex.push_back(cluster); + + bool result = storageInput.LoadConstraintsFromIniFile(testPath); + BOOST_CHECK_EQUAL(result, false); + + std::filesystem::remove_all(testPath); +} + +BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidHoursFormats) +{ + std::filesystem::path testPath = "test_data"; + std::filesystem::create_directory(testPath); + + std::ofstream iniFile(testPath / "additional-constraints.ini"); + iniFile << "[constraint1]\n"; + iniFile << "cluster=cluster1\n"; + iniFile << "variable=injection\n"; + iniFile << "operator=less\n"; + iniFile << "hours=[1],[1],[3,2,1]\n"; // Valid formats + iniFile.close(); + + ShortTermStorage::STStorageInput storageInput; + ShortTermStorage::STStorageCluster cluster; + cluster.id = "cluster1"; + storageInput.storagesByIndex.push_back(cluster); + + bool result = storageInput.LoadConstraintsFromIniFile(testPath); + BOOST_CHECK_EQUAL(result, true); + + std::filesystem::remove_all(testPath); +} + +BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_MissingFile) +{ + ShortTermStorage::STStorageInput storageInput; + bool result = storageInput.LoadConstraintsFromIniFile("nonexistent_path"); + BOOST_CHECK_EQUAL(result, true); +} + +BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_InvalidConstraint) +{ + std::filesystem::path testPath = "test_data"; + std::filesystem::create_directory(testPath); + + std::ofstream iniFile(testPath / "additional-constraints.ini"); + iniFile << "[constraint1]\n"; + iniFile << "cluster=cluster1\n"; + iniFile << "variable=invalid\n"; // Invalid variable + iniFile << "operator=less\n"; + iniFile << "hours=[1,2,3]\n"; + iniFile.close(); + + ShortTermStorage::STStorageInput storageInput; + ShortTermStorage::STStorageCluster cluster; + cluster.id = "cluster1"; + storageInput.storagesByIndex.push_back(cluster); + + bool result = storageInput.LoadConstraintsFromIniFile(testPath); + BOOST_CHECK_EQUAL(result, false); + + std::filesystem::remove_all(testPath); +} + +BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidRhs) +{ + std::filesystem::path testPath = "test_data"; + std::filesystem::create_directory(testPath); + + std::ofstream iniFile(testPath / "additional-constraints.ini"); + iniFile << "[constraint1]\n"; + iniFile << "cluster=cluster1\n"; + iniFile << "variable=injection\n"; + iniFile << "operator=less\n"; + iniFile << "hours=[1,2,3]\n"; + iniFile.close(); + + std::ofstream rhsFile(testPath / "rhs_constraint1.txt"); + for (int i = 0; i < HOURS_PER_YEAR; ++i) + { + rhsFile << i * 1.0 << "\n"; + } + rhsFile.close(); + + ShortTermStorage::STStorageInput storageInput; + ShortTermStorage::STStorageCluster cluster; + cluster.id = "cluster1"; + storageInput.storagesByIndex.push_back(cluster); + + bool result = storageInput.LoadConstraintsFromIniFile(testPath); + + BOOST_CHECK_EQUAL(result, true); + BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints[0].rhs.size(), + HOURS_PER_YEAR); + BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints[0].rhs[0], 0.0); + BOOST_CHECK_EQUAL( + storageInput.storagesByIndex[0].additional_constraints[0].rhs[HOURS_PER_YEAR - 1], + HOURS_PER_YEAR - 1); + + std::filesystem::remove_all(testPath); +} + +BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_MissingRhsFile) +{ + std::filesystem::path testPath = "test_data"; + std::filesystem::create_directory(testPath); + + std::ofstream iniFile(testPath / "additional-constraints.ini"); + iniFile << "[constraint1]\n"; + iniFile << "cluster=cluster1\n"; + iniFile << "variable=injection\n"; + iniFile << "operator=less\n"; + iniFile << "hours=[1,2,3]\n"; + iniFile.close(); + + ShortTermStorage::STStorageInput storageInput; + ShortTermStorage::STStorageCluster cluster; + cluster.id = "cluster1"; + storageInput.storagesByIndex.push_back(cluster); + + bool result = storageInput.LoadConstraintsFromIniFile(testPath); + + BOOST_CHECK_EQUAL(result, true); + BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints[0].rhs.size(), + HOURS_PER_YEAR); + BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints[0].rhs[0], 0.0); + + std::filesystem::remove_all(testPath); +} + +BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_MalformedRhsFile) +{ + std::filesystem::path testPath = "test_data"; + std::filesystem::create_directory(testPath); + + std::ofstream iniFile(testPath / "additional-constraints.ini"); + iniFile << "[constraint1]\n"; + iniFile << "cluster=ClusterA\n"; + iniFile << "variable=injection\n"; + iniFile << "operator=less\n"; + iniFile << "hours=[1,2,3]\n"; + iniFile.close(); + + std::ofstream rhsFile(testPath / "rhs_constraint1.txt"); + rhsFile << "1.0\n2.0\ninvalid\n4.0\n"; // Malformed line + rhsFile.close(); + + ShortTermStorage::STStorageInput storageInput; + ShortTermStorage::STStorageCluster cluster; + cluster.id = "ClusterA"; + storageInput.storagesByIndex.push_back(cluster); + + bool result = storageInput.LoadConstraintsFromIniFile(testPath); + BOOST_CHECK_EQUAL(result, false); + + std::filesystem::remove_all(testPath); +} + +BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_IncompleteRhsFile) +{ + std::filesystem::path testPath = "test_data"; + std::filesystem::create_directory(testPath); + + std::ofstream iniFile(testPath / "additional-constraints.ini"); + iniFile << "[constraint1]\n"; + iniFile << "cluster=ClusterA\n"; + iniFile << "variable=injection\n"; + iniFile << "operator=less\n"; + iniFile << "hours=[1,2,3]\n"; + iniFile.close(); + + std::ofstream rhsFile(testPath / "rhs_constraint1.txt"); + for (int i = 0; i < 10; ++i) + { + rhsFile << i * 1.0 << "\n"; + } + rhsFile.close(); + + ShortTermStorage::STStorageInput storageInput; + ShortTermStorage::STStorageCluster cluster; + cluster.id = "ClusterA"; + storageInput.storagesByIndex.push_back(cluster); + + bool result = storageInput.LoadConstraintsFromIniFile(testPath); + BOOST_CHECK_EQUAL(result, false); + + std::filesystem::remove_all(testPath); +} + BOOST_AUTO_TEST_SUITE_END() From c0b684eb1e029eea02ad662e9fb6610a78c3e677 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Fri, 20 Dec 2024 16:16:10 +0100 Subject: [PATCH 10/42] use tmp dir as test dir --- .../short-term-storage-input-output.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index c5e74d4d8d..3f50330597 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -544,7 +544,7 @@ BOOST_AUTO_TEST_CASE(Validate_ValidConstraints) BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidFile) { - std::filesystem::path testPath = "test_data"; + std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); std::ofstream iniFile(testPath / "additional-constraints.ini"); @@ -572,7 +572,7 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidFile) BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_InvalidHours) { - std::filesystem::path testPath = "test_data"; + std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); std::ofstream iniFile(testPath / "additional-constraints.ini"); @@ -596,7 +596,7 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_InvalidHours) BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidHoursFormats) { - std::filesystem::path testPath = "test_data"; + std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); std::ofstream iniFile(testPath / "additional-constraints.ini"); @@ -627,7 +627,7 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_MissingFile) BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_InvalidConstraint) { - std::filesystem::path testPath = "test_data"; + std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); std::ofstream iniFile(testPath / "additional-constraints.ini"); @@ -651,7 +651,7 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_InvalidConstraint) BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidRhs) { - std::filesystem::path testPath = "test_data"; + std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); std::ofstream iniFile(testPath / "additional-constraints.ini"); @@ -689,7 +689,7 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidRhs) BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_MissingRhsFile) { - std::filesystem::path testPath = "test_data"; + std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); std::ofstream iniFile(testPath / "additional-constraints.ini"); @@ -717,7 +717,7 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_MissingRhsFile) BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_MalformedRhsFile) { - std::filesystem::path testPath = "test_data"; + std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); std::ofstream iniFile(testPath / "additional-constraints.ini"); @@ -745,7 +745,7 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_MalformedRhsFile) BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_IncompleteRhsFile) { - std::filesystem::path testPath = "test_data"; + std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); std::ofstream iniFile(testPath / "additional-constraints.ini"); From d2b66c9cf2df9904de75bcb85bd0ccc91ec320ea Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Fri, 20 Dec 2024 16:47:16 +0100 Subject: [PATCH 11/42] add test --- .../short-term-storage-input-output.cpp | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 3f50330597..72dd788ffa 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -26,6 +26,7 @@ #include #include +#include #include @@ -774,5 +775,31 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_IncompleteRhsFile) std::filesystem::remove_all(testPath); } +// Test data for parameterization +namespace bdata = boost::unit_test::data; + +BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinations, + bdata::make({"injection", "withdrawal", "netting"}) ^ + bdata::make({"less", "equal", "greater"}), + variable, + op) +{ + ShortTermStorage::AdditionalConstraints constraints; + constraints.cluster_id = "ClusterA"; + constraints.variable = variable; + constraints.operatorType = op; + + // Create constraints with valid hours + constraints.constraints.push_back(ShortTermStorage::SingleAdditionalConstraint{{1, 2, 3}}); + constraints.constraints.push_back(ShortTermStorage::SingleAdditionalConstraint{{50, 100, 150}}); + constraints.constraints. + push_back(ShortTermStorage::SingleAdditionalConstraint{{120, 121, 122}}); + + // Validate the constraints + auto [ok, error_msg] = constraints.validate(); + BOOST_CHECK_EQUAL(ok, true); + BOOST_CHECK(error_msg.empty()); +} + BOOST_AUTO_TEST_SUITE_END() From 8e7cab040a0123b544215287fa069d5d8c045573 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Mon, 23 Dec 2024 15:27:01 +0100 Subject: [PATCH 12/42] UPDATE --- .../short-term-storage-input-output.cpp | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 72dd788ffa..1c11464a77 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -688,6 +689,72 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidRhs) std::filesystem::remove_all(testPath); } +BOOST_AUTO_TEST_CASE(Load2ConstraintsFromIniFile) +{ + std::filesystem::path testPath = getFolder() / "test_data"; + std::filesystem::create_directory(testPath); + + std::ofstream iniFile(testPath / "additional-constraints.ini"); + iniFile << R"([constraint1] + cluster=cluster1 + variable=injection + operator=less + hours=[1,2,3] + [constraint2] + cluster=cluster1 + variable=withdrawal + operator=greater + hours=[5,33])"; + iniFile.close(); + + std::ofstream rhsFile(testPath / "rhs_constraint1.txt"); + for (int i = 0; i < HOURS_PER_YEAR; ++i) + { + rhsFile << i * 1.0 << "\n"; + } + rhsFile.close(); + + ShortTermStorage::STStorageInput storageInput; + ShortTermStorage::STStorageCluster cluster; + cluster.id = "cluster1"; + storageInput.storagesByIndex.push_back(cluster); + + bool result = storageInput.LoadConstraintsFromIniFile(testPath); + + BOOST_CHECK_EQUAL(result, true); + BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints.size(), 2); + + //------- constraint1 ---------- + const auto& constraint1 = storageInput.storagesByIndex[0].additional_constraints[0]; + BOOST_CHECK_EQUAL(constraint1.name, "constraint1"); + BOOST_CHECK_EQUAL(constraint1.operatorType, "less"); + BOOST_CHECK_EQUAL(constraint1.variable, "injection"); + BOOST_CHECK_EQUAL(constraint1.cluster_id, cluster.id); + BOOST_CHECK_EQUAL(constraint1.rhs.size(), + HOURS_PER_YEAR); + BOOST_CHECK_EQUAL(constraint1.rhs[0], 0.0); + BOOST_CHECK_EQUAL( + constraint1.rhs[HOURS_PER_YEAR - 1], + HOURS_PER_YEAR - 1); + + //------- constraint2 ---------- + + const auto& constraint2 = storageInput.storagesByIndex[0].additional_constraints[1]; + BOOST_CHECK_EQUAL(constraint2.name, "constraint2"); + BOOST_CHECK_EQUAL(constraint2.operatorType, "greater"); + BOOST_CHECK_EQUAL(constraint2.variable, "withdrawal"); + BOOST_CHECK_EQUAL(constraint2.cluster_id, cluster.id); + + BOOST_CHECK_EQUAL(constraint2.rhs.size(), + HOURS_PER_YEAR); + BOOST_CHECK_EQUAL(constraint2.rhs[0], 0.0); + BOOST_CHECK_EQUAL( + constraint1.rhs[HOURS_PER_YEAR - 1], + 0.0); + + std::filesystem::remove_all(testPath); +} + BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_MissingRhsFile) { std::filesystem::path testPath = getFolder() / "test_data"; @@ -801,5 +868,65 @@ BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinations, BOOST_CHECK(error_msg.empty()); } + +BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinationsFromFile, + bdata::make({"injection", "withdrawal", "netting"}) ^ + bdata::make({"less", "equal", "greater"}), + variable, + op) +{ + // Define the path for the test data + std::filesystem::path testPath = std::filesystem::temp_directory_path() / "test_data"; + std::filesystem::create_directory(testPath); + + // Write the `.ini` file for this test case + std::ofstream iniFile(testPath / "additional-constraints.ini"); + iniFile << "[constraint1]\n"; + iniFile << "cluster=clustera\n"; + iniFile << "variable=" << variable << "\n"; + iniFile << "operator=" << op << "\n"; + iniFile << "hours=[1,2,3]\n"; + iniFile.close(); + + // Write the `rhs_constraint1.txt` file + std::ofstream rhsFile(testPath / "rhs_constraint1.txt"); + for (int i = 0; i < HOURS_PER_YEAR; ++i) + { + rhsFile << i * 1.0 << "\n"; + } + rhsFile.close(); + + // Setup storage input and cluster + ShortTermStorage::STStorageInput storageInput; + ShortTermStorage::STStorageCluster cluster; + cluster.id = "clustera"; + storageInput.storagesByIndex.push_back(cluster); + + // Load constraints from the `.ini` file + bool result = storageInput.LoadConstraintsFromIniFile(testPath); + + // Assertions + BOOST_CHECK_EQUAL(result, true); + + // Validate loaded constraints + auto& built_cluster = storageInput.storagesByIndex[0]; + BOOST_REQUIRE_EQUAL(built_cluster.additional_constraints.size(), 1); + const auto& loadedConstraint = built_cluster.additional_constraints[0]; + + // Check variable, operator type, and rhs values + BOOST_CHECK_EQUAL(loadedConstraint.variable, variable); + BOOST_CHECK_EQUAL(loadedConstraint.operatorType, op); + BOOST_REQUIRE_EQUAL(loadedConstraint.rhs.size(), HOURS_PER_YEAR); + + int i = 0; + do + { + BOOST_CHECK_CLOSE(loadedConstraint.rhs[i], i * 1.0, 0.001); + // Check rhs values within a tolerance + + i += HOURS_PER_YEAR / 5; + } while (i < HOURS_PER_YEAR); +} + BOOST_AUTO_TEST_SUITE_END() From 8ca3d6941ea50952cf25a850905adb6b77f94b17 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Mon, 23 Dec 2024 16:12:12 +0100 Subject: [PATCH 13/42] update tests --- .../short-term-storage-input-output.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 1c11464a77..c09065f510 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -749,7 +749,7 @@ BOOST_AUTO_TEST_CASE(Load2ConstraintsFromIniFile) HOURS_PER_YEAR); BOOST_CHECK_EQUAL(constraint2.rhs[0], 0.0); BOOST_CHECK_EQUAL( - constraint1.rhs[HOURS_PER_YEAR - 1], + constraint2.rhs[HOURS_PER_YEAR - 1], 0.0); std::filesystem::remove_all(testPath); From 4c84485d04bac64ce7b4be3ccf1fb09bd24ffdd3 Mon Sep 17 00:00:00 2001 From: Vincent Payet Date: Tue, 31 Dec 2024 11:26:43 +0100 Subject: [PATCH 14/42] format --- src/libs/antares/study/area/list.cpp | 4 +- .../AdditionalConstraints.h | 2 +- .../AdditionalConstraints.cpp | 11 ++--- .../parts/short-term-storage/container.cpp | 36 ++++++++-------- .../study/parts/short-term-storage/series.cpp | 2 +- .../ShortTermStorageCumulation.cpp | 16 ++++---- .../opt_decompte_variables_et_contraintes.cpp | 2 +- ...opt_gestion_second_membre_cas_lineaire.cpp | 21 ++++------ .../simulation/sim_calcul_economique.cpp | 2 +- .../short-term-storage-input-output.cpp | 41 ++++++++----------- 10 files changed, 58 insertions(+), 79 deletions(-) diff --git a/src/libs/antares/study/area/list.cpp b/src/libs/antares/study/area/list.cpp index 153ff7c19b..eee3eff996 100644 --- a/src/libs/antares/study/area/list.cpp +++ b/src/libs/antares/study/area/list.cpp @@ -1197,8 +1197,8 @@ bool AreaList::loadFromFolder(const StudyLoadOptions& options) for (const auto& area: areas | std::views::values) { fs::path cluster_folder = stsFolder / "clusters" / area->id.c_str(); - ret = area->shortTermStorage.createSTStorageClustersFromIniFile(cluster_folder) && - ret; + ret = area->shortTermStorage.createSTStorageClustersFromIniFile(cluster_folder) + && ret; const auto constraints_folder = stsFolder / "constraints" / area->id.c_str(); ret = area->shortTermStorage.LoadConstraintsFromIniFile(constraints_folder) && ret; diff --git a/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h b/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h index 7e27c9a60f..3a1b5f20f8 100644 --- a/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h +++ b/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h @@ -42,7 +42,7 @@ struct AdditionalConstraints std::string variable; std::string operatorType; // TODO a lot unused entries - //std::array rhs = {}; + // std::array rhs = {}; std::vector rhs = {}; std::vector constraints = {}; diff --git a/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp b/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp index 8775ffe561..c16b35bef2 100644 --- a/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp +++ b/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp @@ -19,6 +19,7 @@ ** along with Antares_Simulator. If not, see . */ #include "antares/study/parts/short-term-storage/AdditionalConstraints.h" + #include namespace Antares::Data::ShortTermStorage @@ -47,12 +48,11 @@ AdditionalConstraints::ValidateResult AdditionalConstraints::validate() const return {true, ""}; } + bool SingleAdditionalConstraint::isValidHoursRange() const { // `hours` is a sorted set; begin() gives the smallest and prev(end()) gives the largest. - return !hours.empty() && *hours.begin() - >= 1 && *std::prev( - hours.end()) <= 168; + return !hours.empty() && *hours.begin() >= 1 && *std::prev(hours.end()) <= 168; } bool AdditionalConstraints::isValidHours() const @@ -60,12 +60,9 @@ bool AdditionalConstraints::isValidHours() const return std::ranges::all_of(constraints.begin(), constraints.end(), [](const auto& constraint) - { - return constraint.isValidHoursRange(); - }); + { return constraint.isValidHoursRange(); }); } - bool AdditionalConstraints::isValidVariable() const { return variable == "injection" || variable == "withdrawal" || variable == "netting"; diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 51ef512005..91ae9a93fc 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -147,7 +147,7 @@ bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) { // Add this group to the `hours` vec additional_constraints.constraints.push_back( - {.hours = hourSet, .localIndex = localIndex}); + {.hours = hourSet, .localIndex = localIndex}); ++localIndex; } } @@ -168,9 +168,7 @@ bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) auto it = std::ranges::find_if(storagesByIndex, [&additional_constraints](const STStorageCluster& cluster) - { - return cluster.id == additional_constraints.cluster_id; - }); + { return cluster.id == additional_constraints.cluster_id; }); if (it == storagesByIndex.end()) { logs.warning() << " from file " << pathIni; @@ -229,22 +227,20 @@ bool STStorageInput::saveDataSeriesToFolder(const std::string& folder) const std::size_t STStorageInput::cumulativeConstraintCount() const { - return std::accumulate(storagesByIndex.begin(), - storagesByIndex.end(), - 0, - [](size_t outer_constraint_count, const auto& cluster) - { - return outer_constraint_count + std::accumulate( - cluster.additional_constraints.begin(), - cluster.additional_constraints.end(), - 0, - [](size_t inner_constraint_count, - const auto& additional_constraints) - { - return inner_constraint_count + - additional_constraints.constraints.size(); - }); - }); + return std::accumulate( + storagesByIndex.begin(), + storagesByIndex.end(), + 0, + [](size_t outer_constraint_count, const auto& cluster) + { + return outer_constraint_count + + std::accumulate( + cluster.additional_constraints.begin(), + cluster.additional_constraints.end(), + 0, + [](size_t inner_constraint_count, const auto& additional_constraints) + { return inner_constraint_count + additional_constraints.constraints.size(); }); + }); } std::size_t STStorageInput::count() const diff --git a/src/libs/antares/study/parts/short-term-storage/series.cpp b/src/libs/antares/study/parts/short-term-storage/series.cpp index 4ee93d8a73..a8694e967b 100644 --- a/src/libs/antares/study/parts/short-term-storage/series.cpp +++ b/src/libs/antares/study/parts/short-term-storage/series.cpp @@ -113,7 +113,7 @@ void fillIfEmpty(std::vector& v, double value) { v.resize(HOURS_PER_YEAR, value); } -}; +} void Series::fillDefaultSeriesIfEmpty() { diff --git a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp index 82796aabd3..a6aafb6cda 100644 --- a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp +++ b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp @@ -137,18 +137,18 @@ void ShortTermStorageCumulation::add(int pays) // var = withdrawal for WithdrawalCumulationConstraint // var = injectionEfficiency * injection - withdrawalEfficiency * withdrawal for Netting auto constraintHelper = cumulationConstraintFromVariable( - additional_constraints.variable); + additional_constraints.variable); for (const auto& [hours, globalIndex, localIndex]: additional_constraints.constraints) { - namer.ShortTermStorageCumulation( - constraintHelper->name(), - builder.data.nombreDeContraintes, - storage.name, - additional_constraints.name + "_" + std::to_string(localIndex)); + namer.ShortTermStorageCumulation(constraintHelper->name(), + builder.data.nombreDeContraintes, + storage.name, + additional_constraints.name + "_" + + std::to_string(localIndex)); const auto index = storage.clusterGlobalIndex; data.CorrespondanceCntNativesCntOptimHebdomadaires - .ShortTermStorageCumulation[globalIndex] - = builder.data.nombreDeContraintes; + .ShortTermStorageCumulation[globalIndex] + = builder.data.nombreDeContraintes; for (const auto& hour: hours) { diff --git a/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp b/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp index 7de6203d69..239797bbf6 100644 --- a/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp +++ b/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp @@ -250,7 +250,7 @@ int OPT_DecompteDesVariablesEtDesContraintesDuProblemeAOptimiser(PROBLEME_HEBDO* for (const auto& additional_constraints: storage.additional_constraints) { ProblemeAResoudre->NombreDeContraintes += additional_constraints.constraints - .size(); + .size(); } } } diff --git a/src/solver/optimisation/opt_gestion_second_membre_cas_lineaire.cpp b/src/solver/optimisation/opt_gestion_second_membre_cas_lineaire.cpp index c3d0d16f95..adbccd8f3d 100644 --- a/src/solver/optimisation/opt_gestion_second_membre_cas_lineaire.cpp +++ b/src/solver/optimisation/opt_gestion_second_membre_cas_lineaire.cpp @@ -61,19 +61,14 @@ static void shortTermStorageCumulationRHS( for (const auto& constraint: additional_constraints.constraints) { const int cnt = CorrespondancesDesContraintesHebdomadaires - .ShortTermStorageCumulation[constraint.globalIndex]; - - SecondMembre[cnt] = std::accumulate(constraint.hours.begin(), - constraint.hours.end(), - 0.0, - [weekFirstHour, &additional_constraints - ]( - const double sum, - const int hour) - { - return sum + additional_constraints.rhs[ - weekFirstHour + hour - 1]; - }); + .ShortTermStorageCumulation[constraint.globalIndex]; + + SecondMembre[cnt] = std::accumulate( + constraint.hours.begin(), + constraint.hours.end(), + 0.0, + [weekFirstHour, &additional_constraints](const double sum, const int hour) + { return sum + additional_constraints.rhs[weekFirstHour + hour - 1]; }); } } } diff --git a/src/solver/simulation/sim_calcul_economique.cpp b/src/solver/simulation/sim_calcul_economique.cpp index ace517889e..156a638cec 100644 --- a/src/solver/simulation/sim_calcul_economique.cpp +++ b/src/solver/simulation/sim_calcul_economique.cpp @@ -63,7 +63,7 @@ static void importShortTermStorages( toInsert.additional_constraints = st.additional_constraints; for (auto& additional_constraints: toInsert.additional_constraints) { - for (auto& [_, globalIndex,__]: additional_constraints.constraints) + for (auto& [_, globalIndex, __]: additional_constraints.constraints) { globalIndex = clusterCumulativeConstraintGlobalIndex; ++clusterCumulativeConstraintGlobalIndex; diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index c09065f510..9c86e0b972 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -22,18 +22,18 @@ #define WIN32_LEAN_AND_MEAN +#include #include #include -#include -#include #include +#include #include #include "antares/antares/constants.h" -#include "antares/study/parts/short-term-storage/container.h" #include "antares/study/parts/short-term-storage/AdditionalConstraints.h" +#include "antares/study/parts/short-term-storage/container.h" using namespace std; using namespace Antares::Data; @@ -492,8 +492,7 @@ BOOST_AUTO_TEST_CASE(Validate_InvalidOperatorType) auto [ok, error_msg] = constraints.validate(); BOOST_CHECK_EQUAL(ok, false); - BOOST_CHECK_EQUAL(error_msg, - "Invalid operator type. Must be 'less', 'equal', or 'greater'."); + BOOST_CHECK_EQUAL(error_msg, "Invalid operator type. Must be 'less', 'equal', or 'greater'."); } BOOST_AUTO_TEST_CASE(Validate_InvalidHours) @@ -683,8 +682,8 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidRhs) HOURS_PER_YEAR); BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints[0].rhs[0], 0.0); BOOST_CHECK_EQUAL( - storageInput.storagesByIndex[0].additional_constraints[0].rhs[HOURS_PER_YEAR - 1], - HOURS_PER_YEAR - 1); + storageInput.storagesByIndex[0].additional_constraints[0].rhs[HOURS_PER_YEAR - 1], + HOURS_PER_YEAR - 1); std::filesystem::remove_all(testPath); } @@ -730,12 +729,9 @@ BOOST_AUTO_TEST_CASE(Load2ConstraintsFromIniFile) BOOST_CHECK_EQUAL(constraint1.operatorType, "less"); BOOST_CHECK_EQUAL(constraint1.variable, "injection"); BOOST_CHECK_EQUAL(constraint1.cluster_id, cluster.id); - BOOST_CHECK_EQUAL(constraint1.rhs.size(), - HOURS_PER_YEAR); + BOOST_CHECK_EQUAL(constraint1.rhs.size(), HOURS_PER_YEAR); BOOST_CHECK_EQUAL(constraint1.rhs[0], 0.0); - BOOST_CHECK_EQUAL( - constraint1.rhs[HOURS_PER_YEAR - 1], - HOURS_PER_YEAR - 1); + BOOST_CHECK_EQUAL(constraint1.rhs[HOURS_PER_YEAR - 1], HOURS_PER_YEAR - 1); //------- constraint2 ---------- @@ -745,12 +741,9 @@ BOOST_AUTO_TEST_CASE(Load2ConstraintsFromIniFile) BOOST_CHECK_EQUAL(constraint2.variable, "withdrawal"); BOOST_CHECK_EQUAL(constraint2.cluster_id, cluster.id); - BOOST_CHECK_EQUAL(constraint2.rhs.size(), - HOURS_PER_YEAR); + BOOST_CHECK_EQUAL(constraint2.rhs.size(), HOURS_PER_YEAR); BOOST_CHECK_EQUAL(constraint2.rhs[0], 0.0); - BOOST_CHECK_EQUAL( - constraint2.rhs[HOURS_PER_YEAR - 1], - 0.0); + BOOST_CHECK_EQUAL(constraint2.rhs[HOURS_PER_YEAR - 1], 0.0); std::filesystem::remove_all(testPath); } @@ -846,8 +839,8 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_IncompleteRhsFile) namespace bdata = boost::unit_test::data; BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinations, - bdata::make({"injection", "withdrawal", "netting"}) ^ - bdata::make({"less", "equal", "greater"}), + bdata::make({"injection", "withdrawal", "netting"}) + ^ bdata::make({"less", "equal", "greater"}), variable, op) { @@ -859,8 +852,8 @@ BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinations, // Create constraints with valid hours constraints.constraints.push_back(ShortTermStorage::SingleAdditionalConstraint{{1, 2, 3}}); constraints.constraints.push_back(ShortTermStorage::SingleAdditionalConstraint{{50, 100, 150}}); - constraints.constraints. - push_back(ShortTermStorage::SingleAdditionalConstraint{{120, 121, 122}}); + constraints.constraints.push_back( + ShortTermStorage::SingleAdditionalConstraint{{120, 121, 122}}); // Validate the constraints auto [ok, error_msg] = constraints.validate(); @@ -868,10 +861,9 @@ BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinations, BOOST_CHECK(error_msg.empty()); } - BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinationsFromFile, - bdata::make({"injection", "withdrawal", "netting"}) ^ - bdata::make({"less", "equal", "greater"}), + bdata::make({"injection", "withdrawal", "netting"}) + ^ bdata::make({"less", "equal", "greater"}), variable, op) { @@ -929,4 +921,3 @@ BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinationsFromFile, } BOOST_AUTO_TEST_SUITE_END() - From ebd266429927f62db9cc374611ae59311440f062 Mon Sep 17 00:00:00 2001 From: Vincent Payet Date: Tue, 31 Dec 2024 12:23:36 +0100 Subject: [PATCH 15/42] Add function loadHours --- .../AdditionalConstraints.h | 4 +- .../parts/short-term-storage/container.cpp | 83 ++++++++++--------- 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h b/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h index 3a1b5f20f8..de800f5ac0 100644 --- a/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h +++ b/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h @@ -43,9 +43,9 @@ struct AdditionalConstraints std::string operatorType; // TODO a lot unused entries // std::array rhs = {}; - std::vector rhs = {}; + std::vector rhs; - std::vector constraints = {}; + std::vector constraints; struct ValidateResult { diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 91ae9a93fc..fc6623bf29 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -19,8 +19,6 @@ ** along with Antares_Simulator. If not, see . */ -#include "antares/study/parts/short-term-storage/container.h" - #include #include #include @@ -30,6 +28,7 @@ #include #include +#include "antares/study/parts/short-term-storage/container.h" #define SEP Yuni::IO::Separator @@ -76,6 +75,46 @@ bool STStorageInput::createSTStorageClustersFromIniFile(const fs::path& path) return true; } +static void loadHours(const std::string& hoursStr, AdditionalConstraints& additional_constraints) +{ + // + // std::stringstream ss(value.c_str()); + // std::string hour; + // while (std::getline(ss, hour, ',')) + // { + // int hourVal = std::stoi(hour); + // constraint.hours.insert(hourVal); + // } + + // Split the `hours` field into multiple groups + std::regex groupRegex(R"(\[(.*?)\])"); + // Match each group enclosed in square brackets + auto groupsBegin = std::sregex_iterator(hoursStr.begin(), hoursStr.end(), groupRegex); + auto groupsEnd = std::sregex_iterator(); + unsigned int localIndex = 0; + for (auto it = groupsBegin; it != groupsEnd; ++it) + { + // Extract the contents of the square brackets + std::string group = (*it)[1].str(); + std::stringstream ss(group); + std::string hour; + std::set hourSet; + + while (std::getline(ss, hour, ',')) + { + int hourVal = std::stoi(hour); + hourSet.insert(hourVal); + } + if (!hourSet.empty()) + { + // Add this group to the `hours` vec + additional_constraints.constraints.push_back( + {.hours = hourSet, .localIndex = localIndex}); + ++localIndex; + } + } +} + bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) { IniFile ini; @@ -112,45 +151,7 @@ bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) } else if (key == "hours") { - // - // std::stringstream ss(value.c_str()); - // std::string hour; - // while (std::getline(ss, hour, ',')) - // { - // int hourVal = std::stoi(hour); - // constraint.hours.insert(hourVal); - // } - - // Split the `hours` field into multiple groups - std::string hoursStr = value.c_str(); - std::regex groupRegex(R"(\[(.*?)\])"); - // Match each group enclosed in square brackets - auto groupsBegin = std::sregex_iterator(hoursStr.begin(), - hoursStr.end(), - groupRegex); - auto groupsEnd = std::sregex_iterator(); - unsigned int localIndex = 0; - for (auto it = groupsBegin; it != groupsEnd; ++it) - { - // Extract the contents of the square brackets - std::string group = (*it)[1].str(); - std::stringstream ss(group); - std::string hour; - std::set hourSet; - - while (std::getline(ss, hour, ',')) - { - int hourVal = std::stoi(hour); - hourSet.insert(hourVal); - } - if (!hourSet.empty()) - { - // Add this group to the `hours` vec - additional_constraints.constraints.push_back( - {.hours = hourSet, .localIndex = localIndex}); - ++localIndex; - } - } + loadHours(value.c_str(), additional_constraints); } } From 480c30fa21da4da4d050591829a0e10d8e3f9b3c Mon Sep 17 00:00:00 2001 From: Vincent Payet Date: Tue, 31 Dec 2024 12:27:37 +0100 Subject: [PATCH 16/42] rename loadconstrintfrominifile --- src/libs/antares/study/area/list.cpp | 2 +- .../parts/short-term-storage/container.h | 2 +- .../parts/short-term-storage/container.cpp | 2 +- .../short-term-storage-input-output.cpp | 40 +++++++++---------- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/libs/antares/study/area/list.cpp b/src/libs/antares/study/area/list.cpp index eee3eff996..c91ecc1e38 100644 --- a/src/libs/antares/study/area/list.cpp +++ b/src/libs/antares/study/area/list.cpp @@ -1201,7 +1201,7 @@ bool AreaList::loadFromFolder(const StudyLoadOptions& options) && ret; const auto constraints_folder = stsFolder / "constraints" / area->id.c_str(); - ret = area->shortTermStorage.LoadConstraintsFromIniFile(constraints_folder) && ret; + ret = area->shortTermStorage.loadAdditionalConstraints(constraints_folder) && ret; } } else diff --git a/src/libs/antares/study/include/antares/study/parts/short-term-storage/container.h b/src/libs/antares/study/include/antares/study/parts/short-term-storage/container.h index 65dc8145bc..b53abc48f0 100644 --- a/src/libs/antares/study/include/antares/study/parts/short-term-storage/container.h +++ b/src/libs/antares/study/include/antares/study/parts/short-term-storage/container.h @@ -41,7 +41,7 @@ class STStorageInput /// Number of enabled ST storages, ignoring disabled ST storages std::size_t count() const; - bool LoadConstraintsFromIniFile(const std::filesystem::path& filePath); + bool loadAdditionalConstraints(const std::filesystem::path& filePath); /// erase disabled cluster from the vector uint removeDisabledClusters(); diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index fc6623bf29..67ad445efd 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -115,7 +115,7 @@ static void loadHours(const std::string& hoursStr, AdditionalConstraints& additi } } -bool STStorageInput::LoadConstraintsFromIniFile(const fs::path& parent_path) +bool STStorageInput::loadAdditionalConstraints(const fs::path& parent_path) { IniFile ini; const auto pathIni = parent_path / "additional-constraints.ini"; diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 9c86e0b972..0de38df1ab 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -543,7 +543,7 @@ BOOST_AUTO_TEST_CASE(Validate_ValidConstraints) BOOST_CHECK(error_msg.empty()); } -BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidFile) +BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_ValidFile) { std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); @@ -561,7 +561,7 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidFile) cluster.id = "cluster1"; storageInput.storagesByIndex.push_back(cluster); - bool result = storageInput.LoadConstraintsFromIniFile(testPath); + bool result = storageInput.loadAdditionalConstraints(testPath); BOOST_CHECK_EQUAL(result, true); BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints.size(), 1); @@ -571,7 +571,7 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidFile) std::filesystem::remove_all(testPath); } -BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_InvalidHours) +BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_InvalidHours) { std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); @@ -589,13 +589,13 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_InvalidHours) cluster.id = "ClusterA"; storageInput.storagesByIndex.push_back(cluster); - bool result = storageInput.LoadConstraintsFromIniFile(testPath); + bool result = storageInput.loadAdditionalConstraints(testPath); BOOST_CHECK_EQUAL(result, false); std::filesystem::remove_all(testPath); } -BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidHoursFormats) +BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_ValidHoursFormats) { std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); @@ -613,20 +613,20 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidHoursFormats) cluster.id = "cluster1"; storageInput.storagesByIndex.push_back(cluster); - bool result = storageInput.LoadConstraintsFromIniFile(testPath); + bool result = storageInput.loadAdditionalConstraints(testPath); BOOST_CHECK_EQUAL(result, true); std::filesystem::remove_all(testPath); } -BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_MissingFile) +BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_MissingFile) { ShortTermStorage::STStorageInput storageInput; - bool result = storageInput.LoadConstraintsFromIniFile("nonexistent_path"); + bool result = storageInput.loadAdditionalConstraints("nonexistent_path"); BOOST_CHECK_EQUAL(result, true); } -BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_InvalidConstraint) +BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_InvalidConstraint) { std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); @@ -644,13 +644,13 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_InvalidConstraint) cluster.id = "cluster1"; storageInput.storagesByIndex.push_back(cluster); - bool result = storageInput.LoadConstraintsFromIniFile(testPath); + bool result = storageInput.loadAdditionalConstraints(testPath); BOOST_CHECK_EQUAL(result, false); std::filesystem::remove_all(testPath); } -BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidRhs) +BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_ValidRhs) { std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); @@ -675,7 +675,7 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_ValidRhs) cluster.id = "cluster1"; storageInput.storagesByIndex.push_back(cluster); - bool result = storageInput.LoadConstraintsFromIniFile(testPath); + bool result = storageInput.loadAdditionalConstraints(testPath); BOOST_CHECK_EQUAL(result, true); BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints[0].rhs.size(), @@ -718,7 +718,7 @@ BOOST_AUTO_TEST_CASE(Load2ConstraintsFromIniFile) cluster.id = "cluster1"; storageInput.storagesByIndex.push_back(cluster); - bool result = storageInput.LoadConstraintsFromIniFile(testPath); + bool result = storageInput.loadAdditionalConstraints(testPath); BOOST_CHECK_EQUAL(result, true); BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints.size(), 2); @@ -748,7 +748,7 @@ BOOST_AUTO_TEST_CASE(Load2ConstraintsFromIniFile) std::filesystem::remove_all(testPath); } -BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_MissingRhsFile) +BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_MissingRhsFile) { std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); @@ -766,7 +766,7 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_MissingRhsFile) cluster.id = "cluster1"; storageInput.storagesByIndex.push_back(cluster); - bool result = storageInput.LoadConstraintsFromIniFile(testPath); + bool result = storageInput.loadAdditionalConstraints(testPath); BOOST_CHECK_EQUAL(result, true); BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints[0].rhs.size(), @@ -776,7 +776,7 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_MissingRhsFile) std::filesystem::remove_all(testPath); } -BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_MalformedRhsFile) +BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_MalformedRhsFile) { std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); @@ -798,13 +798,13 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_MalformedRhsFile) cluster.id = "ClusterA"; storageInput.storagesByIndex.push_back(cluster); - bool result = storageInput.LoadConstraintsFromIniFile(testPath); + bool result = storageInput.loadAdditionalConstraints(testPath); BOOST_CHECK_EQUAL(result, false); std::filesystem::remove_all(testPath); } -BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_IncompleteRhsFile) +BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_IncompleteRhsFile) { std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); @@ -829,7 +829,7 @@ BOOST_AUTO_TEST_CASE(LoadConstraintsFromIniFile_IncompleteRhsFile) cluster.id = "ClusterA"; storageInput.storagesByIndex.push_back(cluster); - bool result = storageInput.LoadConstraintsFromIniFile(testPath); + bool result = storageInput.loadAdditionalConstraints(testPath); BOOST_CHECK_EQUAL(result, false); std::filesystem::remove_all(testPath); @@ -895,7 +895,7 @@ BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinationsFromFile, storageInput.storagesByIndex.push_back(cluster); // Load constraints from the `.ini` file - bool result = storageInput.LoadConstraintsFromIniFile(testPath); + bool result = storageInput.loadAdditionalConstraints(testPath); // Assertions BOOST_CHECK_EQUAL(result, true); From 998882944cd9f45e77772b137f75db3aa53c9f9d Mon Sep 17 00:00:00 2001 From: Vincent Payet Date: Tue, 31 Dec 2024 12:42:53 +0100 Subject: [PATCH 17/42] add readRHS --- .../parts/short-term-storage/container.cpp | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 67ad445efd..0e16e21365 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -115,10 +115,27 @@ static void loadHours(const std::string& hoursStr, AdditionalConstraints& additi } } -bool STStorageInput::loadAdditionalConstraints(const fs::path& parent_path) +static bool readRHS(AdditionalConstraints& additional_constraints, + const fs::path& parentPath, + const std::string& sectionName) +{ + loadFile(parentPath / ("rhs_" + additional_constraints.name + ".txt"), + additional_constraints.rhs); + fillIfEmpty(additional_constraints.rhs, 0.0); + + if (auto [ok, error_msg] = additional_constraints.validate(); !ok) + { + logs.error() << "Invalid constraint in section: " << sectionName; + logs.error() << error_msg; + return false; + } + return true; +} + +bool STStorageInput::loadAdditionalConstraints(const fs::path& parentPath) { IniFile ini; - const auto pathIni = parent_path / "additional-constraints.ini"; + const auto pathIni = parentPath / "additional-constraints.ini"; if (!ini.open(pathIni, false)) { logs.info() << "There is no: " << pathIni; @@ -155,15 +172,8 @@ bool STStorageInput::loadAdditionalConstraints(const fs::path& parent_path) } } - // try to read the rhs - loadFile(parent_path / ("rhs_" + additional_constraints.name + ".txt"), - additional_constraints.rhs); - fillIfEmpty(additional_constraints.rhs, 0.0); - - if (auto [ok, error_msg] = additional_constraints.validate(); !ok) + if (!readRHS(additional_constraints, parentPath, section->name)) { - logs.error() << "Invalid constraint in section: " << section->name; - logs.error() << error_msg; return false; } From 77623b55c9ceaf2725a5501322a963fd2f3c5147 Mon Sep 17 00:00:00 2001 From: Vincent Payet Date: Tue, 31 Dec 2024 12:43:54 +0100 Subject: [PATCH 18/42] rename additional_constraints --- .../study/parts/short-term-storage/cluster.h | 2 +- .../parts/short-term-storage/container.cpp | 42 +++++++++---------- .../ShortTermStorageCumulation.cpp | 10 ++--- .../opt_decompte_variables_et_contraintes.cpp | 6 +-- ...opt_gestion_second_membre_cas_lineaire.cpp | 8 ++-- .../sim_structure_probleme_economique.h | 2 +- .../simulation/sim_calcul_economique.cpp | 6 +-- .../short-term-storage-input-output.cpp | 24 +++++------ 8 files changed, 50 insertions(+), 50 deletions(-) diff --git a/src/libs/antares/study/include/antares/study/parts/short-term-storage/cluster.h b/src/libs/antares/study/include/antares/study/parts/short-term-storage/cluster.h index c117111efe..69a0bb8794 100644 --- a/src/libs/antares/study/include/antares/study/parts/short-term-storage/cluster.h +++ b/src/libs/antares/study/include/antares/study/parts/short-term-storage/cluster.h @@ -51,6 +51,6 @@ class STStorageCluster std::shared_ptr series = std::make_shared(); mutable Properties properties; - std::vector additional_constraints; + std::vector additionalConstraints; }; } // namespace Antares::Data::ShortTermStorage diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 0e16e21365..6a01f662d4 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -75,7 +75,7 @@ bool STStorageInput::createSTStorageClustersFromIniFile(const fs::path& path) return true; } -static void loadHours(const std::string& hoursStr, AdditionalConstraints& additional_constraints) +static void loadHours(const std::string& hoursStr, AdditionalConstraints& additionalConstraints) { // // std::stringstream ss(value.c_str()); @@ -108,22 +108,22 @@ static void loadHours(const std::string& hoursStr, AdditionalConstraints& additi if (!hourSet.empty()) { // Add this group to the `hours` vec - additional_constraints.constraints.push_back( + additionalConstraints.constraints.push_back( {.hours = hourSet, .localIndex = localIndex}); ++localIndex; } } } -static bool readRHS(AdditionalConstraints& additional_constraints, +static bool readRHS(AdditionalConstraints& additionalConstraints, const fs::path& parentPath, const std::string& sectionName) { - loadFile(parentPath / ("rhs_" + additional_constraints.name + ".txt"), - additional_constraints.rhs); - fillIfEmpty(additional_constraints.rhs, 0.0); + loadFile(parentPath / ("rhs_" + additionalConstraints.name + ".txt"), + additionalConstraints.rhs); + fillIfEmpty(additionalConstraints.rhs, 0.0); - if (auto [ok, error_msg] = additional_constraints.validate(); !ok) + if (auto [ok, error_msg] = additionalConstraints.validate(); !ok) { logs.error() << "Invalid constraint in section: " << sectionName; logs.error() << error_msg; @@ -144,8 +144,8 @@ bool STStorageInput::loadAdditionalConstraints(const fs::path& parentPath) for (auto* section = ini.firstSection; section; section = section->next) { - AdditionalConstraints additional_constraints; - additional_constraints.name = section->name.c_str(); + AdditionalConstraints additionalConstraints; + additionalConstraints.name = section->name.c_str(); for (auto* property = section->firstProperty; property; property = property->next) { const std::string key = property->key; @@ -156,30 +156,30 @@ bool STStorageInput::loadAdditionalConstraints(const fs::path& parentPath) // TODO do i have to transform the name to id? TransformNameIntoID std::string clusterName; value.to(clusterName); - additional_constraints.cluster_id = transformNameIntoID(clusterName); + additionalConstraints.cluster_id = transformNameIntoID(clusterName); } else if (key == "variable") { - value.to(additional_constraints.variable); + value.to(additionalConstraints.variable); } else if (key == "operator") { - value.to(additional_constraints.operatorType); + value.to(additionalConstraints.operatorType); } else if (key == "hours") { - loadHours(value.c_str(), additional_constraints); + loadHours(value.c_str(), additionalConstraints); } } - if (!readRHS(additional_constraints, parentPath, section->name)) + if (!readRHS(additionalConstraints, parentPath, section->name)) { return false; } auto it = std::ranges::find_if(storagesByIndex, - [&additional_constraints](const STStorageCluster& cluster) - { return cluster.id == additional_constraints.cluster_id; }); + [&additionalConstraints](const STStorageCluster& cluster) + { return cluster.id == additionalConstraints.cluster_id; }); if (it == storagesByIndex.end()) { logs.warning() << " from file " << pathIni; @@ -189,7 +189,7 @@ bool STStorageInput::loadAdditionalConstraints(const fs::path& parentPath) } else { - it->additional_constraints.push_back(additional_constraints); + it->additionalConstraints.push_back(additionalConstraints); } } @@ -246,11 +246,11 @@ std::size_t STStorageInput::cumulativeConstraintCount() const { return outer_constraint_count + std::accumulate( - cluster.additional_constraints.begin(), - cluster.additional_constraints.end(), + cluster.additionalConstraints.begin(), + cluster.additionalConstraints.end(), 0, - [](size_t inner_constraint_count, const auto& additional_constraints) - { return inner_constraint_count + additional_constraints.constraints.size(); }); + [](size_t inner_constraint_count, const auto& additionalConstraints) + { return inner_constraint_count + additionalConstraints.constraints.size(); }); }); } diff --git a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp index a6aafb6cda..8461185a00 100644 --- a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp +++ b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp @@ -130,20 +130,20 @@ void ShortTermStorageCumulation::add(int pays) for (const auto& storage: data.ShortTermStorage[pays]) { - for (const auto& additional_constraints: storage.additional_constraints) + for (const auto& additionalConstraints: storage.additionalConstraints) { // sum (var[h]) sign rhs, h in list provided by user where: // var = injection for InjectionCumulationConstraint // var = withdrawal for WithdrawalCumulationConstraint // var = injectionEfficiency * injection - withdrawalEfficiency * withdrawal for Netting auto constraintHelper = cumulationConstraintFromVariable( - additional_constraints.variable); - for (const auto& [hours, globalIndex, localIndex]: additional_constraints.constraints) + additionalConstraints.variable); + for (const auto& [hours, globalIndex, localIndex]: additionalConstraints.constraints) { namer.ShortTermStorageCumulation(constraintHelper->name(), builder.data.nombreDeContraintes, storage.name, - additional_constraints.name + "_" + additionalConstraints.name + "_" + std::to_string(localIndex)); const auto index = storage.clusterGlobalIndex; data.CorrespondanceCntNativesCntOptimHebdomadaires @@ -155,7 +155,7 @@ void ShortTermStorageCumulation::add(int pays) builder.updateHourWithinWeek(hour - 1); constraintHelper->build(builder, index, storage); } - builder.SetOperator(ConvertSense(additional_constraints.operatorType)).build(); + builder.SetOperator(ConvertSense(additionalConstraints.operatorType)).build(); } } } diff --git a/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp b/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp index 239797bbf6..0f5c0e095f 100644 --- a/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp +++ b/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp @@ -245,11 +245,11 @@ int OPT_DecompteDesVariablesEtDesContraintesDuProblemeAOptimiser(PROBLEME_HEBDO* ProblemeAResoudre->NombreDeContraintes += 2 * nombreDePasDeTempsPourUneOptimisation; } - if (!storage.additional_constraints.empty()) + if (!storage.additionalConstraints.empty()) { - for (const auto& additional_constraints: storage.additional_constraints) + for (const auto& additionalConstraints: storage.additionalConstraints) { - ProblemeAResoudre->NombreDeContraintes += additional_constraints.constraints + ProblemeAResoudre->NombreDeContraintes += additionalConstraints.constraints .size(); } } diff --git a/src/solver/optimisation/opt_gestion_second_membre_cas_lineaire.cpp b/src/solver/optimisation/opt_gestion_second_membre_cas_lineaire.cpp index adbccd8f3d..d4065fd880 100644 --- a/src/solver/optimisation/opt_gestion_second_membre_cas_lineaire.cpp +++ b/src/solver/optimisation/opt_gestion_second_membre_cas_lineaire.cpp @@ -56,9 +56,9 @@ static void shortTermStorageCumulationRHS( { for (auto& storage: shortTermStorageInput[areaIndex]) { - for (const auto& additional_constraints: storage.additional_constraints) + for (const auto& additionalConstraints: storage.additionalConstraints) { - for (const auto& constraint: additional_constraints.constraints) + for (const auto& constraint: additionalConstraints.constraints) { const int cnt = CorrespondancesDesContraintesHebdomadaires .ShortTermStorageCumulation[constraint.globalIndex]; @@ -67,8 +67,8 @@ static void shortTermStorageCumulationRHS( constraint.hours.begin(), constraint.hours.end(), 0.0, - [weekFirstHour, &additional_constraints](const double sum, const int hour) - { return sum + additional_constraints.rhs[weekFirstHour + hour - 1]; }); + [weekFirstHour, &additionalConstraints](const double sum, const int hour) + { return sum + additionalConstraints.rhs[weekFirstHour + hour - 1]; }); } } } diff --git a/src/solver/simulation/include/antares/solver/simulation/sim_structure_probleme_economique.h b/src/solver/simulation/include/antares/solver/simulation/sim_structure_probleme_economique.h index 52b7e8dc0d..9356868766 100644 --- a/src/solver/simulation/include/antares/solver/simulation/sim_structure_probleme_economique.h +++ b/src/solver/simulation/include/antares/solver/simulation/sim_structure_probleme_economique.h @@ -183,7 +183,7 @@ struct PROPERTIES bool penalizeVariationInjection; std::shared_ptr series; - std::vector additional_constraints; + std::vector additionalConstraints; int clusterGlobalIndex; std::string name; }; diff --git a/src/solver/simulation/sim_calcul_economique.cpp b/src/solver/simulation/sim_calcul_economique.cpp index 156a638cec..7e9c405729 100644 --- a/src/solver/simulation/sim_calcul_economique.cpp +++ b/src/solver/simulation/sim_calcul_economique.cpp @@ -60,10 +60,10 @@ static void importShortTermStorages( toInsert.penalizeVariationInjection = st.properties.penalizeVariationInjection; toInsert.penalizeVariationWithdrawal = st.properties.penalizeVariationWithdrawal; toInsert.name = st.properties.name; - toInsert.additional_constraints = st.additional_constraints; - for (auto& additional_constraints: toInsert.additional_constraints) + toInsert.additionalConstraints = st.additionalConstraints; + for (auto& additionalConstraints: toInsert.additionalConstraints) { - for (auto& [_, globalIndex, __]: additional_constraints.constraints) + for (auto& [_, globalIndex, __]: additionalConstraints.constraints) { globalIndex = clusterCumulativeConstraintGlobalIndex; ++clusterCumulativeConstraintGlobalIndex; diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 0de38df1ab..204318a3e0 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -564,8 +564,8 @@ BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_ValidFile) bool result = storageInput.loadAdditionalConstraints(testPath); BOOST_CHECK_EQUAL(result, true); - BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints.size(), 1); - BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints[0].name, + BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additionalConstraints.size(), 1); + BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additionalConstraints[0].name, "constraint1"); std::filesystem::remove_all(testPath); @@ -678,11 +678,11 @@ BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_ValidRhs) bool result = storageInput.loadAdditionalConstraints(testPath); BOOST_CHECK_EQUAL(result, true); - BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints[0].rhs.size(), + BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additionalConstraints[0].rhs.size(), HOURS_PER_YEAR); - BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints[0].rhs[0], 0.0); + BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additionalConstraints[0].rhs[0], 0.0); BOOST_CHECK_EQUAL( - storageInput.storagesByIndex[0].additional_constraints[0].rhs[HOURS_PER_YEAR - 1], + storageInput.storagesByIndex[0].additionalConstraints[0].rhs[HOURS_PER_YEAR - 1], HOURS_PER_YEAR - 1); std::filesystem::remove_all(testPath); @@ -721,10 +721,10 @@ BOOST_AUTO_TEST_CASE(Load2ConstraintsFromIniFile) bool result = storageInput.loadAdditionalConstraints(testPath); BOOST_CHECK_EQUAL(result, true); - BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints.size(), 2); + BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additionalConstraints.size(), 2); //------- constraint1 ---------- - const auto& constraint1 = storageInput.storagesByIndex[0].additional_constraints[0]; + const auto& constraint1 = storageInput.storagesByIndex[0].additionalConstraints[0]; BOOST_CHECK_EQUAL(constraint1.name, "constraint1"); BOOST_CHECK_EQUAL(constraint1.operatorType, "less"); BOOST_CHECK_EQUAL(constraint1.variable, "injection"); @@ -735,7 +735,7 @@ BOOST_AUTO_TEST_CASE(Load2ConstraintsFromIniFile) //------- constraint2 ---------- - const auto& constraint2 = storageInput.storagesByIndex[0].additional_constraints[1]; + const auto& constraint2 = storageInput.storagesByIndex[0].additionalConstraints[1]; BOOST_CHECK_EQUAL(constraint2.name, "constraint2"); BOOST_CHECK_EQUAL(constraint2.operatorType, "greater"); BOOST_CHECK_EQUAL(constraint2.variable, "withdrawal"); @@ -769,9 +769,9 @@ BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_MissingRhsFile) bool result = storageInput.loadAdditionalConstraints(testPath); BOOST_CHECK_EQUAL(result, true); - BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints[0].rhs.size(), + BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additionalConstraints[0].rhs.size(), HOURS_PER_YEAR); - BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additional_constraints[0].rhs[0], 0.0); + BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additionalConstraints[0].rhs[0], 0.0); std::filesystem::remove_all(testPath); } @@ -902,8 +902,8 @@ BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinationsFromFile, // Validate loaded constraints auto& built_cluster = storageInput.storagesByIndex[0]; - BOOST_REQUIRE_EQUAL(built_cluster.additional_constraints.size(), 1); - const auto& loadedConstraint = built_cluster.additional_constraints[0]; + BOOST_REQUIRE_EQUAL(built_cluster.additionalConstraints.size(), 1); + const auto& loadedConstraint = built_cluster.additionalConstraints[0]; // Check variable, operator type, and rhs values BOOST_CHECK_EQUAL(loadedConstraint.variable, variable); From 80571646c6d372d835b4a5eb80074e4503a881aa Mon Sep 17 00:00:00 2001 From: Vincent Payet Date: Tue, 31 Dec 2024 12:52:34 +0100 Subject: [PATCH 19/42] format --- src/libs/antares/study/parts/short-term-storage/container.cpp | 3 ++- .../short-term-storage-input-output.cpp | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 6a01f662d4..5d23d848c8 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -19,6 +19,8 @@ ** along with Antares_Simulator. If not, see . */ +#include "antares/study/parts/short-term-storage/container.h" + #include #include #include @@ -28,7 +30,6 @@ #include #include -#include "antares/study/parts/short-term-storage/container.h" #define SEP Yuni::IO::Separator diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 204318a3e0..86d7c013ef 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -565,8 +565,7 @@ BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_ValidFile) BOOST_CHECK_EQUAL(result, true); BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additionalConstraints.size(), 1); - BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additionalConstraints[0].name, - "constraint1"); + BOOST_CHECK_EQUAL(storageInput.storagesByIndex[0].additionalConstraints[0].name, "constraint1"); std::filesystem::remove_all(testPath); } From fba03516e3b15871a6be931e98443408f4cfdeb6 Mon Sep 17 00:00:00 2001 From: Vincent Payet Date: Tue, 31 Dec 2024 13:00:55 +0100 Subject: [PATCH 20/42] use a pair --- .../parts/short-term-storage/AdditionalConstraints.h | 8 +------- .../parts/short-term-storage/AdditionalConstraints.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h b/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h index de800f5ac0..e202ddbf75 100644 --- a/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h +++ b/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h @@ -47,13 +47,7 @@ struct AdditionalConstraints std::vector constraints; - struct ValidateResult - { - bool ok; - std::string error_msg; - }; - - ValidateResult validate() const; + std::pair validate() const; private: bool isValidVariable() const; diff --git a/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp b/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp index c16b35bef2..e6b9920706 100644 --- a/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp +++ b/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp @@ -18,13 +18,15 @@ ** You should have received a copy of the Mozilla Public Licence 2.0 ** along with Antares_Simulator. If not, see . */ -#include "antares/study/parts/short-term-storage/AdditionalConstraints.h" #include +#include "antares/study/parts/short-term-storage/AdditionalConstraints.h" + namespace Antares::Data::ShortTermStorage { -AdditionalConstraints::ValidateResult AdditionalConstraints::validate() const + +std::pair AdditionalConstraints::validate() const { if (cluster_id.empty()) { From 5037c3e319dbded7f0d280fab859e34a529302ff Mon Sep 17 00:00:00 2001 From: Vincent Payet Date: Tue, 31 Dec 2024 14:52:24 +0100 Subject: [PATCH 21/42] use a class instead of struct --- .../study/parts/short-term-storage/AdditionalConstraints.h | 4 +++- .../study/parts/short-term-storage/AdditionalConstraints.cpp | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h b/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h index e202ddbf75..202c54759c 100644 --- a/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h +++ b/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h @@ -26,8 +26,10 @@ namespace Antares::Data::ShortTermStorage { -struct SingleAdditionalConstraint + +class SingleAdditionalConstraint { +public: std::set hours; unsigned int globalIndex = 0; unsigned int localIndex = 0; diff --git a/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp b/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp index e6b9920706..d73d14debc 100644 --- a/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp +++ b/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp @@ -19,10 +19,10 @@ ** along with Antares_Simulator. If not, see . */ -#include - #include "antares/study/parts/short-term-storage/AdditionalConstraints.h" +#include + namespace Antares::Data::ShortTermStorage { From 63d793502c70e11267f4ab59f57d53112568203d Mon Sep 17 00:00:00 2001 From: Vincent Payet Date: Tue, 31 Dec 2024 15:14:00 +0100 Subject: [PATCH 22/42] rename files --- src/libs/antares/study/CMakeLists.txt | 4 ++-- .../{AdditionalConstraints.h => additionalConstraints.h} | 0 .../include/antares/study/parts/short-term-storage/cluster.h | 2 +- .../{AdditionalConstraints.cpp => additionalConstraints.cpp} | 2 +- .../short-term-storage-input-output.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename src/libs/antares/study/include/antares/study/parts/short-term-storage/{AdditionalConstraints.h => additionalConstraints.h} (100%) rename src/libs/antares/study/parts/short-term-storage/{AdditionalConstraints.cpp => additionalConstraints.cpp} (97%) diff --git a/src/libs/antares/study/CMakeLists.txt b/src/libs/antares/study/CMakeLists.txt index dd82930032..c3d23d9d80 100644 --- a/src/libs/antares/study/CMakeLists.txt +++ b/src/libs/antares/study/CMakeLists.txt @@ -102,9 +102,9 @@ set(SRC_STUDY_PART_SHORT_TERM_STORAGE parts/short-term-storage/series.cpp include/antares/study/parts/short-term-storage/series.h include/antares/study/parts/short-term-storage/cluster.h - include/antares/study/parts/short-term-storage/AdditionalConstraints.h + include/antares/study/parts/short-term-storage/additionalConstraints.h parts/short-term-storage/cluster.cpp - parts/short-term-storage/AdditionalConstraints.cpp + parts/short-term-storage/additionalConstraints.cpp ) source_group("study\\part\\short-term-storage" FILES ${SRC_STUDY_PART_SHORT_TERM_SOTRAGE}) diff --git a/src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h b/src/libs/antares/study/include/antares/study/parts/short-term-storage/additionalConstraints.h similarity index 100% rename from src/libs/antares/study/include/antares/study/parts/short-term-storage/AdditionalConstraints.h rename to src/libs/antares/study/include/antares/study/parts/short-term-storage/additionalConstraints.h diff --git a/src/libs/antares/study/include/antares/study/parts/short-term-storage/cluster.h b/src/libs/antares/study/include/antares/study/parts/short-term-storage/cluster.h index 69a0bb8794..b7c901d6d1 100644 --- a/src/libs/antares/study/include/antares/study/parts/short-term-storage/cluster.h +++ b/src/libs/antares/study/include/antares/study/parts/short-term-storage/cluster.h @@ -26,7 +26,7 @@ #include -#include "AdditionalConstraints.h" +#include "additionalConstraints.h" #include "properties.h" #include "series.h" diff --git a/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp b/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp similarity index 97% rename from src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp rename to src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp index d73d14debc..fa201c4df5 100644 --- a/src/libs/antares/study/parts/short-term-storage/AdditionalConstraints.cpp +++ b/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp @@ -19,7 +19,7 @@ ** along with Antares_Simulator. If not, see . */ -#include "antares/study/parts/short-term-storage/AdditionalConstraints.h" +#include "antares/study/parts/short-term-storage/additionalConstraints.h" #include diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 86d7c013ef..7e455e3af8 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -32,7 +32,7 @@ #include #include "antares/antares/constants.h" -#include "antares/study/parts/short-term-storage/AdditionalConstraints.h" +#include "antares/study/parts/short-term-storage/additionalConstraints.h" #include "antares/study/parts/short-term-storage/container.h" using namespace std; From c2ca5b7c6742ecd7cbf6cbb6151f41ab2d1270a8 Mon Sep 17 00:00:00 2001 From: Vincent Payet Date: Tue, 31 Dec 2024 15:31:21 +0100 Subject: [PATCH 23/42] few comments --- .../parts/short-term-storage/additionalConstraints.cpp | 7 +++---- src/solver/simulation/sim_calcul_economique.cpp | 6 +++--- .../short-term-storage-input-output.cpp | 3 +-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp b/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp index fa201c4df5..665f33531f 100644 --- a/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp +++ b/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp @@ -19,10 +19,10 @@ ** along with Antares_Simulator. If not, see . */ -#include "antares/study/parts/short-term-storage/additionalConstraints.h" - #include +#include "antares/study/parts/short-term-storage/additionalConstraints.h" + namespace Antares::Data::ShortTermStorage { @@ -59,8 +59,7 @@ bool SingleAdditionalConstraint::isValidHoursRange() const bool AdditionalConstraints::isValidHours() const { - return std::ranges::all_of(constraints.begin(), - constraints.end(), + return std::ranges::all_of(constraints, [](const auto& constraint) { return constraint.isValidHoursRange(); }); } diff --git a/src/solver/simulation/sim_calcul_economique.cpp b/src/solver/simulation/sim_calcul_economique.cpp index 7e9c405729..00140e1553 100644 --- a/src/solver/simulation/sim_calcul_economique.cpp +++ b/src/solver/simulation/sim_calcul_economique.cpp @@ -39,7 +39,7 @@ static void importShortTermStorages( std::vector<::ShortTermStorage::AREA_INPUT>& ShortTermStorageOut) { int clusterGlobalIndex = 0; - int clusterCumulativeConstraintGlobalIndex = 0; + int constraintGlobalIndex = 0; for (uint areaIndex = 0; areaIndex != areas.size(); areaIndex++) { ShortTermStorageOut[areaIndex].resize(areas[areaIndex]->shortTermStorage.count()); @@ -65,8 +65,8 @@ static void importShortTermStorages( { for (auto& [_, globalIndex, __]: additionalConstraints.constraints) { - globalIndex = clusterCumulativeConstraintGlobalIndex; - ++clusterCumulativeConstraintGlobalIndex; + globalIndex = constraintGlobalIndex; + ++constraintGlobalIndex; } } toInsert.series = st.series; diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 7e455e3af8..e66a1d632b 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -535,8 +535,7 @@ BOOST_AUTO_TEST_CASE(Validate_ValidConstraints) ShortTermStorage::SingleAdditionalConstraint constraint2; constraint2.hours = {100, 150, 168}; // Valid hours - constraints.constraints.push_back(constraint1); - constraints.constraints.push_back(constraint2); + constraints.constraints = {constraint1, constraint2}; auto [ok, error_msg] = constraints.validate(); BOOST_CHECK_EQUAL(ok, true); From 309b537c6bebb991eb4770fc7734bfbce7fe3a02 Mon Sep 17 00:00:00 2001 From: Vincent Payet Date: Tue, 31 Dec 2024 16:28:25 +0100 Subject: [PATCH 24/42] format --- .../study/parts/short-term-storage/additionalConstraints.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp b/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp index 665f33531f..f1f1fdac55 100644 --- a/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp +++ b/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp @@ -19,10 +19,10 @@ ** along with Antares_Simulator. If not, see . */ -#include - #include "antares/study/parts/short-term-storage/additionalConstraints.h" +#include + namespace Antares::Data::ShortTermStorage { From 57a8dd18d12c47c1fc192d9414e5385c14c1d5d1 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Thu, 2 Jan 2025 09:51:31 +0100 Subject: [PATCH 25/42] revert and update --- .../short-term-storage/additionalConstraints.h | 8 +++++++- .../additionalConstraints.cpp | 3 +-- .../parts/short-term-storage/container.cpp | 18 ++++++------------ 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/libs/antares/study/include/antares/study/parts/short-term-storage/additionalConstraints.h b/src/libs/antares/study/include/antares/study/parts/short-term-storage/additionalConstraints.h index 202c54759c..f0ecb9b34b 100644 --- a/src/libs/antares/study/include/antares/study/parts/short-term-storage/additionalConstraints.h +++ b/src/libs/antares/study/include/antares/study/parts/short-term-storage/additionalConstraints.h @@ -49,7 +49,13 @@ struct AdditionalConstraints std::vector constraints; - std::pair validate() const; + struct ValidateResult + { + bool ok; + std::string error_msg; + }; + + ValidateResult validate() const; private: bool isValidVariable() const; diff --git a/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp b/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp index f1f1fdac55..6a3df8996f 100644 --- a/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp +++ b/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp @@ -25,8 +25,7 @@ namespace Antares::Data::ShortTermStorage { - -std::pair AdditionalConstraints::validate() const +AdditionalConstraints::ValidateResult AdditionalConstraints::validate() const { if (cluster_id.empty()) { diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 5d23d848c8..e6de92c408 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -116,21 +116,12 @@ static void loadHours(const std::string& hoursStr, AdditionalConstraints& additi } } -static bool readRHS(AdditionalConstraints& additionalConstraints, - const fs::path& parentPath, - const std::string& sectionName) +static void readRHS(AdditionalConstraints& additionalConstraints, + const fs::path& parentPath) { loadFile(parentPath / ("rhs_" + additionalConstraints.name + ".txt"), additionalConstraints.rhs); fillIfEmpty(additionalConstraints.rhs, 0.0); - - if (auto [ok, error_msg] = additionalConstraints.validate(); !ok) - { - logs.error() << "Invalid constraint in section: " << sectionName; - logs.error() << error_msg; - return false; - } - return true; } bool STStorageInput::loadAdditionalConstraints(const fs::path& parentPath) @@ -173,8 +164,11 @@ bool STStorageInput::loadAdditionalConstraints(const fs::path& parentPath) } } - if (!readRHS(additionalConstraints, parentPath, section->name)) + readRHS(additionalConstraints, parentPath); + if (auto [ok, error_msg] = additionalConstraints.validate(); !ok) { + logs.error() << "Invalid constraint in section: " << section->name; + logs.error() << error_msg; return false; } From efd16e0d3feaea973599d9072811f81220d2ff2b Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Thu, 2 Jan 2025 10:35:30 +0100 Subject: [PATCH 26/42] update --- .../study/parts/short-term-storage/container.cpp | 10 ---------- .../short-term-storage-input-output.cpp | 1 - 2 files changed, 11 deletions(-) diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index e6de92c408..d94effd421 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -78,15 +78,6 @@ bool STStorageInput::createSTStorageClustersFromIniFile(const fs::path& path) static void loadHours(const std::string& hoursStr, AdditionalConstraints& additionalConstraints) { - // - // std::stringstream ss(value.c_str()); - // std::string hour; - // while (std::getline(ss, hour, ',')) - // { - // int hourVal = std::stoi(hour); - // constraint.hours.insert(hourVal); - // } - // Split the `hours` field into multiple groups std::regex groupRegex(R"(\[(.*?)\])"); // Match each group enclosed in square brackets @@ -145,7 +136,6 @@ bool STStorageInput::loadAdditionalConstraints(const fs::path& parentPath) if (key == "cluster") { - // TODO do i have to transform the name to id? TransformNameIntoID std::string clusterName; value.to(clusterName); additionalConstraints.cluster_id = transformNameIntoID(clusterName); diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index e66a1d632b..b01c391b58 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -22,7 +22,6 @@ #define WIN32_LEAN_AND_MEAN -#include #include #include From 5c4a438f0aee21fcdc12e8dbfc562584494f6330 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Thu, 2 Jan 2025 10:55:23 +0100 Subject: [PATCH 27/42] split tests --- .../short-term-storage-input-output.cpp | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index b01c391b58..f5d3de3eef 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -494,27 +494,51 @@ BOOST_AUTO_TEST_CASE(Validate_InvalidOperatorType) BOOST_CHECK_EQUAL(error_msg, "Invalid operator type. Must be 'less', 'equal', or 'greater'."); } -BOOST_AUTO_TEST_CASE(Validate_InvalidHours) +BOOST_AUTO_TEST_CASE(Validate_InvalidHours_Empty) { ShortTermStorage::AdditionalConstraints constraints; constraints.cluster_id = "ClusterA"; constraints.variable = "injection"; constraints.operatorType = "less"; - // Case 1: Empty hours - ShortTermStorage::SingleAdditionalConstraint constraint1; - constraint1.hours = {}; // Invalid: empty - constraints.constraints.push_back(constraint1); + // Case : Empty hours + ShortTermStorage::SingleAdditionalConstraint constraint; + constraint.hours = {}; // Invalid: empty + constraints.constraints.push_back(constraint); - // Case 2: Out of range - ShortTermStorage::SingleAdditionalConstraint constraint2; - constraint2.hours = {120, 169}; // Invalid: out of range - constraints.constraints.push_back(constraint2); + auto [ok, error_msg] = constraints.validate(); + BOOST_CHECK_EQUAL(ok, false); + BOOST_CHECK_EQUAL(error_msg, "Hours sets contains invalid values. Must be between 1 and 168."); +} + +BOOST_AUTO_TEST_CASE(Validate_InvalidHours_Out_of_range) +{ + ShortTermStorage::AdditionalConstraints constraints; + constraints.cluster_id = "ClusterA"; + constraints.variable = "injection"; + constraints.operatorType = "less"; + + // Case: Out of range + ShortTermStorage::SingleAdditionalConstraint constraint; + constraint.hours = {120, 169}; // Invalid: out of range + constraints.constraints.push_back(constraint); + + auto [ok, error_msg] = constraints.validate(); + BOOST_CHECK_EQUAL(ok, false); + BOOST_CHECK_EQUAL(error_msg, "Hours sets contains invalid values. Must be between 1 and 168."); +} + +BOOST_AUTO_TEST_CASE(Validate_InvalidHours_Below_minimum) +{ + ShortTermStorage::AdditionalConstraints constraints; + constraints.cluster_id = "ClusterA"; + constraints.variable = "injection"; + constraints.operatorType = "less"; - // Case 3: Below minimum - ShortTermStorage::SingleAdditionalConstraint constraint3; - constraint3.hours = {0, 1}; // Invalid: below minimum - constraints.constraints.push_back(constraint3); + // Case : Below minimum + ShortTermStorage::SingleAdditionalConstraint constraint; + constraint.hours = {0, 1}; // Invalid: below minimum + constraints.constraints.push_back(constraint); auto [ok, error_msg] = constraints.validate(); BOOST_CHECK_EQUAL(ok, false); From d5f0bca3e67f8bc889ad069de99d018b210cc274 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Thu, 2 Jan 2025 11:44:07 +0100 Subject: [PATCH 28/42] on malformed rhs file --- .../parts/short-term-storage/container.cpp | 19 +++++++++++++------ .../short-term-storage-input-output.cpp | 12 +++++++----- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index d94effd421..73d3a611f5 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -107,12 +107,13 @@ static void loadHours(const std::string& hoursStr, AdditionalConstraints& additi } } -static void readRHS(AdditionalConstraints& additionalConstraints, - const fs::path& parentPath) +static bool readRHS(AdditionalConstraints& additionalConstraints, + const fs::path& rhsPath) { - loadFile(parentPath / ("rhs_" + additionalConstraints.name + ".txt"), - additionalConstraints.rhs); - fillIfEmpty(additionalConstraints.rhs, 0.0); + const auto ret = loadFile(rhsPath, + additionalConstraints.rhs); + if (ret) { fillIfEmpty(additionalConstraints.rhs, 0.0); } + return ret; } bool STStorageInput::loadAdditionalConstraints(const fs::path& parentPath) @@ -154,7 +155,13 @@ bool STStorageInput::loadAdditionalConstraints(const fs::path& parentPath) } } - readRHS(additionalConstraints, parentPath); + if (const auto rhsPath = parentPath / ( + "rhs_" + additionalConstraints.name + + ".txt"); !readRHS(additionalConstraints, rhsPath)) + { + logs.error() << "Error while reading rhs file: " << rhsPath; + return false; + } if (auto [ok, error_msg] = additionalConstraints.validate(); !ok) { logs.error() << "Invalid constraint in section: " << section->name; diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index f5d3de3eef..67a6fc7d52 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -804,7 +804,7 @@ BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_MalformedRhsFile) std::ofstream iniFile(testPath / "additional-constraints.ini"); iniFile << "[constraint1]\n"; - iniFile << "cluster=ClusterA\n"; + iniFile << "cluster=cluster1\n"; iniFile << "variable=injection\n"; iniFile << "operator=less\n"; iniFile << "hours=[1,2,3]\n"; @@ -816,12 +816,14 @@ BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_MalformedRhsFile) ShortTermStorage::STStorageInput storageInput; ShortTermStorage::STStorageCluster cluster; - cluster.id = "ClusterA"; + cluster.id = "cluster1"; storageInput.storagesByIndex.push_back(cluster); bool result = storageInput.loadAdditionalConstraints(testPath); BOOST_CHECK_EQUAL(result, false); - + /*"Error while reading rhs file: " << "rhs_" << additionalConstraints.name + << + ".txt";*/ std::filesystem::remove_all(testPath); } @@ -832,7 +834,7 @@ BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_IncompleteRhsFile) std::ofstream iniFile(testPath / "additional-constraints.ini"); iniFile << "[constraint1]\n"; - iniFile << "cluster=ClusterA\n"; + iniFile << "cluster=cluster1\n"; iniFile << "variable=injection\n"; iniFile << "operator=less\n"; iniFile << "hours=[1,2,3]\n"; @@ -847,7 +849,7 @@ BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_IncompleteRhsFile) ShortTermStorage::STStorageInput storageInput; ShortTermStorage::STStorageCluster cluster; - cluster.id = "ClusterA"; + cluster.id = "cluster1"; storageInput.storagesByIndex.push_back(cluster); bool result = storageInput.loadAdditionalConstraints(testPath); From bf3bd6e44c6524cce6a86927ab76a4a0aeb40a33 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Thu, 2 Jan 2025 14:37:47 +0100 Subject: [PATCH 29/42] update --- .../ShortTermStorageCumulation.cpp | 76 +++++++++++++------ 1 file changed, 52 insertions(+), 24 deletions(-) diff --git a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp index 8461185a00..34b1c5928a 100644 --- a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp +++ b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp @@ -27,10 +27,10 @@ class CumulationConstraint { public: - virtual void build(ConstraintBuilder& builder, - unsigned int index, - const ::ShortTermStorage::PROPERTIES& input) const - = 0; + virtual void build( + unsigned int index) const + = 0; + virtual std::string name() const = 0; virtual ~CumulationConstraint() = default; }; @@ -38,9 +38,13 @@ class CumulationConstraint class WithdrawalCumulationConstraint: public CumulationConstraint { public: - void build(ConstraintBuilder& builder, - unsigned int index, - const ::ShortTermStorage::PROPERTIES&) const override + WithdrawalCumulationConstraint(ConstraintBuilder& builder) : builder(builder) + { + } + + void build( + unsigned int index + ) const override { builder.ShortTermStorageWithdrawal(index, 1.0); } @@ -51,14 +55,19 @@ class WithdrawalCumulationConstraint: public CumulationConstraint } ~WithdrawalCumulationConstraint() override = default; + + ConstraintBuilder& builder; }; class InjectionCumulationConstraint: public CumulationConstraint { public: - void build(ConstraintBuilder& builder, - unsigned int index, - const ::ShortTermStorage::PROPERTIES&) const override + InjectionCumulationConstraint(ConstraintBuilder& builder): builder(builder) + { + } + + void build( + unsigned int index) const override { builder.ShortTermStorageInjection(index, 1.0); } @@ -69,17 +78,27 @@ class InjectionCumulationConstraint: public CumulationConstraint } ~InjectionCumulationConstraint() override = default; + + ConstraintBuilder& builder; }; class NettingCumulationConstraint: public CumulationConstraint { public: - void build(ConstraintBuilder& builder, - unsigned int index, - const ::ShortTermStorage::PROPERTIES& input) const override + NettingCumulationConstraint(ConstraintBuilder& builder, + const ::ShortTermStorage::PROPERTIES& + short_term_storage_properties) : builder(builder), + short_term_storage_properties( + short_term_storage_properties) + { + } + + void build( + unsigned int index) const override { - builder.ShortTermStorageInjection(index, input.injectionEfficiency) - .ShortTermStorageWithdrawal(index, -input.withdrawalEfficiency); + builder.ShortTermStorageInjection(index, short_term_storage_properties.injectionEfficiency) + .ShortTermStorageWithdrawal(index, + -short_term_storage_properties.withdrawalEfficiency); } std::string name() const override @@ -88,21 +107,28 @@ class NettingCumulationConstraint: public CumulationConstraint } ~NettingCumulationConstraint() override = default; + + ConstraintBuilder& builder; + const ShortTermStorage::PROPERTIES& short_term_storage_properties; }; -std::unique_ptr cumulationConstraintFromVariable(const std::string& variable) +std::unique_ptr cumulationConstraintFactory( + const std::string& variable, + ConstraintBuilder& builder, + const ShortTermStorage::PROPERTIES& short_term_storage_properties) { if (variable == "withdrawal") { - return std::make_unique(); + return std::make_unique(builder); } else if (variable == "injection") { - return std::make_unique(); + return std::make_unique(builder); } else if (variable == "netting") { - return std::make_unique(); + return std::make_unique< + NettingCumulationConstraint>(builder, short_term_storage_properties); } throw std::invalid_argument("Invalid cumulation constraint type"); } @@ -136,15 +162,17 @@ void ShortTermStorageCumulation::add(int pays) // var = injection for InjectionCumulationConstraint // var = withdrawal for WithdrawalCumulationConstraint // var = injectionEfficiency * injection - withdrawalEfficiency * withdrawal for Netting - auto constraintHelper = cumulationConstraintFromVariable( - additionalConstraints.variable); + auto cumulationConstraint = cumulationConstraintFactory( + additionalConstraints.variable, + builder, + storage); for (const auto& [hours, globalIndex, localIndex]: additionalConstraints.constraints) { - namer.ShortTermStorageCumulation(constraintHelper->name(), + namer.ShortTermStorageCumulation(cumulationConstraint->name(), builder.data.nombreDeContraintes, storage.name, additionalConstraints.name + "_" - + std::to_string(localIndex)); + + std::to_string(localIndex)); const auto index = storage.clusterGlobalIndex; data.CorrespondanceCntNativesCntOptimHebdomadaires .ShortTermStorageCumulation[globalIndex] @@ -153,7 +181,7 @@ void ShortTermStorageCumulation::add(int pays) for (const auto& hour: hours) { builder.updateHourWithinWeek(hour - 1); - constraintHelper->build(builder, index, storage); + cumulationConstraint->build(index); } builder.SetOperator(ConvertSense(additionalConstraints.operatorType)).build(); } From 772434db033d375d597e44317a6237c49283b52d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Omn=C3=A8s?= Date: Fri, 3 Jan 2025 01:15:01 +0100 Subject: [PATCH 30/42] Add attribute `enabled` to additional constraints, adapt tests [ANT-1855] (#2550) Co-authored-by: Abdoulbari Zaher <32519851+a-zakir@users.noreply.github.com> --- .../additionalConstraints.h | 5 +- .../additionalConstraints.cpp | 5 ++ .../parts/short-term-storage/container.cpp | 29 +++++++---- .../ShortTermStorageCumulation.cpp | 52 ++++++++----------- .../opt_decompte_variables_et_contraintes.cpp | 4 +- .../simulation/sim_calcul_economique.cpp | 15 ++++-- .../short-term-storage-input-output.cpp | 40 +++++++++++++- 7 files changed, 102 insertions(+), 48 deletions(-) diff --git a/src/libs/antares/study/include/antares/study/parts/short-term-storage/additionalConstraints.h b/src/libs/antares/study/include/antares/study/parts/short-term-storage/additionalConstraints.h index f0ecb9b34b..081ca0d516 100644 --- a/src/libs/antares/study/include/antares/study/parts/short-term-storage/additionalConstraints.h +++ b/src/libs/antares/study/include/antares/study/parts/short-term-storage/additionalConstraints.h @@ -33,7 +33,6 @@ class SingleAdditionalConstraint std::set hours; unsigned int globalIndex = 0; unsigned int localIndex = 0; - bool isValidHoursRange() const; }; @@ -43,6 +42,7 @@ struct AdditionalConstraints std::string cluster_id; std::string variable; std::string operatorType; + bool enabled = true; // TODO a lot unused entries // std::array rhs = {}; std::vector rhs; @@ -55,6 +55,9 @@ struct AdditionalConstraints std::string error_msg; }; + // Number of enabled constraints + std::size_t enabledConstraints() const; + ValidateResult validate() const; private: diff --git a/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp b/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp index 6a3df8996f..edc8d4d227 100644 --- a/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp +++ b/src/libs/antares/study/parts/short-term-storage/additionalConstraints.cpp @@ -72,4 +72,9 @@ bool AdditionalConstraints::isValidOperatorType() const { return operatorType == "less" || operatorType == "equal" || operatorType == "greater"; } + +std::size_t AdditionalConstraints::enabledConstraints() const +{ + return enabled ? constraints.size() : 0; +} } // namespace Antares::Data::ShortTermStorage diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 73d3a611f5..f26aff9929 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -107,12 +107,13 @@ static void loadHours(const std::string& hoursStr, AdditionalConstraints& additi } } -static bool readRHS(AdditionalConstraints& additionalConstraints, - const fs::path& rhsPath) +static bool readRHS(AdditionalConstraints& additionalConstraints, const fs::path& rhsPath) { - const auto ret = loadFile(rhsPath, - additionalConstraints.rhs); - if (ret) { fillIfEmpty(additionalConstraints.rhs, 0.0); } + const auto ret = loadFile(rhsPath, additionalConstraints.rhs); + if (ret) + { + fillIfEmpty(additionalConstraints.rhs, 0.0); + } return ret; } @@ -141,6 +142,10 @@ bool STStorageInput::loadAdditionalConstraints(const fs::path& parentPath) value.to(clusterName); additionalConstraints.cluster_id = transformNameIntoID(clusterName); } + else if (key == "enabled") + { + value.to(additionalConstraints.enabled); + } else if (key == "variable") { value.to(additionalConstraints.variable); @@ -155,13 +160,19 @@ bool STStorageInput::loadAdditionalConstraints(const fs::path& parentPath) } } - if (const auto rhsPath = parentPath / ( - "rhs_" + additionalConstraints.name - + ".txt"); !readRHS(additionalConstraints, rhsPath)) + // We don't want load RHS and link the STS time if the constraint is disabled + if (!additionalConstraints.enabled) + { + return true; + } + + if (const auto rhsPath = parentPath / ("rhs_" + additionalConstraints.name + ".txt"); + !readRHS(additionalConstraints, rhsPath)) { logs.error() << "Error while reading rhs file: " << rhsPath; return false; } + if (auto [ok, error_msg] = additionalConstraints.validate(); !ok) { logs.error() << "Invalid constraint in section: " << section->name; @@ -242,7 +253,7 @@ std::size_t STStorageInput::cumulativeConstraintCount() const cluster.additionalConstraints.end(), 0, [](size_t inner_constraint_count, const auto& additionalConstraints) - { return inner_constraint_count + additionalConstraints.constraints.size(); }); + { return inner_constraint_count + additionalConstraints.enabledConstraints(); }); }); } diff --git a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp index 34b1c5928a..3354ce29ce 100644 --- a/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp +++ b/src/solver/optimisation/constraints/ShortTermStorageCumulation.cpp @@ -27,9 +27,7 @@ class CumulationConstraint { public: - virtual void build( - unsigned int index) const - = 0; + virtual void build(unsigned int index) const = 0; virtual std::string name() const = 0; virtual ~CumulationConstraint() = default; @@ -38,13 +36,12 @@ class CumulationConstraint class WithdrawalCumulationConstraint: public CumulationConstraint { public: - WithdrawalCumulationConstraint(ConstraintBuilder& builder) : builder(builder) + WithdrawalCumulationConstraint(ConstraintBuilder& builder): + builder(builder) { } - void build( - unsigned int index - ) const override + void build(unsigned int index) const override { builder.ShortTermStorageWithdrawal(index, 1.0); } @@ -62,12 +59,12 @@ class WithdrawalCumulationConstraint: public CumulationConstraint class InjectionCumulationConstraint: public CumulationConstraint { public: - InjectionCumulationConstraint(ConstraintBuilder& builder): builder(builder) + InjectionCumulationConstraint(ConstraintBuilder& builder): + builder(builder) { } - void build( - unsigned int index) const override + void build(unsigned int index) const override { builder.ShortTermStorageInjection(index, 1.0); } @@ -85,20 +82,18 @@ class InjectionCumulationConstraint: public CumulationConstraint class NettingCumulationConstraint: public CumulationConstraint { public: - NettingCumulationConstraint(ConstraintBuilder& builder, - const ::ShortTermStorage::PROPERTIES& - short_term_storage_properties) : builder(builder), - short_term_storage_properties( - short_term_storage_properties) + NettingCumulationConstraint( + ConstraintBuilder& builder, + const ::ShortTermStorage::PROPERTIES& short_term_storage_properties): + builder(builder), + short_term_storage_properties(short_term_storage_properties) { } - void build( - unsigned int index) const override + void build(unsigned int index) const override { builder.ShortTermStorageInjection(index, short_term_storage_properties.injectionEfficiency) - .ShortTermStorageWithdrawal(index, - -short_term_storage_properties.withdrawalEfficiency); + .ShortTermStorageWithdrawal(index, -short_term_storage_properties.withdrawalEfficiency); } std::string name() const override @@ -113,9 +108,9 @@ class NettingCumulationConstraint: public CumulationConstraint }; std::unique_ptr cumulationConstraintFactory( - const std::string& variable, - ConstraintBuilder& builder, - const ShortTermStorage::PROPERTIES& short_term_storage_properties) + const std::string& variable, + ConstraintBuilder& builder, + const ShortTermStorage::PROPERTIES& short_term_storage_properties) { if (variable == "withdrawal") { @@ -127,8 +122,8 @@ std::unique_ptr cumulationConstraintFactory( } else if (variable == "netting") { - return std::make_unique< - NettingCumulationConstraint>(builder, short_term_storage_properties); + return std::make_unique(builder, + short_term_storage_properties); } throw std::invalid_argument("Invalid cumulation constraint type"); } @@ -162,17 +157,16 @@ void ShortTermStorageCumulation::add(int pays) // var = injection for InjectionCumulationConstraint // var = withdrawal for WithdrawalCumulationConstraint // var = injectionEfficiency * injection - withdrawalEfficiency * withdrawal for Netting - auto cumulationConstraint = cumulationConstraintFactory( - additionalConstraints.variable, - builder, - storage); + auto cumulationConstraint = cumulationConstraintFactory(additionalConstraints.variable, + builder, + storage); for (const auto& [hours, globalIndex, localIndex]: additionalConstraints.constraints) { namer.ShortTermStorageCumulation(cumulationConstraint->name(), builder.data.nombreDeContraintes, storage.name, additionalConstraints.name + "_" - + std::to_string(localIndex)); + + std::to_string(localIndex)); const auto index = storage.clusterGlobalIndex; data.CorrespondanceCntNativesCntOptimHebdomadaires .ShortTermStorageCumulation[globalIndex] diff --git a/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp b/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp index 0f5c0e095f..19f3f26ec9 100644 --- a/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp +++ b/src/solver/optimisation/opt_decompte_variables_et_contraintes.cpp @@ -249,8 +249,8 @@ int OPT_DecompteDesVariablesEtDesContraintesDuProblemeAOptimiser(PROBLEME_HEBDO* { for (const auto& additionalConstraints: storage.additionalConstraints) { - ProblemeAResoudre->NombreDeContraintes += additionalConstraints.constraints - .size(); + ProblemeAResoudre->NombreDeContraintes += additionalConstraints + .enabledConstraints(); } } } diff --git a/src/solver/simulation/sim_calcul_economique.cpp b/src/solver/simulation/sim_calcul_economique.cpp index 00140e1553..d9166226f1 100644 --- a/src/solver/simulation/sim_calcul_economique.cpp +++ b/src/solver/simulation/sim_calcul_economique.cpp @@ -60,15 +60,20 @@ static void importShortTermStorages( toInsert.penalizeVariationInjection = st.properties.penalizeVariationInjection; toInsert.penalizeVariationWithdrawal = st.properties.penalizeVariationWithdrawal; toInsert.name = st.properties.name; - toInsert.additionalConstraints = st.additionalConstraints; - for (auto& additionalConstraints: toInsert.additionalConstraints) + for (const auto& constraint: st.additionalConstraints) { - for (auto& [_, globalIndex, __]: additionalConstraints.constraints) + if (constraint.enabled) { - globalIndex = constraintGlobalIndex; - ++constraintGlobalIndex; + auto newConstraint = constraint; + for (auto& c: newConstraint.constraints) + { + c.globalIndex = constraintGlobalIndex; + ++constraintGlobalIndex; + } + toInsert.additionalConstraints.push_back(std::move(newConstraint)); } } + toInsert.series = st.series; // TODO add missing properties, or use the same struct diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 67a6fc7d52..2c0134b0ab 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -886,7 +886,7 @@ BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinations, BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinationsFromFile, bdata::make({"injection", "withdrawal", "netting"}) - ^ bdata::make({"less", "equal", "greater"}), + * bdata::make({"less", "equal", "greater"}), variable, op) { @@ -900,6 +900,7 @@ BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinationsFromFile, iniFile << "cluster=clustera\n"; iniFile << "variable=" << variable << "\n"; iniFile << "operator=" << op << "\n"; + iniFile << "enabled=true\n"; iniFile << "hours=[1,2,3]\n"; iniFile.close(); @@ -919,13 +920,14 @@ BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinationsFromFile, // Load constraints from the `.ini` file bool result = storageInput.loadAdditionalConstraints(testPath); + BOOST_CHECK_EQUAL(storageInput.cumulativeConstraintCount(), 1); // Assertions BOOST_CHECK_EQUAL(result, true); - // Validate loaded constraints auto& built_cluster = storageInput.storagesByIndex[0]; BOOST_REQUIRE_EQUAL(built_cluster.additionalConstraints.size(), 1); + const auto& loadedConstraint = built_cluster.additionalConstraints[0]; // Check variable, operator type, and rhs values @@ -943,4 +945,38 @@ BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinationsFromFile, } while (i < HOURS_PER_YEAR); } +BOOST_AUTO_TEST_CASE(Load_disabled) +{ + // Define the path for the test data + std::filesystem::path testPath = std::filesystem::temp_directory_path() / "test_data"; + std::filesystem::create_directory(testPath); + + // Write the `.ini` file for this test case + std::ofstream iniFile(testPath / "additional-constraints.ini"); + iniFile << "[constraint1]\n"; + iniFile << "cluster=clustera\n"; + iniFile << "variable=injection\n"; + iniFile << "operator=less\n"; + iniFile << "enabled=false\n"; + iniFile << "hours=[1,2,3]\n"; + iniFile.close(); + + + // Setup storage input and cluster + ShortTermStorage::STStorageInput storageInput; + ShortTermStorage::STStorageCluster cluster; + cluster.id = "clustera"; + storageInput.storagesByIndex.push_back(cluster); + + // Load constraints from the `.ini` file + bool result = storageInput.loadAdditionalConstraints(testPath); + BOOST_CHECK_EQUAL(storageInput.cumulativeConstraintCount(), 0); + + // Assertions + BOOST_CHECK_EQUAL(result, true); + // Validate loaded constraints + auto& built_cluster = storageInput.storagesByIndex[0]; + BOOST_REQUIRE_EQUAL(built_cluster.additionalConstraints.size(), 0); +} + BOOST_AUTO_TEST_SUITE_END() From fe5ec25e36650a4554778a4b8d61c201309aa6c2 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Mon, 6 Jan 2025 12:52:05 +0100 Subject: [PATCH 31/42] add robustness tests --- .../short-term-storage-input-output.cpp | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 67a6fc7d52..3991ab8ae1 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -640,6 +640,7 @@ BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_ValidHoursFormats) std::filesystem::remove_all(testPath); } + BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_MissingFile) { ShortTermStorage::STStorageInput storageInput; @@ -943,4 +944,34 @@ BOOST_DATA_TEST_CASE(Validate_AllVariableOperatorCombinationsFromFile, } while (i < HOURS_PER_YEAR); } + +BOOST_DATA_TEST_CASE(loadAdditionalConstraints_InvalidHoursFormat, + bdata::make({ + "[1, nol]", "[; 3,2,1]", "[1, 12345678901]", "[1, 12345", + "1]", "[1,]", "[1,,2]", "[a]", "[1, 2], , [3]" + }), + hours) +{ + std::filesystem::path testPath = getFolder() / "test_data"; + std::filesystem::create_directory(testPath); + + std::ofstream iniFile(testPath / "additional-constraints.ini"); + iniFile << "[constraint1]\n"; + iniFile << "cluster=cluster1\n"; + iniFile << "variable=injection\n"; + iniFile << "operator=less\n"; + iniFile << "hours=" << hours << "\n"; // Invalid formats + iniFile.close(); + + ShortTermStorage::STStorageInput storageInput; + ShortTermStorage::STStorageCluster cluster; + cluster.id = "cluster1"; + storageInput.storagesByIndex.push_back(cluster); + + bool result = storageInput.loadAdditionalConstraints(testPath); + BOOST_CHECK_EQUAL(result, false); + + std::filesystem::remove_all(testPath); +} + BOOST_AUTO_TEST_SUITE_END() From f78e9c5361dc440962ff352f2a3c1daf040885bb Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Mon, 6 Jan 2025 12:52:12 +0100 Subject: [PATCH 32/42] add robustness tests --- .../parts/short-term-storage/container.cpp | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 73d3a611f5..025a04a9f2 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -76,8 +76,16 @@ bool STStorageInput::createSTStorageClustersFromIniFile(const fs::path& path) return true; } -static void loadHours(const std::string& hoursStr, AdditionalConstraints& additionalConstraints) +static bool loadHours(const std::string& hoursStr, AdditionalConstraints& additionalConstraints) { + // Validate the entire string format + std::regex fullFormatRegex(R"(^(\[\d+(,\d+)*\])(,(\[\d+(,\d+)*\]))*$)"); + if (!std::regex_match(hoursStr, fullFormatRegex)) + { + logs.error() << "In constraint " << additionalConstraints.name + << ": Input string does not match the required format: " << hoursStr << '\n'; + return false; + } // Split the `hours` field into multiple groups std::regex groupRegex(R"(\[(.*?)\])"); // Match each group enclosed in square brackets @@ -91,11 +99,30 @@ static void loadHours(const std::string& hoursStr, AdditionalConstraints& additi std::stringstream ss(group); std::string hour; std::set hourSet; - + int hourVal; while (std::getline(ss, hour, ',')) { - int hourVal = std::stoi(hour); - hourSet.insert(hourVal); + try + { + hourVal = std::stoi(hour); + hourSet.insert(hourVal); + } + + catch (const std::invalid_argument& ex) + { + logs.error() << "In constraint " << additionalConstraints.name << + " Hours sets contains invalid values: " << hour << + "\n exception thrown: " << ex.what() << '\n'; + + return false; + } + catch (const std::out_of_range& ex) + { + logs.error() << "In constraint " << additionalConstraints.name << + " Hours sets contains out of range values: " << hour << + "\n exception thrown: " << ex.what() << '\n'; + return false; + } } if (!hourSet.empty()) { @@ -104,6 +131,7 @@ static void loadHours(const std::string& hoursStr, AdditionalConstraints& additi {.hours = hourSet, .localIndex = localIndex}); ++localIndex; } + return true; } } @@ -149,9 +177,9 @@ bool STStorageInput::loadAdditionalConstraints(const fs::path& parentPath) { value.to(additionalConstraints.operatorType); } - else if (key == "hours") + else if (key == "hours" && !loadHours(value.c_str(), additionalConstraints)) { - loadHours(value.c_str(), additionalConstraints); + return false; } } From 674155f6f714e8169ee53dee8622787ad9c63c0f Mon Sep 17 00:00:00 2001 From: Florian OMNES Date: Mon, 6 Jan 2025 12:59:21 +0100 Subject: [PATCH 33/42] Format --- .../study/parts/short-term-storage/container.cpp | 14 +++++++------- .../short-term-storage-input-output.cpp | 15 +++++++++------ 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 0d83d7d598..3b4f06a3f1 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -83,7 +83,7 @@ static bool loadHours(const std::string& hoursStr, AdditionalConstraints& additi if (!std::regex_match(hoursStr, fullFormatRegex)) { logs.error() << "In constraint " << additionalConstraints.name - << ": Input string does not match the required format: " << hoursStr << '\n'; + << ": Input string does not match the required format: " << hoursStr << '\n'; return false; } // Split the `hours` field into multiple groups @@ -110,17 +110,17 @@ static bool loadHours(const std::string& hoursStr, AdditionalConstraints& additi catch (const std::invalid_argument& ex) { - logs.error() << "In constraint " << additionalConstraints.name << - " Hours sets contains invalid values: " << hour << - "\n exception thrown: " << ex.what() << '\n'; + logs.error() << "In constraint " << additionalConstraints.name + << " Hours sets contains invalid values: " << hour + << "\n exception thrown: " << ex.what() << '\n'; return false; } catch (const std::out_of_range& ex) { - logs.error() << "In constraint " << additionalConstraints.name << - " Hours sets contains out of range values: " << hour << - "\n exception thrown: " << ex.what() << '\n'; + logs.error() << "In constraint " << additionalConstraints.name + << " Hours sets contains out of range values: " << hour + << "\n exception thrown: " << ex.what() << '\n'; return false; } } diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 0f48ea1a25..62d474a1d8 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -961,7 +961,6 @@ BOOST_AUTO_TEST_CASE(Load_disabled) iniFile << "hours=[1,2,3]\n"; iniFile.close(); - // Setup storage input and cluster ShortTermStorage::STStorageInput storageInput; ShortTermStorage::STStorageCluster cluster; @@ -979,12 +978,16 @@ BOOST_AUTO_TEST_CASE(Load_disabled) BOOST_REQUIRE_EQUAL(built_cluster.additionalConstraints.size(), 0); } - BOOST_DATA_TEST_CASE(loadAdditionalConstraints_InvalidHoursFormat, - bdata::make({ - "[1, nol]", "[; 3,2,1]", "[1, 12345678901]", "[1, 12345", - "1]", "[1,]", "[1,,2]", "[a]", "[1, 2], , [3]" - }), + bdata::make({"[1, nol]", + "[; 3,2,1]", + "[1, 12345678901]", + "[1, 12345", + "1]", + "[1,]", + "[1,,2]", + "[a]", + "[1, 2], , [3]"}), hours) { std::filesystem::path testPath = getFolder() / "test_data"; From d1dd983b10d3fdccc9d3a5befc426367e77315ae Mon Sep 17 00:00:00 2001 From: Florian OMNES Date: Mon, 6 Jan 2025 13:27:51 +0100 Subject: [PATCH 34/42] Fix build --- src/libs/antares/study/parts/short-term-storage/container.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 3b4f06a3f1..3483663e10 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -133,6 +133,7 @@ static bool loadHours(const std::string& hoursStr, AdditionalConstraints& additi } return true; } + return false; } static bool readRHS(AdditionalConstraints& additionalConstraints, const fs::path& rhsPath) From 87d36c6c786eb29fc60565bdf0e6fce16a70315c Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Mon, 6 Jan 2025 14:05:23 +0100 Subject: [PATCH 35/42] update --- .../antares/study/parts/short-term-storage/container.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 0d83d7d598..9835359e07 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -79,8 +79,9 @@ bool STStorageInput::createSTStorageClustersFromIniFile(const fs::path& path) static bool loadHours(const std::string& hoursStr, AdditionalConstraints& additionalConstraints) { // Validate the entire string format - std::regex fullFormatRegex(R"(^(\[\d+(,\d+)*\])(,(\[\d+(,\d+)*\]))*$)"); - if (!std::regex_match(hoursStr, fullFormatRegex)) + if (std::regex fullFormatRegex(R"(^(\[\d+(,\d+)*\])(,(\[\d+(,\d+)*\]))*$)"); !std::regex_match( + hoursStr, + fullFormatRegex)) { logs.error() << "In constraint " << additionalConstraints.name << ": Input string does not match the required format: " << hoursStr << '\n'; @@ -131,8 +132,8 @@ static bool loadHours(const std::string& hoursStr, AdditionalConstraints& additi {.hours = hourSet, .localIndex = localIndex}); ++localIndex; } - return true; } + return true; } static bool readRHS(AdditionalConstraints& additionalConstraints, const fs::path& rhsPath) From bd6b47b514351e4f09540e5a3f66107faa7b4229 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Mon, 6 Jan 2025 14:16:51 +0100 Subject: [PATCH 36/42] update vcpkg --- vcpkg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vcpkg b/vcpkg index 9d47b24eac..b322364f06 160000 --- a/vcpkg +++ b/vcpkg @@ -1 +1 @@ -Subproject commit 9d47b24eacbd1cd94f139457ef6cd35e5d92cc84 +Subproject commit b322364f06308bdd24823f9d8f03fe0cc86fd46f From 072d709dc345cc4165ff36e76053df73e6639a18 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Mon, 6 Jan 2025 14:29:53 +0100 Subject: [PATCH 37/42] eliminate spaces --- .../antares/study/parts/short-term-storage/container.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 4f9d6fe46d..54206917c2 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -76,8 +76,11 @@ bool STStorageInput::createSTStorageClustersFromIniFile(const fs::path& path) return true; } -static bool loadHours(const std::string& hoursStr, AdditionalConstraints& additionalConstraints) +static bool loadHours(const std::string& input_hoursStr, + AdditionalConstraints& additionalConstraints) { + auto hoursStr = input_hoursStr; + std::erase_if(hoursStr, ::isspace); // Validate the entire string format if (std::regex fullFormatRegex(R"(^(\[\d+(,\d+)*\])(,(\[\d+(,\d+)*\]))*$)"); !std::regex_match( hoursStr, From 89b260f9060e96e05c70ec416e5ec2a05f5fbea5 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Mon, 6 Jan 2025 14:46:05 +0100 Subject: [PATCH 38/42] avoidable string copy --- src/libs/antares/study/parts/short-term-storage/container.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index 54206917c2..cdbf200e1c 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -76,10 +76,9 @@ bool STStorageInput::createSTStorageClustersFromIniFile(const fs::path& path) return true; } -static bool loadHours(const std::string& input_hoursStr, +static bool loadHours(std::string hoursStr, AdditionalConstraints& additionalConstraints) { - auto hoursStr = input_hoursStr; std::erase_if(hoursStr, ::isspace); // Validate the entire string format if (std::regex fullFormatRegex(R"(^(\[\d+(,\d+)*\])(,(\[\d+(,\d+)*\]))*$)"); !std::regex_match( From 6634097229923e7493dee8f80c82d853b5b37703 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Mon, 6 Jan 2025 15:30:51 +0100 Subject: [PATCH 39/42] test white spaces --- .../short-term-storage-input-output.cpp | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 62d474a1d8..261868014d 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -979,15 +979,17 @@ BOOST_AUTO_TEST_CASE(Load_disabled) } BOOST_DATA_TEST_CASE(loadAdditionalConstraints_InvalidHoursFormat, - bdata::make({"[1, nol]", - "[; 3,2,1]", - "[1, 12345678901]", - "[1, 12345", - "1]", - "[1,]", - "[1,,2]", - "[a]", - "[1, 2], , [3]"}), + bdata::make({"","[]", "[ ]", "[\t]", + "[\r]", "[\f]", "[\v]" + ,"[1, nol]", + "[; 3,2,1]", + "[1, 12345678901]", + "[1, 12345", + "1]", + "[1,]", + "[1,,2]", + "[a]", + "[1, 2], , [3]"}), hours) { std::filesystem::path testPath = getFolder() / "test_data"; From a1f7df793781f766e37d7db1ccc5dd17b726d01f Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Mon, 6 Jan 2025 15:45:01 +0100 Subject: [PATCH 40/42] test valid white spaces --- .../short-term-storage-input-output.cpp | 58 ++++++++++++------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 261868014d..8b22da2411 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -616,29 +616,7 @@ BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_InvalidHours) std::filesystem::remove_all(testPath); } -BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_ValidHoursFormats) -{ - std::filesystem::path testPath = getFolder() / "test_data"; - std::filesystem::create_directory(testPath); - - std::ofstream iniFile(testPath / "additional-constraints.ini"); - iniFile << "[constraint1]\n"; - iniFile << "cluster=cluster1\n"; - iniFile << "variable=injection\n"; - iniFile << "operator=less\n"; - iniFile << "hours=[1],[1],[3,2,1]\n"; // Valid formats - iniFile.close(); - - ShortTermStorage::STStorageInput storageInput; - ShortTermStorage::STStorageCluster cluster; - cluster.id = "cluster1"; - storageInput.storagesByIndex.push_back(cluster); - bool result = storageInput.loadAdditionalConstraints(testPath); - BOOST_CHECK_EQUAL(result, true); - - std::filesystem::remove_all(testPath); -} BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_MissingFile) { @@ -1014,4 +992,40 @@ BOOST_DATA_TEST_CASE(loadAdditionalConstraints_InvalidHoursFormat, std::filesystem::remove_all(testPath); } +BOOST_DATA_TEST_CASE(loadAdditionalConstraints_ValidHoursFormats, + bdata::make({ + "[1],[1],[3,2,1]", + "[\r1,\t2]", + "[\v1\f,\t2],\f\v\t[4]", + "[\f\v1]\t\t", + "\t\v\t[1 ], [ 1, 2,3] " + , + " [4,5 ]" + , + "[1 2 3 , 11 3]" + }), + hours) +{ + std::filesystem::path testPath = getFolder() / "test_data"; + std::filesystem::create_directory(testPath); + + std::ofstream iniFile(testPath / "additional-constraints.ini"); + iniFile << "[constraint1]\n"; + iniFile << "cluster=cluster1\n"; + iniFile << "variable=injection\n"; + iniFile << "operator=less\n"; + iniFile << "hours=" << hours << "\n"; // Valid formats + iniFile.close(); + + ShortTermStorage::STStorageInput storageInput; + ShortTermStorage::STStorageCluster cluster; + cluster.id = "cluster1"; + storageInput.storagesByIndex.push_back(cluster); + + bool result = storageInput.loadAdditionalConstraints(testPath); + BOOST_CHECK_EQUAL(result, true); + + std::filesystem::remove_all(testPath); +} + BOOST_AUTO_TEST_SUITE_END() From eb6477580caa1bce1681678351336eac72e71657 Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Mon, 6 Jan 2025 15:48:03 +0100 Subject: [PATCH 41/42] format --- .../parts/short-term-storage/container.cpp | 8 ++- .../short-term-storage-input-output.cpp | 53 ++++++++++--------- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/libs/antares/study/parts/short-term-storage/container.cpp b/src/libs/antares/study/parts/short-term-storage/container.cpp index cdbf200e1c..4c8e17ba3a 100644 --- a/src/libs/antares/study/parts/short-term-storage/container.cpp +++ b/src/libs/antares/study/parts/short-term-storage/container.cpp @@ -76,14 +76,12 @@ bool STStorageInput::createSTStorageClustersFromIniFile(const fs::path& path) return true; } -static bool loadHours(std::string hoursStr, - AdditionalConstraints& additionalConstraints) +static bool loadHours(std::string hoursStr, AdditionalConstraints& additionalConstraints) { std::erase_if(hoursStr, ::isspace); // Validate the entire string format - if (std::regex fullFormatRegex(R"(^(\[\d+(,\d+)*\])(,(\[\d+(,\d+)*\]))*$)"); !std::regex_match( - hoursStr, - fullFormatRegex)) + if (std::regex fullFormatRegex(R"(^(\[\d+(,\d+)*\])(,(\[\d+(,\d+)*\]))*$)"); + !std::regex_match(hoursStr, fullFormatRegex)) { logs.error() << "In constraint " << additionalConstraints.name << ": Input string does not match the required format: " << hoursStr << '\n'; diff --git a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp index 8b22da2411..d4340dce12 100644 --- a/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp +++ b/src/tests/src/libs/antares/study/short-term-storage-input/short-term-storage-input-output.cpp @@ -616,8 +616,6 @@ BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_InvalidHours) std::filesystem::remove_all(testPath); } - - BOOST_AUTO_TEST_CASE(loadAdditionalConstraints_MissingFile) { ShortTermStorage::STStorageInput storageInput; @@ -957,17 +955,22 @@ BOOST_AUTO_TEST_CASE(Load_disabled) } BOOST_DATA_TEST_CASE(loadAdditionalConstraints_InvalidHoursFormat, - bdata::make({"","[]", "[ ]", "[\t]", - "[\r]", "[\f]", "[\v]" - ,"[1, nol]", - "[; 3,2,1]", - "[1, 12345678901]", - "[1, 12345", - "1]", - "[1,]", - "[1,,2]", - "[a]", - "[1, 2], , [3]"}), + bdata::make({"", + "[]", + "[ ]", + "[\t]", + "[\r]", + "[\f]", + "[\v]", + "[1, nol]", + "[; 3,2,1]", + "[1, 12345678901]", + "[1, 12345", + "1]", + "[1,]", + "[1,,2]", + "[a]", + "[1, 2], , [3]"}), hours) { std::filesystem::path testPath = getFolder() / "test_data"; @@ -992,19 +995,17 @@ BOOST_DATA_TEST_CASE(loadAdditionalConstraints_InvalidHoursFormat, std::filesystem::remove_all(testPath); } -BOOST_DATA_TEST_CASE(loadAdditionalConstraints_ValidHoursFormats, - bdata::make({ - "[1],[1],[3,2,1]", - "[\r1,\t2]", - "[\v1\f,\t2],\f\v\t[4]", - "[\f\v1]\t\t", - "\t\v\t[1 ], [ 1, 2,3] " - , - " [4,5 ]" - , - "[1 2 3 , 11 3]" - }), - hours) +BOOST_DATA_TEST_CASE( + loadAdditionalConstraints_ValidHoursFormats, + bdata::make( + {"[1],[1],[3,2,1]", + "[\r1,\t2]", + "[\v1\f,\t2],\f\v\t[4]", + "[\f\v1]\t\t", + "\t\v\t[1 ], [ 1, 2,3] ", + " [4,5 ]", + "[1 2 3 , 11 3]"}), + hours) { std::filesystem::path testPath = getFolder() / "test_data"; std::filesystem::create_directory(testPath); From 189d1b393f67d2f3511d3d2b94b8d0c4eb0974ef Mon Sep 17 00:00:00 2001 From: Abdoulbari Zakir Date: Mon, 6 Jan 2025 15:50:15 +0100 Subject: [PATCH 42/42] remove comments --- .../study/parts/short-term-storage/additionalConstraints.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libs/antares/study/include/antares/study/parts/short-term-storage/additionalConstraints.h b/src/libs/antares/study/include/antares/study/parts/short-term-storage/additionalConstraints.h index 081ca0d516..5804261157 100644 --- a/src/libs/antares/study/include/antares/study/parts/short-term-storage/additionalConstraints.h +++ b/src/libs/antares/study/include/antares/study/parts/short-term-storage/additionalConstraints.h @@ -43,8 +43,6 @@ struct AdditionalConstraints std::string variable; std::string operatorType; bool enabled = true; - // TODO a lot unused entries - // std::array rhs = {}; std::vector rhs; std::vector constraints;