21#ifndef __SOLVER_VARIABLE_SURVEYRESULTS_REPORT_BUILDER_HXX__
22#define __SOLVER_VARIABLE_SURVEYRESULTS_REPORT_BUILDER_HXX__
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"
49template<
class NextT,
int CDataLevel,
int CFile = 1>
50struct VariablesStatsByDataLevel
54 nextFileLevel = (CFile * 2 > (int)Category::FileLevel::maxFileLevel) ? 1 : CFile * 2,
55 currentVariableCount = NextT::template Statistics < CDataLevel,
57 nextVariableCount = VariablesStatsByDataLevel < NextT,
59 nextFileLevel > ::count,
62 count = (int)currentVariableCount + (int)nextVariableCount,
66template<
class NextT,
int CDataLevel>
67struct VariablesStatsByDataLevel<NextT, CDataLevel, Category::FileLevel::maxFileLevel>
75template<
class NextT,
int CDataLevel = 1,
int CFile = 1>
76struct BrowseAllVariables
80 nextFileLevel = (CFile * 2 > (int)Category::FileLevel::maxFileLevel) ? 1 : CFile * 2,
81 nextDataLevel = (CDataLevel * 2 > (int)Category::DataLevel::maxDataLevel) ? 1
83 currentValue = NextT::template Statistics < CDataLevel,
85 nextValue = BrowseAllVariables < NextT,
87 nextFileLevel > ::maxValue,
89 maxValue = (currentValue > (int)nextValue) ? currentValue : (int)nextValue,
92 template<
class L,
class S>
93 static void buildSurveyResults(
const L& list, S& results)
96 list.template buildSurveyResults<S, CDataLevel, CFile>(results);
98 BrowseAllVariables<NextT, nextDataLevel, nextFileLevel>::template buildSurveyResults<L, S>(
105struct BrowseAllVariables<NextT,
106 Category::DataLevel::maxDataLevel,
107 Category::FileLevel::maxFileLevel>
111 maxValue = NextT::template Statistics < Category::DataLevel::maxDataLevel,
112 Category::FileLevel::maxFileLevel > ::count
115 template<
class L,
class S>
116 static void buildSurveyResults(
const L& list, S& results)
119 list.template buildSurveyResults<S,
120 Category::DataLevel::maxDataLevel,
121 Category::FileLevel::maxFileLevel>(results);
126template<
bool GlobalT,
class NextT,
int CDataLevel,
int CFile = 1>
127class SurveyReportBuilderFile
130 using ListType = NextT;
135 globalResults = (GlobalT) ? 1 : 0,
137 nextFileLevel = CFile * 2,
140 static void Run(
const ListType& list, SurveyResults& results,
unsigned int numSpace)
144 RunGlobalResults(list, results);
148 RunAnnual(list, results, numSpace);
152 using SurveyRBFileType = SurveyReportBuilderFile<GlobalT, NextT, CDataLevel, nextFileLevel>;
154 SurveyRBFileType::Run(list, results, numSpace);
158 static void RunGlobalResults(
const ListType& list, SurveyResults& results)
161 list.buildSurveyReport(results, CDataLevel, CFile, Category::hourly);
163 list.buildSurveyReport(results, CDataLevel, CFile, Category::daily);
165 list.buildSurveyReport(results, CDataLevel, CFile, Category::weekly);
167 list.buildSurveyReport(results, CDataLevel, CFile, Category::monthly);
169 list.buildSurveyReport(results, CDataLevel, CFile, Category::annual);
172 static void RunAnnual(
const ListType& list, SurveyResults& results,
unsigned int numSpace)
175 list.buildAnnualSurveyReport(results, CDataLevel, CFile, Category::hourly, numSpace);
177 list.buildAnnualSurveyReport(results, CDataLevel, CFile, Category::daily, numSpace);
179 list.buildAnnualSurveyReport(results, CDataLevel, CFile, Category::weekly, numSpace);
181 list.buildAnnualSurveyReport(results, CDataLevel, CFile, Category::monthly, numSpace);
183 list.buildAnnualSurveyReport(results, CDataLevel, CFile, Category::annual, numSpace);
189template<
bool GlobalT,
class NextT,
int N>
190class SurveyReportBuilderFile<GlobalT, NextT, N, 2 * Category::FileLevel::maxFileLevel>
193 using ListType = NextT;
196 static inline void Run(
const ListType&, SurveyResults&,
unsigned int)
201template<
bool GlobalT,
class NextT,
int CDataLevel = 1>
202class SurveyReportBuilder
206 using ListType = NextT;
210 nextDataLevel = CDataLevel * 2,
213 static void Run(
const ListType& list, SurveyResults& results,
unsigned int numSpace = 9999)
216 if (CDataLevel & Category::DataLevel::area || CDataLevel & Category::DataLevel::link
217 || CDataLevel & Category::DataLevel::thermalAggregate)
219 RunForEachArea(list, results, numSpace);
223 if (CDataLevel & Category::DataLevel::setOfAreas)
225 RunForEachSetOfAreas(list, results, numSpace);
229 if (CDataLevel & Category::DataLevel::bindingConstraint)
231 RunForEachBindingConstraint(list, results, numSpace);
235 SurveyReportBuilder<GlobalT, NextT, nextDataLevel>::Run(list, results, numSpace);
238 static void RunDigest(
const ListType& list, SurveyResults& results, IResultWriter& writer)
240 logs.info() <<
"Exporting digest...";
241 logs.debug() <<
" . Digest, truncating file";
243 logs.debug() <<
" . Digest, annual";
246 std::string digestBuffer;
247 list.buildDigest(results, Category::digestAllYears, Category::DataLevel::area);
248 results.exportDigestAllYears(digestBuffer);
251 list.buildDigest(results, Category::digestAllYears, Category::DataLevel::setOfAreas);
252 results.exportDigestAllYears(digestBuffer);
255 if (results.data.study.parameters.variablesPrintInfo.isPrinted(
"FLOW LIN."))
257 logs.debug() <<
" . Digest, flow linear";
258 results.data.matrix.fill(std::numeric_limits<double>::quiet_NaN());
259 list.buildDigest(results, Category::digestFlowLinear, Category::DataLevel::area);
260 results.exportDigestMatrix(
"Links (FLOW LIN.)", digestBuffer);
264 if (results.data.study.parameters.variablesPrintInfo.isPrinted(
"FLOW QUAD."))
266 logs.debug() <<
" . Digest, flow quad";
267 results.data.matrix.fill(std::numeric_limits<double>::quiet_NaN());
268 list.buildDigest(results, Category::digestFlowQuad, Category::DataLevel::area);
269 results.exportDigestMatrix(
"Links (FLOW QUAD.)", digestBuffer);
272 YString digestFileName;
273 std::filesystem::path path =
static_cast<std::string
>(results.data.originalOutput);
275 path /=
"digest.txt";
276 writer.addEntryFromBuffer(path, digestBuffer);
280 static void RunForEachArea(
const ListType& list, SurveyResults& results,
unsigned int numSpace)
282 using namespace Yuni;
285 uint selectedZonalVarsCount = results.data.study.parameters.variablesPrintInfo
286 .getNbSelectedZonalVars();
290 auto end = results.data.study.areas.end();
291 for (
auto i = results.data.study.areas.begin(); i != end; ++i)
293 auto& area = *(i->second);
295 results.data.area = &area;
297 results.data.thermalCluster =
nullptr;
299 results.data.link =
nullptr;
304 bool printingSynthesis = GlobalT;
305 bool filterAllYearByYear = !(area.filterYearByYear & Data::filterAll);
306 bool filterAllSynthesis = !(area.filterSynthesis & Data::filterAll);
311 bool skipDirectory = (!printingSynthesis && filterAllYearByYear)
312 || (printingSynthesis && filterAllSynthesis);
316 skipDirectory = skipDirectory || !selectedZonalVarsCount;
319 if (CDataLevel & Category::DataLevel::area && !skipDirectory)
321 logs.info() <<
"Exporting results : " << area.name;
323 std::filesystem::path path =
static_cast<std::string
>(results.data.originalOutput);
325 path /= area.id.to<std::string>();
327 results.data.output = path.string();
328 SurveyReportBuilderFile<GlobalT, NextT, CDataLevel>::Run(list, results, numSpace);
332 if (CDataLevel & Category::DataLevel::thermalAggregate)
334 RunForEachThermalCluster(list, results, numSpace);
337 if (CDataLevel & Category::DataLevel::link && !area.links.empty())
339 RunForEachLink(list, results, numSpace);
344 static void RunForEachThermalCluster(
const ListType& list,
345 SurveyResults& results,
346 unsigned int numSpace)
350 if (VariablesStatsByDataLevel<NextT, Category::DataLevel::thermalAggregate>::count)
352 auto& area = *results.data.area;
353 for (
auto& cluster: area.thermal.list.each_enabled_and_not_mustrun())
355 results.data.thermalCluster = cluster.get();
357 logs.info() <<
"Exporting results : " << area.name <<
" :: " << cluster->name();
359 std::filesystem::path path =
static_cast<std::string
>(results.data.originalOutput);
360 path /= std::filesystem::path(
"areas") / area.id.to<std::string>() /
"thermal"
363 results.data.output = path.string();
365 SurveyReportBuilderFile<GlobalT, NextT, CDataLevel>::Run(list, results, numSpace);
370 static void RunForEachLink(
const ListType& list, SurveyResults& results,
unsigned int numSpace)
372 using namespace Yuni;
375 uint selectedLinkVarsCount = results.data.study.parameters.variablesPrintInfo
376 .getNbSelectedLinkVars();
377 if (!selectedLinkVarsCount)
382 int count_int = VariablesStatsByDataLevel<NextT, Category::DataLevel::link>::count;
385 auto& area = *results.data.area;
386 auto end = area.links.end();
387 for (
auto i = area.links.begin(); i != end; ++i)
390 auto& link = *(i->second);
391 results.data.link = &link;
396 bool printingSynthesis = GlobalT;
398 bool filterAllYearByYear = !(link.filterYearByYear & Data::filterAll);
399 bool filterAllSynthesis = !(link.filterSynthesis & Data::filterAll);
404 bool skipDirectory = (!printingSynthesis && filterAllYearByYear)
405 || (printingSynthesis && filterAllSynthesis);
409 Antares::logs.info() <<
"Exporting results : " << area.name <<
" - "
410 << results.data.link->with->name;
412 std::filesystem::path path =
static_cast<std::string
>(
413 results.data.originalOutput);
414 std::string areaId =
static_cast<std::string
>(area.id) +
" - "
415 + results.data.link->with->id;
416 path /= std::filesystem::path(
"links") / areaId;
418 results.data.output = path.string();
420 SurveyReportBuilderFile<GlobalT, NextT, CDataLevel>::Run(list,
428 static void RunForEachSetOfAreas(
const ListType& list,
429 SurveyResults& results,
430 unsigned int numSpace)
432 using namespace ::Antares;
433 using namespace ::Yuni;
437 uint selectedZonalVarsCount = results.data.study.parameters.variablesPrintInfo
438 .getNbSelectedZonalVars();
439 if (!selectedZonalVarsCount)
444 results.data.area =
nullptr;
445 results.data.thermalCluster =
nullptr;
446 results.data.link =
nullptr;
451 unsigned int indx = 0;
452 for (
unsigned int i = 0; i != sets.size(); ++i)
459 logs.info() <<
"Exporting results : " << sets.caption(i);
461 std::filesystem::path path =
static_cast<std::string
>(results.data.originalOutput);
462 std::string setId =
"@ " + sets.nameByIndex(i);
463 path /= std::filesystem::path(
"areas") / setId;
465 results.data.output = path.string();
466 results.data.setOfAreasIndex = indx++;
468 SurveyReportBuilderFile<GlobalT, NextT, CDataLevel>::Run(list, results, numSpace);
472 static void RunForEachBindingConstraint(
const ListType& list,
473 SurveyResults& results,
474 unsigned int numSpace)
476 using namespace Yuni;
479 if (CDataLevel & Category::DataLevel::bindingConstraint)
481 logs.info() <<
"Exporting results : binding constraints";
483 std::filesystem::path path =
static_cast<std::string
>(results.data.originalOutput);
484 path /=
"binding_constraints";
486 results.data.output = path.string();
487 SurveyReportBuilderFile<GlobalT, NextT, CDataLevel>::Run(list, results, numSpace);
493template<
bool GlobalT,
class NextT>
494class SurveyReportBuilder<GlobalT, NextT, 2 * Category::DataLevel::maxDataLevel>
497 using ListType = NextT;
500 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