21#ifndef __SOLVER_VARIABLE_VARIABLE_HXX__
22#define __SOLVER_VARIABLE_VARIABLE_HXX__
24#include <yuni/core/static/types.h>
26#include <antares/study/variable-print-info.h>
28namespace Antares::Solver::Variable
31template<
class ChildT,
class NextT,
class VCardT>
39 pColumnCount = VCardType::columnCount > 1 ? VCardType::columnCount : 1;
44 isNonApplicable =
new bool[pColumnCount];
46 isPrinted =
new bool[pColumnCount];
49 for (uint i = 0; i < pColumnCount; i++)
55template<
class ChildT,
class NextT,
class VCardT>
58 delete[] isNonApplicable;
62template<
class ChildT,
class NextT,
class VCardT>
66 NextType::initializeFromStudy(study);
69template<
class ChildT,
class NextT,
class VCardT>
74 VariableAccessorType::InitializeAndReset(results, study);
77template<
class ChildT,
class NextT,
class VCardT>
82 NextType::initializeFromArea(study, area);
85template<
class ChildT,
class NextT,
class VCardT>
90 NextType::initializeFromAreaLink(study, link);
93template<
class ChildT,
class NextT,
class VCardT>
100 NextType::initializeFromThermalCluster(study, area, cluster);
103template<
class ChildT,
class NextT,
class VCardT>
106 if (VCardType::isPossiblyNonApplicable != 0 && applyNonApplicable)
108 for (uint i = 0; i != pColumnCount; ++i)
110 isNonApplicable[i] =
true;
115 for (uint i = 0; i != pColumnCount; ++i)
117 isNonApplicable[i] =
false;
121 NextType::broadcastNonApplicability(applyNonApplicable);
124template<
class ChildT,
class NextT,
class VCardT>
128 NextType::simulationBegin();
131template<
class ChildT,
class NextT,
class VCardT>
134 NextType::simulationEnd();
137template<
class ChildT,
class NextT,
class VCardT>
140 return VCardT::ResultsType::count;
143template<
class ChildT,
class NextT,
class VCardT>
147 NextType::yearBegin(year);
150template<
class ChildT,
class NextT,
class VCardT>
154 NextType::yearEnd(year);
157template<
class ChildT,
class NextT,
class VCardT>
161 unsigned int numSpace)
164 NextType::yearEndSpatialAggregates(allVars, year, numSpace);
167template<
class ChildT,
class NextT,
class VCardT>
168template<
class V,
class SetT>
174 NextType::yearEndSpatialAggregates(allVars, year, set);
177template<
class ChildT,
class NextT,
class VCardT>
184 NextType::yearEndBuildPrepareDataForEachThermalCluster(state, year, numSpace);
187template<
class ChildT,
class NextT,
class VCardT>
192 NextType::simulationEndSpatialAggregates(allVars);
195template<
class ChildT,
class NextT,
class VCardT>
196template<
class V,
class SetT>
201 NextType::simulationEndSpatialAggregates(allVars, set);
204template<
class ChildT,
class NextT,
class VCardT>
208 NextType::weekBegin(state);
211template<
class ChildT,
class NextT,
class VCardT>
215 NextType::weekForEachArea(state, numSpace);
218template<
class ChildT,
class NextT,
class VCardT>
222 NextType::hourBegin(hourInTheYear);
225template<
class ChildT,
class NextT,
class VCardT>
229 NextType::hourForEachArea(state);
232template<
class ChildT,
class NextT,
class VCardT>
236 NextType::hourForEachArea(state, numSpace);
239template<
class ChildT,
class NextT,
class VCardT>
243 unsigned int numSpace)
246 NextType::yearEndBuildForEachThermalCluster(state, year, numSpace);
249template<
class ChildT,
class NextT,
class VCardT>
253 NextType::hourForEachLink(state, numSpace);
256template<
class ChildT,
class NextT,
class VCardT>
260 NextType::hourEnd(state, hourInTheYear);
263template<
class ChildT,
class NextT,
class VCardT>
267 NextType::weekEnd(state);
270template<
class ChildT,
class NextT,
class VCardT>
271inline void IVariable<ChildT, NextT, VCardT>::buildSurveyReport(SurveyResults& results,
278 if (0 != ResultsType::count)
281 if ((dataLevel & VCardType::categoryDataLevel) && (fileLevel & VCardType::categoryFileLevel)
282 && (precision & VCardType::precision))
285 results.isPrinted = isPrinted;
286 results.isCurrentVarNA = isNonApplicable;
288 VariableAccessorType::template BuildSurveyReport<VCardType>(results,
298 NextType::buildSurveyReport(results, dataLevel, fileLevel, precision);
301template<
class ChildT,
class NextT,
class VCardT>
310 if (0 != ResultsType::count)
313 if ((dataLevel & VCardType::categoryDataLevel) && (fileLevel & VCardType::categoryFileLevel)
314 && (precision & VCardType::precision))
317 static_cast<const ChildT*
>(
this)->localBuildAnnualSurveyReport(results,
326 NextType::buildAnnualSurveyReport(results, dataLevel, fileLevel, precision, numSpace);
329template<
class ChildT,
class NextT,
class VCardT>
335 if (VCardType::columnCount != 0
336 && (VCardType::categoryDataLevel & Category::DataLevel::setOfAreas
337 || VCardType::categoryDataLevel & Category::DataLevel::area
338 || VCardType::categoryDataLevel & Category::DataLevel::link))
344 VariableAccessorType::template BuildDigest<VCardT>(results,
350 NextType::buildDigest(results, digestLevel, dataLevel);
353template<
class ChildT,
class NextT,
class VCardT>
356 NextType::beforeYearByYearExport(year, numspace);
359template<
class ChildT,
class NextT,
class VCardT>
364 if (VCardType::nodeDepthForGUI)
366 infos.template beginNode<VCardType>();
368 NextType::template provideInformations<I>(infos);
375 infos.template addVCard<VCardType>();
377 NextType::template provideInformations<I>(infos);
381template<
class ChildT,
class NextT,
class VCardT>
382template<
class SearchVCardT,
class O>
389 if (Yuni::Static::Type::StrictlyEqual<VCardT, SearchVCardT>::Yes)
392 Yuni::Static::Type::StrictlyEqual<VCardT, SearchVCardT>::Yes,
393 VCardT::spatialAggregate,
395 >::Perform(out, *(
static_cast<ChildT*
>(
this)), numSpace);
399 NextType::template computeSpatialAggregateWith<SearchVCardT, O>(out, numSpace);
402template<
class ChildT,
class NextT,
class VCardT>
403template<
class SearchVCardT,
class O>
407 NextType::template computeSpatialAggregateWith<SearchVCardT, O>(out, area);
413struct RetrieveResultsAssignment
420 template<
class ResultsT,
class O>
421 static void Do(ResultsT& varResults, O** result)
423 *result = &varResults;
428struct RetrieveResultsAssignment<0>
435 template<
class ResultsT,
class O>
436 static void Do(ResultsT&, O**)
444template<
class ChildT,
class NextT,
class VCardT>
445template<
class VCardToFindT>
446inline const double* IVariable<ChildT, NextT, VCardT>::retrieveHourlyResultsForCurrentYear(
449 using AssignT = RetrieveResultsAssignment<
450 Yuni::Static::Type::StrictlyEqual<VCardT, VCardToFindT>::Yes>;
451 return (AssignT::Yes)
453 : NextType::template retrieveHourlyResultsForCurrentYear<VCardToFindT>(numSpace);
456template<
class ChildT,
class NextT,
class VCardT>
457template<
class VCardToFindT>
458inline void IVariable<ChildT, NextT, VCardT>::retrieveResultsForArea(
460 const Data::Area* area)
462 using AssignT = RetrieveResultsAssignment<
463 Yuni::Static::Type::StrictlyEqual<VCardT, VCardToFindT>::Yes>;
464 AssignT::Do(pResults, result);
467 NextType::template retrieveResultsForArea<VCardToFindT>(result, area);
471template<
class ChildT,
class NextT,
class VCardT>
472template<
class VCardToFindT>
473inline void IVariable<ChildT, NextT, VCardT>::retrieveResultsForThermalCluster(
475 const Data::ThermalCluster* cluster)
477 using AssignT = RetrieveResultsAssignment<
478 Yuni::Static::Type::StrictlyEqual<VCardT, VCardToFindT>::Yes>;
479 AssignT::Do(pResults, result);
482 NextType::template retrieveResultsForThermalCluster<VCardToFindT>(result, cluster);
486template<
class ChildT,
class NextT,
class VCardT>
487template<
class VCardToFindT>
488inline void IVariable<ChildT, NextT, VCardT>::retrieveResultsForLink(
490 const Data::AreaLink* link)
492 using AssignT = RetrieveResultsAssignment<
493 Yuni::Static::Type::StrictlyEqual<VCardT, VCardToFindT>::Yes>;
494 AssignT::Do(pResults, result);
497 NextType::template retrieveResultsForLink<VCardToFindT>(result, link);
504struct HourlyResultsForCurrentYear
507 static Antares::Memory::Stored<double>::ConstReturnType Get(
const R& results, uint column)
509 return results[column].hourlyValuesForSpatialAggregate();
514struct HourlyResultsForCurrentYear<Category::singleColumn>
517 static Antares::Memory::Stored<double>::ConstReturnType Get(
const R& results, uint)
519 return results.hourlyValuesForSpatialAggregate();
524struct HourlyResultsForCurrentYear<Category::noColumn>
527 static Antares::Memory::Stored<double>::ConstReturnType Get(
const R&, uint)
535template<
class ChildT,
class NextT,
class VCardT>
536inline Antares::Memory::Stored<double>::ConstReturnType
537IVariable<ChildT, NextT, VCardT>::retrieveRawHourlyValuesForCurrentYear(uint column,
540 return HourlyResultsForCurrentYear<VCardType::columnCount>::Get(pResults, column);
543template<
class ChildT,
class NextT,
class VCardT>
559template<
int ColumnT,
class VCardT,
class ChildT>
560class RetrieveVariableListHelper
563 template<
class PredicateT>
564 static void Do(PredicateT& predicate)
566 for (
int i = 0; i < VCardT::columnCount; ++i)
568 predicate.add(VCardT::Multiple::Caption(i),
569 VCardT::Multiple::Unit(i),
570 VCardT::Description());
578 for (
int i = 0; i < VCardT::columnCount; ++i)
580 printInfoCollector.add(VCardT::Multiple::Caption(i),
581 VCardT::categoryDataLevel,
582 VCardT::categoryFileLevel);
587template<
class VCardT,
class ChildT>
588class RetrieveVariableListHelper<Category::singleColumn, VCardT, ChildT>
591 template<
class PredicateT>
592 static void Do(PredicateT& predicate)
594 predicate.add(VCardT::Caption(), VCardT::Unit(), VCardT::Description());
599 static void Do(Data::variablePrintInfoCollector& printInfoCollector)
601 printInfoCollector.add(VCardT::Caption(),
602 VCardT::categoryDataLevel,
603 VCardT::categoryFileLevel);
607template<
class VCardT,
class ChildT>
608class RetrieveVariableListHelper<Category::dynamicColumns, VCardT, ChildT>
611 template<
class PredicateT>
612 static void Do(PredicateT&)
618 static void Do(Data::variablePrintInfoCollector& printInfoCollector)
620 printInfoCollector.add(VCardT::Caption(),
621 VCardT::categoryDataLevel,
622 VCardT::categoryFileLevel);
628template<
class ChildT,
class NextT,
class VCardT>
629template<
class PredicateT>
632 RetrieveVariableListHelper<VCardType::columnCount, VCardType, ChildT>::Do(predicate);
634 NextType::RetrieveVariableList(predicate);
646template<
int ColumnT,
class VCardT>
647class GetPrintStatusHelper
650 static void Do(
Data::Study& study,
bool* isPrinted)
652 for (uint i = 0; i != VCardT::columnCount; ++i)
656 isPrinted[i] = study.parameters.variablesPrintInfo.isPrinted(
657 VCardT::Multiple::Caption(i));
663template<
class VCardT>
664class GetPrintStatusHelper<Category::singleColumn, VCardT>
667 static void Do(Data::Study& study,
bool* isPrinted)
671 isPrinted[0] = study.parameters.variablesPrintInfo.isPrinted(VCardT::Caption());
676template<
class VCardT>
677class GetPrintStatusHelper<Category::dynamicColumns, VCardT>
680 static void Do(Data::Study& study,
bool* isPrinted)
684 isPrinted[0] = study.parameters.variablesPrintInfo.isPrinted(VCardT::Caption());
689template<
class ChildT,
class NextT,
class VCardT>
690inline void IVariable<ChildT, NextT, VCardT>::getPrintStatusFromStudy(Data::Study& study)
692 GetPrintStatusHelper<VCardType::columnCount, VCardType>::Do(study, isPrinted);
694 NextType::getPrintStatusFromStudy(study);
707template<
int ColumnT,
class VCardT>
708class SupplyMaxNbColumnsHelper
711 static void Do(Data::Study& study, uint maxNumberColumns)
713 for (uint i = 0; i != VCardT::columnCount; ++i)
715 study.parameters.variablesPrintInfo.setMaxColumns(VCardT::Multiple::Caption(i),
722template<
class VCardT>
723class SupplyMaxNbColumnsHelper<Category::singleColumn, VCardT>
726 static void Do(Data::Study& study, uint maxNumberColumns)
728 study.parameters.variablesPrintInfo.setMaxColumns(VCardT::Caption(), maxNumberColumns);
733template<
class VCardT>
734class SupplyMaxNbColumnsHelper<Category::dynamicColumns, VCardT>
737 static void Do(Data::Study& study, uint maxNumberColumns)
739 study.parameters.variablesPrintInfo.setMaxColumns(VCardT::Caption(), maxNumberColumns);
744template<
class ChildT,
class NextT,
class VCardT>
745inline void IVariable<ChildT, NextT, VCardT>::supplyMaxNumberOfColumns(Data::Study& study)
747 auto max_columns =
static_cast<const ChildT*
>(
this)->getMaxNumberColumns();
748 SupplyMaxNbColumnsHelper<VCardType::columnCount, VCardType>::Do(study,
749 static_cast<uint
>(max_columns));
751 NextType::supplyMaxNumberOfColumns(study);
Definition of a link between two areas (Interconnection)
Definition links.h:50
Definition for a single area.
Definition area.h:52
A single thermal cluster.
Definition cluster.h:78
Definition variable-print-info.h:84
Interface for any variable.
Definition variable.h:51
static void RetrieveVariableList(PredicateT &predicate)
Retrieve the list of all individual variables.
Definition variable.hxx:630
const StoredResultType & results() const
The results.
Definition variable.hxx:544
VCardT VCardType
VCard.
Definition variable.h:60
void simulationEnd()
Notify to all variables that the simulation has finished.
Definition variable.hxx:132
void hourEnd(State &state, uint hourInTheYear)
Event: A new hour in the year has just ended.
Definition variable.hxx:257
void yearEnd(uint year)
Notify to all variables that the year is now over.
Definition variable.hxx:151
void yearEndBuildPrepareDataForEachThermalCluster(State &state, uint year, uint numSpace)
Notify to all variables to prepare data for the close to year end calculations for each thermal clust...
Definition variable.hxx:178
void hourForEachArea(State &state)
Event: For a given hour in the year, walking through all areas.
Definition variable.hxx:226
static void provideInformations(I &infos)
"Print" informations about the variable tree
Definition variable.hxx:361
static void InitializeResultsFromStudy(R &results, Data::Study &study)
Initialize the results of the variable.
Definition variable.hxx:71
void simulationBegin()
Notify to all variables that the simulation is about to begin.
Definition variable.hxx:125
void yearEndBuildForEachThermalCluster(State &state, uint year, uint numSpace)
Notify to all variables that the year is close to end.
Definition variable.hxx:240
void initializeFromArea(Data::Study *study, Data::Area *area)
Initialize the variable with a specific area.
Definition variable.hxx:78
IVariable()
Default constructor.
Definition variable.hxx:32
void initializeFromStudy(Data::Study &study)
Initialize the variable.
Definition variable.hxx:63
void beforeYearByYearExport(uint year, uint numSpace)
Event triggered before exporting a year-by-year survey report.
Definition variable.hxx:354
void hourBegin(uint hourInTheYear)
Event: A new hour in the year has just began.
Definition variable.hxx:219
void initializeFromLink(Data::Study *study, Data::AreaLink *link)
Initialize the variable with a specific link between two areas.
Definition variable.hxx:86
void hourForEachLink(State &state, uint numSpace)
Event: For a given hour in the year, walking through all links.
Definition variable.hxx:250
void computeSpatialAggregateWith(O &out, uint numSpace)
Compute the spatial cluster with the results of a single variable.
Definition variable.hxx:383
void initializeFromThermalCluster(Data::Study *study, Data::Area *area, Data::ThermalCluster *cluster)
Initialize the variable with a specific thermal cluster.
Definition variable.hxx:94
void yearBegin(uint year)
Notify to all variables that a new year is about to start.
Definition variable.hxx:144
Class utility for building CSV results files.
Definition surveyresults.h:41
bool * isPrinted
Same thing for print status (do we print the current output variable ?)
Definition surveyresults.h:134
bool * isCurrentVarNA
Definition surveyresults.h:132
VariableAccessor< typenameVCardT::ResultsType, VCardT::columnCount >::Type ResultsType
The true type used for the results.
Definition info.h:764