50 categoryFile = NextT::categoryFile | Variable::Category::FileLevel::allFile,
62 return "std deviation";
69 stdDeviationHourly =
nullptr;
80 Antares::Memory::Allocate<double>(stdDeviationHourly, HOURS_PER_YEAR);
82 NextType::initializeFromStudy(study);
84 yearsWeight = study.parameters.getYearsWeight();
85 yearsWeightSum = study.parameters.getYearsWeightSum();
91 (void)::memset(stdDeviationMonthly, 0,
sizeof(
double) * MONTHS_PER_YEAR);
92 (void)::memset(stdDeviationWeekly, 0,
sizeof(
double) * WEEKS_PER_YEAR);
93 (void)::memset(stdDeviationDaily, 0,
sizeof(
double) * DAYS_PER_YEAR);
94 Antares::Memory::Zero(HOURS_PER_YEAR, stdDeviationHourly);
95 stdDeviationYear = 0.;
100 void merge(
unsigned int year,
const IntermediateValues& rhs)
103 double pRatio = (double)yearsWeight[year] / (
double)yearsWeightSum;
107 for (i = 0; i != HOURS_PER_YEAR; ++i)
109 stdDeviationHourly[i] += rhs.hour[i] * rhs.hour[i] * pRatio;
112 for (i = 0; i != DAYS_PER_YEAR; ++i)
114 stdDeviationDaily[i] += rhs.day[i] * rhs.day[i] * pRatio;
117 for (i = 0; i != WEEKS_PER_YEAR; ++i)
119 stdDeviationWeekly[i] += rhs.week[i] * rhs.week[i] * pRatio;
122 for (i = 0; i != MONTHS_PER_YEAR; ++i)
124 stdDeviationMonthly[i] += rhs.month[i] * rhs.month[i] * pRatio;
127 stdDeviationYear += rhs.year * rhs.year * pRatio;
130 NextType::merge(year, rhs);
133 template<
class S,
class VCardT>
134 void buildSurveyReport(SurveyResults& report,
140 if (!(fileLevel & Category::FileLevel::id))
144 case Category::hourly:
145 InternalExportValues<S, HOURS_PER_YEAR, VCardT, Category::hourly>(
148 Memory::RawPointer(stdDeviationHourly));
150 case Category::daily:
151 InternalExportValues<S, DAYS_PER_YEAR, VCardT, Category::daily>(report,
155 case Category::weekly:
156 InternalExportValues<S, WEEKS_PER_YEAR, VCardT, Category::weekly>(
161 case Category::monthly:
162 InternalExportValues<S, MONTHS_PER_YEAR, VCardT, Category::monthly>(
165 stdDeviationMonthly);
167 case Category::annual:
168 InternalExportValues<S, 1, VCardT, Category::annual>(report,
175 NextType::template buildSurveyReport<S, VCardT>(report,
182 template<
template<
class,
int>
class DecoratorT>
183 Antares::Memory::Stored<double>::ConstReturnType hourlyValuesForSpatialAggregate()
const
185 if (Yuni::Static::Type::StrictlyEqual<DecoratorT<Empty, 0>, StdDeviation<Empty, 0>>::Yes)
187 return stdDeviationHourly;
189 return NextType::template hourlyValuesForSpatialAggregate<DecoratorT>();
193 double stdDeviationMonthly[MONTHS_PER_YEAR];
194 double stdDeviationWeekly[WEEKS_PER_YEAR];
195 double stdDeviationDaily[DAYS_PER_YEAR];
196 Antares::Memory::Stored<double>::Type stdDeviationHourly;
197 double stdDeviationYear;
200 template<
class S,
unsigned int Size,
class VCardT,
int PrecisionT,
class A>
201 void InternalExportValues(SurveyResults& report,
const S& results,
const A& array)
const
203 assert(report.data.columnIndex < report.maxVariables &&
"Column index out of bounds");
206 report.captions[0][report.data.columnIndex] = report.variableCaption;
207 report.captions[1][report.data.columnIndex] = report.variableUnit;
208 report.captions[2][report.data.columnIndex] =
"std";
211 report.precision[report.data.columnIndex] = PrecisionToPrintfFormat<
212 VCardT::decimal>::Value();
215 report.nonApplicableStatus[report.data.columnIndex] = *report.isCurrentVarNA;
218 double* target = report.values[report.data.columnIndex];
221 auto squareRootChecked = [](
double d) {
return d >= 0 ? std::sqrt(d) : 0.; };
225 case Category::hourly:
227 for (
unsigned int i = 0; i != Size; ++i)
229 target[i] = squareRootChecked(
230 array[i] - results.avgdata.hourly[i] * results.avgdata.hourly[i]);
234 case Category::daily:
236 for (
unsigned int i = 0; i != Size; ++i)
238 target[i] = squareRootChecked(
239 array[i] - results.avgdata.daily[i] * results.avgdata.daily[i]);
243 case Category::weekly:
245 for (
unsigned int i = 0; i != Size; ++i)
247 target[i] = squareRootChecked(
248 array[i] - results.avgdata.weekly[i] * results.avgdata.weekly[i]);
252 case Category::monthly:
254 for (
unsigned int i = 0; i != Size; ++i)
256 target[i] = squareRootChecked(
257 array[i] - results.avgdata.monthly[i] * results.avgdata.monthly[i]);
261 case Category::annual:
263 const double d = *array - results.avgdata.allYears * results.avgdata.allYears;
264 *target = squareRootChecked(d);
270 ++report.data.columnIndex;
273 template<
class S,
unsigned int Size,
class VCardT,
int PrecisionT,
class A>
274 void InternalExportValuesMC(SurveyResults& report,
const S& ,
const A& array)
const
276 if (not(PrecisionT & Category::annual))
280 assert(report.data.columnIndex < report.maxVariables &&
"Column index out of bounds");
283 report.captions[0][report.data.columnIndex] = report.variableCaption;
284 report.captions[1][report.data.columnIndex] = report.variableUnit;
285 report.captions[2][report.data.columnIndex] =
"std";
288 report.precision[report.data.columnIndex] = PrecisionToPrintfFormat<
289 VCardT::decimal>::Value();
292 report.nonApplicableStatus[report.data.columnIndex] = *report.isCurrentVarNA;
294 (void)::memcpy(report.data.matrix[report.data.columnIndex], array, Size *
sizeof(
double));
297 ++report.data.columnIndex;
301 std::vector<float> yearsWeight;
302 float yearsWeightSum;