21 #ifndef __SOLVER_VARIABLE_SURVEYRESULTS_REPORT_BUILDER_HXX__
22 #define __SOLVER_VARIABLE_SURVEYRESULTS_REPORT_BUILDER_HXX__
26 #include <yuni/yuni.h>
27 #include <yuni/core/static/types.h>
28 #include <yuni/core/string.h>
29 #include <yuni/io/directory.h>
31 #include <antares/logs/logs.h>
32 #include <antares/study/filter.h>
34 #include "../categories.h"
35 #include "../endoflist.h"
37 #include "../surveyresults.h"
39 namespace Antares::Solver::Variable::Container
43 template<
class NextT,
int CDataLevel,
int CFile = 1>
44 struct VariablesStatsByDataLevel
48 nextFileLevel = (CFile * 2 > (int)Category::FileLevel::maxFileLevel) ? 1 : CFile * 2,
49 currentVariableCount = NextT::template Statistics < CDataLevel,
51 nextVariableCount = VariablesStatsByDataLevel < NextT,
53 nextFileLevel > ::count,
56 count = (int)currentVariableCount + (
int)nextVariableCount,
60 template<
class NextT,
int CDataLevel>
61 struct VariablesStatsByDataLevel<NextT, CDataLevel, Category::FileLevel::maxFileLevel>
69 template<
class NextT,
int CDataLevel = 1,
int CFile = 1>
70 struct BrowseAllVariables
74 nextFileLevel = (CFile * 2 > (int)Category::FileLevel::maxFileLevel) ? 1 : CFile * 2,
75 nextDataLevel = (CDataLevel * 2 > (int)Category::DataLevel::maxDataLevel) ? 1
77 currentValue = NextT::template Statistics < CDataLevel,
79 nextValue = BrowseAllVariables < NextT,
81 nextFileLevel > ::maxValue,
83 maxValue = (currentValue > (int)nextValue) ? currentValue : (int)nextValue,
86 template<
class L,
class S>
87 static void buildSurveyResults(
const L& list, S& results)
90 list.template buildSurveyResults<S, CDataLevel, CFile>(results);
92 BrowseAllVariables<NextT, nextDataLevel, nextFileLevel>::template buildSurveyResults<L, S>(
99 struct BrowseAllVariables<NextT,
100 Category::DataLevel::maxDataLevel,
101 Category::FileLevel::maxFileLevel>
105 maxValue = NextT::template Statistics < Category::DataLevel::maxDataLevel,
106 Category::FileLevel::maxFileLevel > ::count
109 template<
class L,
class S>
110 static void buildSurveyResults(
const L& list, S& results)
113 list.template buildSurveyResults<S,
114 Category::DataLevel::maxDataLevel,
115 Category::FileLevel::maxFileLevel>(results);
120 template<
bool GlobalT,
class NextT,
int CDataLevel,
int CFile = 1>
121 class SurveyReportBuilderFile
124 using ListType = NextT;
129 globalResults = (GlobalT) ? 1 : 0,
131 nextFileLevel = CFile * 2,
134 static void Run(
const ListType& list, SurveyResults& results,
unsigned int numSpace)
138 RunGlobalResults(list, results);
142 RunAnnual(list, results, numSpace);
146 using SurveyRBFileType = SurveyReportBuilderFile<GlobalT, NextT, CDataLevel, nextFileLevel>;
148 SurveyRBFileType::Run(list, results, numSpace);
152 static void RunGlobalResults(
const ListType& list, SurveyResults& results)
155 list.buildSurveyReport(results, CDataLevel, CFile, Category::hourly);
157 list.buildSurveyReport(results, CDataLevel, CFile, Category::daily);
159 list.buildSurveyReport(results, CDataLevel, CFile, Category::weekly);
161 list.buildSurveyReport(results, CDataLevel, CFile, Category::monthly);
163 list.buildSurveyReport(results, CDataLevel, CFile, Category::annual);
166 static void RunAnnual(
const ListType& list, SurveyResults& results,
unsigned int numSpace)
169 list.buildAnnualSurveyReport(results, CDataLevel, CFile, Category::hourly, numSpace);
171 list.buildAnnualSurveyReport(results, CDataLevel, CFile, Category::daily, numSpace);
173 list.buildAnnualSurveyReport(results, CDataLevel, CFile, Category::weekly, numSpace);
175 list.buildAnnualSurveyReport(results, CDataLevel, CFile, Category::monthly, numSpace);
177 list.buildAnnualSurveyReport(results, CDataLevel, CFile, Category::annual, numSpace);
183 template<
bool GlobalT,
class NextT,
int N>
184 class SurveyReportBuilderFile<GlobalT, NextT, N, 2 * Category::FileLevel::maxFileLevel>
187 using ListType = NextT;
190 static inline void Run(
const ListType&, SurveyResults&,
unsigned int)
195 template<
bool GlobalT,
class NextT,
int CDataLevel = 1>
196 class SurveyReportBuilder
200 using ListType = NextT;
204 nextDataLevel = CDataLevel * 2,
207 static void Run(
const ListType& list, SurveyResults& results,
unsigned int numSpace = 9999)
210 if (CDataLevel & Category::DataLevel::area || CDataLevel & Category::DataLevel::link
211 || CDataLevel & Category::DataLevel::thermalAggregate)
213 RunForEachArea(list, results, numSpace);
217 if (CDataLevel & Category::DataLevel::setOfAreas)
219 RunForEachSetOfAreas(list, results, numSpace);
223 if (CDataLevel & Category::DataLevel::bindingConstraint)
225 RunForEachBindingConstraint(list, results, numSpace);
229 SurveyReportBuilder<GlobalT, NextT, nextDataLevel>::Run(list, results, numSpace);
232 static void RunDigest(
const ListType& list, SurveyResults& results, IResultWriter& writer)
234 logs.info() <<
"Exporting digest...";
235 logs.debug() <<
" . Digest, truncating file";
237 logs.debug() <<
" . Digest, annual";
240 std::string digestBuffer;
241 list.buildDigest(results, Category::digestAllYears, Category::DataLevel::area);
242 results.exportDigestAllYears(digestBuffer);
245 list.buildDigest(results, Category::digestAllYears, Category::DataLevel::setOfAreas);
246 results.exportDigestAllYears(digestBuffer);
249 if (results.data.study.parameters.variablesPrintInfo.isPrinted(
"FLOW LIN."))
251 logs.debug() <<
" . Digest, flow linear";
252 results.data.matrix.fill(std::numeric_limits<double>::quiet_NaN());
253 list.buildDigest(results, Category::digestFlowLinear, Category::DataLevel::area);
254 results.exportDigestMatrix(
"Links (FLOW LIN.)", digestBuffer);
258 if (results.data.study.parameters.variablesPrintInfo.isPrinted(
"FLOW QUAD."))
260 logs.debug() <<
" . Digest, flow quad";
261 results.data.matrix.fill(std::numeric_limits<double>::quiet_NaN());
262 list.buildDigest(results, Category::digestFlowQuad, Category::DataLevel::area);
263 results.exportDigestMatrix(
"Links (FLOW QUAD.)", digestBuffer);
266 YString digestFileName;
267 std::filesystem::path path =
static_cast<std::string
>(results.data.originalOutput);
269 path /=
"digest.txt";
270 writer.addEntryFromBuffer(path, digestBuffer);
274 static void RunForEachArea(
const ListType& list, SurveyResults& results,
unsigned int numSpace)
276 using namespace Yuni;
279 uint selectedZonalVarsCount = results.data.study.parameters.variablesPrintInfo
280 .getNbSelectedZonalVars();
284 auto end = results.data.study.areas.end();
285 for (
auto i = results.data.study.areas.begin(); i != end; ++i)
287 auto& area = *(i->second);
289 results.data.area = &area;
291 results.data.thermalCluster =
nullptr;
293 results.data.link =
nullptr;
298 bool printingSynthesis = GlobalT;
299 bool filterAllYearByYear = !(area.filterYearByYear & Data::filterAll);
300 bool filterAllSynthesis = !(area.filterSynthesis & Data::filterAll);
305 bool skipDirectory = (!printingSynthesis && filterAllYearByYear)
306 || (printingSynthesis && filterAllSynthesis);
310 skipDirectory = skipDirectory || !selectedZonalVarsCount;
313 if (CDataLevel & Category::DataLevel::area && !skipDirectory)
315 logs.info() <<
"Exporting results : " << area.name;
317 std::filesystem::path path =
static_cast<std::string
>(results.data.originalOutput);
319 path /= area.id.to<std::string>();
321 results.data.output = path.string();
322 SurveyReportBuilderFile<GlobalT, NextT, CDataLevel>::Run(list, results, numSpace);
326 if (CDataLevel & Category::DataLevel::thermalAggregate)
328 RunForEachThermalCluster(list, results, numSpace);
331 if (CDataLevel & Category::DataLevel::link && !area.links.empty())
333 RunForEachLink(list, results, numSpace);
338 static void RunForEachThermalCluster(
const ListType& list,
339 SurveyResults& results,
340 unsigned int numSpace)
344 if (VariablesStatsByDataLevel<NextT, Category::DataLevel::thermalAggregate>::count)
346 auto& area = *results.data.area;
347 for (
auto& cluster: area.thermal.list.each_enabled_and_not_mustrun())
349 results.data.thermalCluster = cluster.get();
351 logs.info() <<
"Exporting results : " << area.name <<
" :: " << cluster->name();
353 std::filesystem::path path =
static_cast<std::string
>(results.data.originalOutput);
354 path /= std::filesystem::path(
"areas") / area.id.to<std::string>() /
"thermal"
357 results.data.output = path.string();
359 SurveyReportBuilderFile<GlobalT, NextT, CDataLevel>::Run(list, results, numSpace);
364 static void RunForEachLink(
const ListType& list, SurveyResults& results,
unsigned int numSpace)
366 using namespace Yuni;
369 uint selectedLinkVarsCount = results.data.study.parameters.variablesPrintInfo
370 .getNbSelectedLinkVars();
371 if (!selectedLinkVarsCount)
376 int count_int = VariablesStatsByDataLevel<NextT, Category::DataLevel::link>::count;
379 auto& area = *results.data.area;
380 auto end = area.links.end();
381 for (
auto i = area.links.begin(); i != end; ++i)
384 auto& link = *(i->second);
385 results.data.link = &link;
390 bool printingSynthesis = GlobalT;
392 bool filterAllYearByYear = !(link.filterYearByYear & Data::filterAll);
393 bool filterAllSynthesis = !(link.filterSynthesis & Data::filterAll);
398 bool skipDirectory = (!printingSynthesis && filterAllYearByYear)
399 || (printingSynthesis && filterAllSynthesis);
403 Antares::logs.info() <<
"Exporting results : " << area.name <<
" - "
404 << results.data.link->with->name;
406 std::filesystem::path path =
static_cast<std::string
>(
407 results.data.originalOutput);
408 std::string areaId =
static_cast<std::string
>(area.id) +
" - "
409 + results.data.link->with->id;
410 path /= std::filesystem::path(
"links") / areaId;
412 results.data.output = path.string();
414 SurveyReportBuilderFile<GlobalT, NextT, CDataLevel>::Run(list,
422 static void RunForEachSetOfAreas(
const ListType& list,
423 SurveyResults& results,
424 unsigned int numSpace)
426 using namespace ::Antares;
427 using namespace ::Yuni;
431 uint selectedZonalVarsCount = results.data.study.parameters.variablesPrintInfo
432 .getNbSelectedZonalVars();
433 if (!selectedZonalVarsCount)
438 results.data.area =
nullptr;
439 results.data.thermalCluster =
nullptr;
440 results.data.link =
nullptr;
445 unsigned int indx = 0;
446 for (
unsigned int i = 0; i != sets.size(); ++i)
453 logs.info() <<
"Exporting results : " << sets.caption(i);
455 std::filesystem::path path =
static_cast<std::string
>(results.data.originalOutput);
456 std::string setId =
"@ " + sets.nameByIndex(i);
457 path /= std::filesystem::path(
"areas") / setId;
459 results.data.output = path.string();
460 results.data.setOfAreasIndex = indx++;
462 SurveyReportBuilderFile<GlobalT, NextT, CDataLevel>::Run(list, results, numSpace);
466 static void RunForEachBindingConstraint(
const ListType& list,
467 SurveyResults& results,
468 unsigned int numSpace)
470 using namespace Yuni;
473 if (CDataLevel & Category::DataLevel::bindingConstraint)
475 logs.info() <<
"Exporting results : binding constraints";
477 std::filesystem::path path =
static_cast<std::string
>(results.data.originalOutput);
478 path /=
"binding_constraints";
480 results.data.output = path.string();
481 SurveyReportBuilderFile<GlobalT, NextT, CDataLevel>::Run(list, results, numSpace);
487 template<
bool GlobalT,
class NextT>
488 class SurveyReportBuilder<GlobalT, NextT, 2 * Category::DataLevel::maxDataLevel>
491 using ListType = NextT;
494 static void Run(
const ListType&, SurveyResults&,
unsigned int)
bool hasOutput(const Yuni::ShortString128 &s) const
Get if the results for a given group should be written to the output.
Definition: sets.cpp:360
uint resultSize(const Yuni::ShortString128 &s) const
Get the size of a result set.
Definition: sets.cpp:371