Antares Simulator
Power System Simulator
info.h
1 /*
2  * Copyright 2007-2025, RTE (https://www.rte-france.com)
3  * See AUTHORS.txt
4  * SPDX-License-Identifier: MPL-2.0
5  * This file is part of Antares-Simulator,
6  * Adequacy and Performance assessment for interconnected energy networks.
7  *
8  * Antares_Simulator is free software: you can redistribute it and/or modify
9  * it under the terms of the Mozilla Public Licence 2.0 as published by
10  * the Mozilla Foundation, either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * Antares_Simulator is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * Mozilla Public Licence 2.0 for more details.
17  *
18  * You should have received a copy of the Mozilla Public Licence 2.0
19  * along with Antares_Simulator. If not, see <https://opensource.org/license/mpl-2-0/>.
20  */
21 #ifndef __SOLVER_VARIABLE_INFO_H__
22 #define __SOLVER_VARIABLE_INFO_H__
23 
24 #include <cmath>
25 
26 #include "antares/solver/variable/surveyresults.h"
27 #include "antares/study/fwd.h"
28 
29 namespace Antares::Solver::Variable
30 {
31 template<class T>
33 {
34  typedef T Type;
35 };
36 
37 template<class T, int N>
38 struct SpecifierRemover<T[N]>
39 {
40  typedef T Type;
41 };
42 
43 template<class T>
44 struct SpecifierRemover<T*>
45 {
46  typedef T Type;
47 };
48 
49 template<class T, int N>
50 struct SpecifierRemover<const T[N]>
51 {
52  typedef T Type;
53 };
54 
55 template<class T>
56 struct SpecifierRemover<const T*>
57 {
58  typedef T Type;
59 };
60 
61 template<class ResultsT, int ColumnCountT>
63 {
64  typedef typename SpecifierRemover<ResultsT>::Type CleanType;
65  typedef CleanType Type[ColumnCountT];
66 
67  template<class U>
68  static void MultiplyHourlyResultsBy(U& intermediateValues, const double v)
69  {
70  assert(!std::isnan(v));
71  for (uint i = 0; i != ColumnCountT; ++i)
72  {
73  Antares::Memory::Stored<double>::ReturnType array = intermediateValues[i].hour;
74  for (uint y = 0; y != HOURS_PER_YEAR; ++y)
75  {
76  array[y] *= v;
77  }
78  }
79  }
80 
81  template<class U>
82  static void SetTo1IfPositive(U& intermediateValues)
83  {
84  for (uint i = 0; i != ColumnCountT; ++i)
85  {
86  Antares::Memory::Stored<double>::ReturnType array = intermediateValues[i].hour;
87  for (uint y = 0; y != HOURS_PER_YEAR; ++y)
88  {
89  array[y] = std::abs(array[y]) > 0. ? 1. : 0.;
90  }
91  }
92  }
93 
94  template<class U>
95  static void Or(U& intermediateValues)
96  {
97  for (uint i = 0; i != ColumnCountT; ++i)
98  {
99  Antares::Memory::Stored<double>::ReturnType array = intermediateValues[i].hour;
100  for (uint y = 0; y != HOURS_PER_YEAR; ++y)
101  {
102  array[y] = std::abs(array[y]) > 0. ? 100. : 0.;
103  }
104  }
105  }
106 
107  template<class U>
108  static void InitializeAndReset(U& out, Data::Study& study)
109  {
110  for (uint i = 0; i != ColumnCountT; ++i)
111  {
112  out[i].initializeFromStudy(study);
113  out[i].reset();
114  }
115  }
116 
117  template<class U>
118  static void Reset(U& out)
119  {
120  for (uint i = 0; i != ColumnCountT; ++i)
121  {
122  out[i].reset();
123  }
124  }
125 
126  template<class VCardT, class U>
127  static void ComputeStatistics(U& intermediateValues)
128  {
129  for (uint i = 0; i != ColumnCountT; ++i)
130  {
131  // Compute all statistics for the current year (daily,weekly,monthly)
132  if (VCardT::spatialAggregate & Category::spatialAggregateOr)
133  {
134  intermediateValues[i].computeStatisticsOrForTheCurrentYear();
135  }
136  else
137  {
138  if (VCardT::spatialAggregatePostProcessing
139  == (int)Category::spatialAggregatePostProcessingPrice)
140  {
141  intermediateValues[i].computeAveragesForCurrentYearFromHourlyResults();
142  }
143  else
144  {
145  intermediateValues[i].computeStatisticsForTheCurrentYear();
146  }
147  }
148  }
149  }
150 
151  template<class U>
152  static void ComputeSummary(U& intermediateValues, Type& container, uint year)
153  {
154  for (uint i = 0; i != ColumnCountT; ++i)
155  {
156  // Merge all those values with the global results
157  container[i].merge(year, intermediateValues[i]);
158  }
159  }
160 
161  template<class VCardT>
162  static void BuildDigest(SurveyResults& results,
163  const Type& container,
164  int digestLevel,
165  int dataLevel)
166  {
167  for (uint i = 0; i != ColumnCountT; ++i)
168  {
169  if (*results.isPrinted)
170  {
171  results.variableCaption = VCardT::Multiple::Caption(i);
172  results.variableUnit = VCardT::Multiple::Unit(i);
173  container[i].template buildDigest<VCardT>(results, digestLevel, dataLevel);
174  }
175  // Shift to the next internal variable's non applicable status and print status
176  results.isCurrentVarNA++;
177  results.isPrinted++;
178  }
179  }
180 
181  template<class VCardType>
182  static void BuildSurveyReport(SurveyResults& results,
183  const Type& container,
184  int dataLevel,
185  int fileLevel,
186  int precision)
187  {
188  for (uint i = 0; i != ColumnCountT; ++i)
189  {
190  if (*results.isPrinted)
191  {
192  results.variableCaption = VCardType::Multiple::Caption(i);
193  results.variableUnit = VCardType::Multiple::Unit(i);
194  container[i].template buildSurveyReport<ResultsT, VCardType>(results,
195  container[i],
196  dataLevel,
197  fileLevel,
198  precision);
199  }
200  // Shift to the next internal variable's non applicable status and print status
201  results.isCurrentVarNA++;
202  results.isPrinted++;
203  }
204  }
205 
206  template<class VCardType>
207  static void BuildAnnualSurveyReport(SurveyResults& results,
208  const Type& container,
209  int fileLevel,
210  int precision)
211  {
212  for (uint i = 0; i != ColumnCountT; ++i)
213  {
214  if (*results.isPrinted)
215  {
216  results.variableCaption = VCardType::Multiple::Caption(i);
217  container[i].template buildAnnualSurveyReport<VCardType>(results,
218  fileLevel,
219  precision);
220  }
221  // Shift to the next internal variable's non applicable status and print status
222  results.isCurrentVarNA++;
223  results.isPrinted++;
224  }
225  }
226 
227  template<class U, class VarT>
228  static void ComputeSum(U& out, const VarT& var, uint numSpace)
229  {
230  for (uint i = 0; i != ColumnCountT; ++i)
231  {
232  Antares::Memory::Stored<double>::ConstReturnType src
233  = var.retrieveRawHourlyValuesForCurrentYear(i, numSpace);
234 
235  assert(src != NULL);
236  for (uint h = 0; h != HOURS_PER_YEAR; ++h)
237  {
238  out[i].hour[h] += src[h];
239  }
240  }
241  }
242 
243  template<class U, class VarT>
244  static void ComputeMax(U& out, const VarT& var, uint numSpace)
245  {
246  for (uint i = 0; i != ColumnCountT; ++i)
247  {
248  Antares::Memory::Stored<double>::ConstReturnType src
249  = var.retrieveRawHourlyValuesForCurrentYear(i, numSpace);
250 
251  assert(src != NULL);
252  for (uint h = 0; h != HOURS_PER_YEAR; ++h)
253  {
254  if (out[i].hour[h] < src[h])
255  {
256  out[i].hour[h] = src[h];
257  }
258  }
259  }
260  }
261 };
262 
263 template<class ResultsT>
264 struct VariableAccessor<ResultsT, Category::dynamicColumns>
265 {
266  typedef typename SpecifierRemover<ResultsT>::Type CleanType;
267  typedef std::vector<CleanType> Type;
268 
269  template<class U>
270  static void MultiplyHourlyResultsBy(U& intermediateValues, const double v)
271  {
272  assert(!std::isnan(v));
273  double* array;
274  const typename Type::const_iterator end = intermediateValues.end();
275  for (typename Type::const_iterator i = intermediateValues.begin(); i != end; ++i)
276  {
277  array = (*i).hour;
278  for (uint y = 0; y != HOURS_PER_YEAR; ++y)
279  {
280  array[y] *= v;
281  }
282  }
283  }
284 
285  template<class U>
286  static void SetTo1IfPositive(U& intermediateValues)
287  {
288  double* array;
289  const typename Type::const_iterator end = intermediateValues.end();
290  for (typename Type::const_iterator i = intermediateValues.begin(); i != end; ++i)
291  {
292  array = (*i).hour;
293  for (uint y = 0; y != HOURS_PER_YEAR; ++y)
294  {
295  array[y] = std::abs(array[y]) > 0. ? 1. : 0.;
296  }
297  }
298  }
299 
300  template<class U>
301  static void Or(U& intermediateValues)
302  {
303  double* array;
304  const typename Type::const_iterator end = intermediateValues.end();
305  for (typename Type::const_iterator i = intermediateValues.begin(); i != end; ++i)
306  {
307  array = (*i).hour;
308  for (uint y = 0; y != HOURS_PER_YEAR; ++y)
309  {
310  array[y] = std::abs(array[y]) > 0. ? 100. : 0.;
311  }
312  }
313  }
314 
315  template<class U>
316  static void InitializeAndReset(U& out, Data::Study& study)
317  {
318  const typename Type::const_iterator end = out.end();
319  for (typename Type::const_iterator i = out.begin(); i != end; ++i)
320  {
321  (*i).initializeFromStudy(study);
322  (*i).reset();
323  }
324  }
325 
326  template<class U>
327  static void Reset(U& out)
328  {
329  const typename Type::const_iterator end = out.end();
330  for (typename Type::const_iterator i = out.begin(); i != end; ++i)
331  {
332  (*i).reset();
333  }
334  }
335 
336  template<class VCardT, class U>
337  static void ComputeStatistics(U& intermediateValues, Type& container, uint)
338  {
339  for (uint i = 0; i != container.size(); ++i)
340  {
341  if (VCardT::spatialAggregate & Category::spatialAggregateOr)
342  {
343  intermediateValues[i].computeStatisticsOrForTheCurrentYear();
344  }
345  else
346  {
347  // Compute all statistics for the current year (daily,weekly,monthly)
348  if (VCardT::spatialAggregatePostProcessing
349  == (int)Category::spatialAggregatePostProcessingPrice)
350  {
351  // intermediateValues[i].adjustValuesWhenRelatedToAPrice();
352  intermediateValues[i].computeAveragesForCurrentYearFromHourlyResults();
353  }
354  else
355  {
356  intermediateValues[i].computeStatisticsForTheCurrentYear();
357  }
358  }
359  }
360  }
361 
362  template<class U>
363  static void ComputeSummary(U& intermediateValues, Type& container, uint year)
364  {
365  for (uint i = 0; i != container.size(); ++i)
366  {
367  // Merge all those values with the global results
368  container[i].merge(year, intermediateValues[i]);
369  }
370  }
371 
372  template<class VCardT>
373  static void BuildDigest(SurveyResults& results,
374  const Type& container,
375  int digestLevel,
376  int dataLevel)
377  {
378  if (*results.isPrinted)
379  {
380  const Data::PartThermal& thermal = results.data.area->thermal;
381  for (uint i = 0; i != container.size(); ++i)
382  {
383  results.variableCaption = thermal.list.enabledClusterAt(i)->name();
384 
385  container[i].template buildDigest<VCardT>(results, digestLevel, dataLevel);
386  }
387  }
388  }
389 
390  static bool setClusterCaption(SurveyResults& results, int fileLevel, uint idx)
391  {
392  assert(results.data.area && "Area is NULL");
393  const bool thermal_details = fileLevel & Category::FileLevel::de;
394  const bool renewable_details = fileLevel & Category::FileLevel::de_res;
395  const bool st_storage_details = fileLevel & Category::FileLevel::de_sts;
396 
397  std::array<bool, 3> kind_of_details = {thermal_details,
398  renewable_details,
399  st_storage_details};
400 
401  // The current result file must be a detail file and of one kind only.
402  // So the vector above must contain one true. No less, no more.
403  auto how_many_kinds_of_details = std::count(kind_of_details.begin(),
404  kind_of_details.end(),
405  true);
406 
407  if (how_many_kinds_of_details != 1)
408  {
409  logs.error() << "Inconsistent fileLevel detected";
410  return false;
411  }
412 
413  if (thermal_details)
414  {
415  auto& thermal = results.data.area->thermal;
416  results.variableCaption = thermal.list.enabledClusterAt(idx)->name();
417  return true;
418  }
419  if (renewable_details)
420  {
421  auto& renewable = results.data.area->renewable;
422  results.variableCaption = renewable.list.enabledClusterAt(idx)->name();
423  return true;
424  }
425  if (st_storage_details)
426  {
427  auto& st_storage_part = results.data.area->shortTermStorage;
428  results.variableCaption = st_storage_part.storagesByIndex[idx].properties.name;
429  return true;
430  }
431  return true;
432  }
433 
434  template<class VCardType>
435  static void BuildSurveyReport(SurveyResults& results,
436  const Type& container,
437  int dataLevel,
438  int fileLevel,
439  int precision)
440  {
441  bool res;
442  if (*results.isPrinted)
443  {
444  for (uint i = 0; i != container.size(); ++i)
445  {
446  res = setClusterCaption(results, fileLevel, i);
447  if (!res)
448  {
449  return;
450  }
451  results.variableUnit = VCardType::Unit();
452 
453  container[i].template buildSurveyReport<ResultsT, VCardType>(results,
454  container[i],
455  dataLevel,
456  fileLevel,
457  precision);
458  }
459  }
460  }
461 
462  template<class VCardType>
463  static void BuildAnnualSurveyReport(SurveyResults& results,
464  const Type& container,
465  int fileLevel,
466  int precision)
467  {
468  bool res;
469  if (*results.isPrinted)
470  {
471  for (uint i = 0; i != container.size(); ++i)
472  {
473  res = setClusterCaption(results, fileLevel, i);
474  if (!res)
475  {
476  return;
477  }
478  container[i].template buildAnnualSurveyReport<VCardType>(results,
479  fileLevel,
480  precision);
481  }
482  }
483  }
484 
485  template<class U, class VarT>
486  static void ComputeSum(U& out, const VarT& var, uint numSpace)
487  {
488  for (uint i = 0; i != var.results().size(); ++i)
489  {
490  Antares::Memory::Stored<double>::ConstReturnType src
491  = var.retrieveRawHourlyValuesForCurrentYear(i, numSpace);
492 
493  assert(src != NULL);
494  for (uint h = 0; h != HOURS_PER_YEAR; ++h)
495  {
496  out[i].hour[h] += src[h];
497  }
498  }
499  }
500 
501  template<class U, class VarT>
502  static void ComputeMax(U& out, const VarT& var, uint numSpace)
503  {
504  for (uint i = 0; i != var.results().size(); ++i)
505  {
506  Antares::Memory::Stored<double>::ConstReturnType src
507  = var.retrieveRawHourlyValuesForCurrentYear(i, numSpace);
508 
509  assert(src != NULL);
510  for (uint h = 0; h != HOURS_PER_YEAR; ++h)
511  {
512  if (out[i].hour[h] < src[h])
513  {
514  out[i].hour[h] = src[h];
515  }
516  }
517  }
518  }
519 };
520 
521 template<class ResultsT>
522 struct VariableAccessor<ResultsT, Category::singleColumn /* The default */>
523 {
524  typedef typename SpecifierRemover<ResultsT>::Type CleanType;
525  typedef CleanType Type;
526 
527  template<class U>
528  static void MultiplyHourlyResultsBy(U& intermediateValues, const double v)
529  {
530  assert(!std::isnan(v));
531  for (uint y = 0; y != HOURS_PER_YEAR; ++y)
532  {
533  intermediateValues.hour[y] *= v;
534  }
535  }
536 
537  template<class U>
538  static void SetTo1IfPositive(U& intermediateValues)
539  {
540  for (uint y = 0; y != HOURS_PER_YEAR; ++y)
541  {
542  intermediateValues.hour[y] = std::abs(intermediateValues.hour[y]) > 0. ? 1. : 0.;
543  }
544  }
545 
546  template<class U>
547  static void Or(U& intermediateValues)
548  {
549  for (uint y = 0; y != HOURS_PER_YEAR; ++y)
550  {
551  intermediateValues.hour[y] = std::abs(intermediateValues.hour[y]) > 0. ? 100. : 0.;
552  }
553  }
554 
555  template<class U>
556  static void InitializeAndReset(U& out, Data::Study& study)
557  {
558  out.initializeFromStudy(study);
559  out.reset();
560  }
561 
562  template<class U>
563  static void Reset(U& out)
564  {
565  out.reset();
566  }
567 
568  template<class VCardT, class U>
569  static void ComputeStatistics(U& intermediateValues)
570  {
571  if (VCardT::spatialAggregate & Category::spatialAggregateOr)
572  {
573  intermediateValues.computeStatisticsOrForTheCurrentYear();
574  }
575  else
576  {
577  // Compute all statistics for the current year (daily,weekly,monthly)
578  if (VCardT::spatialAggregatePostProcessing
579  == (int)Category::spatialAggregatePostProcessingPrice)
580  {
581  // intermediateValues[i].adjustValuesWhenRelatedToAPrice();
582  intermediateValues.computeAveragesForCurrentYearFromHourlyResults();
583  }
584  else
585  {
586  intermediateValues.computeStatisticsForTheCurrentYear();
587  }
588  }
589  }
590 
591  template<class U>
592  static void ComputeSummary(U& intermediateValues, Type& container, uint year)
593  {
594  // Merge all those values with the global results
595  container.merge(year, intermediateValues);
596  }
597 
598  template<class VCardT>
599  static void BuildDigest(SurveyResults& results,
600  const Type& container,
601  int digestLevel,
602  int dataLevel)
603  {
604  if (*results.isPrinted)
605  {
606  results.variableCaption = VCardT::Caption();
607  results.variableUnit = VCardT::Unit();
608  container.template buildDigest<VCardT>(results, digestLevel, dataLevel);
609  }
610  }
611 
612  template<class VCardType>
613  static void BuildSurveyReport(SurveyResults& results,
614  const Type& container,
615  int dataLevel,
616  int fileLevel,
617  int precision,
618  bool updateCaption = true)
619  {
620  if (*results.isPrinted)
621  {
622  if (updateCaption)
623  {
624  results.variableCaption = VCardType::Caption();
625  results.variableUnit = VCardType::Unit();
626  }
627  container.template buildSurveyReport<ResultsT, VCardType>(results,
628  container,
629  dataLevel,
630  fileLevel,
631  precision);
632  }
633  }
634 
635  template<class VCardType>
636  static void BuildAnnualSurveyReport(SurveyResults& results,
637  const Type& container,
638  int fileLevel,
639  int precision)
640  {
641  if (*results.isPrinted)
642  {
643  results.variableCaption = VCardType::Caption();
644  results.variableUnit = VCardType::Unit();
645  container.template buildAnnualSurveyReport<VCardType>(results, fileLevel, precision);
646  }
647  }
648 
649  template<class U, class VarT>
650  static void ComputeSum(U& out, const VarT& var, uint numSpace)
651  {
652  Antares::Memory::Stored<double>::ConstReturnType src
653  = var.retrieveRawHourlyValuesForCurrentYear(-1, numSpace);
654 
655  assert(src != NULL);
656  for (uint h = 0; h != HOURS_PER_YEAR; ++h)
657  {
658  out.hour[h] += src[h];
659  }
660  }
661 
662  template<class U, class VarT>
663  static void ComputeMax(U& out, const VarT& var, uint numSpace)
664  {
665  Antares::Memory::Stored<double>::ConstReturnType src
666  = var.retrieveRawHourlyValuesForCurrentYear(-1, numSpace);
667 
668  assert(src != NULL);
669  for (uint h = 0; h != HOURS_PER_YEAR; ++h)
670  {
671  if (out.hour[h] < src[h])
672  {
673  out.hour[h] = src[h];
674  }
675  }
676  }
677 };
678 
679 template<class ResultsT>
680 struct VariableAccessor<ResultsT, Category::noColumn>
681 {
682  typedef typename SpecifierRemover<ResultsT>::Type CleanType;
683  typedef CleanType Type;
684 
685  template<class U>
686  static void MultiplyHourlyResultsBy(U&, const double)
687  {
688  // Do nothing
689  }
690 
691  template<class U>
692  static void SetTo1IfPositive(U&)
693  {
694  }
695 
696  template<class U>
697  static void Or(U&)
698  {
699  }
700 
701  template<class U>
702  static void InitializeAndReset(U&, Data::Study&)
703  {
704  // Do nothing
705  }
706 
707  template<class U>
708  static void Reset(U&)
709  {
710  // Do nothing
711  }
712 
713  template<class VCardT, class U>
714  static void ComputeStatisticsAndMerge(U&, Type&, uint)
715  {
716  // Do nothing
717  }
718 
719  static uint64_t Value(const Type&)
720  {
721  return 0;
722  }
723 
724  template<class VCardType>
725  static void BuildSurveyReport(SurveyResults&, const Type&, int, int, int)
726  {
727  // Do nothing
728  }
729 
730  template<class VCardType>
731  static void BuildAnnualSurveyReport(SurveyResults&, const Type&, int, int)
732  {
733  // Do nothing
734  }
735 
736  template<class VCardT>
737  static void BuildDigest(SurveyResults&, const Type&, int, int)
738  {
739  // Do nothing
740  }
741 
742  template<class U, class VarT>
743  static void ComputeSum(U&, const VarT&, uint)
744  {
745  // Do nothing
746  }
747 
748  template<class U, class VarT>
749  static void ComputeMax(U&, const VarT&, uint)
750  {
751  // Do nothing
752  }
753 };
754 
755 template<class VCardT>
756 struct Storage
757 {
761 };
762 
763 template<bool Allowed, int OperationT, class VCardT>
765 {
766  template<class U, class VarT>
767  static void Perform(U&, const VarT&, uint)
768  {
769  }
770 };
771 
772 // `+`
773 template<class VCardT>
774 struct SpatialAggregateOperation<true, Category::spatialAggregateSum, VCardT>
775 {
776  template<class U, class VarT>
777  static void Perform(U& intermediateResults, const VarT& var, uint numSpace)
778  {
779  typedef typename VCardT::ResultsType ResultsType;
781  var,
782  numSpace);
783  }
784 };
785 
786 // `+`
787 template<class VCardT>
788 struct SpatialAggregateOperation<true, Category::spatialAggregateOr, VCardT>
789 {
790  template<class U, class VarT>
791  static void Perform(U& intermediateResults, const VarT& var, uint numSpace)
792  {
793  typedef typename VCardT::ResultsType ResultsType;
795  var,
796  numSpace);
797  }
798 };
799 
800 // `+`
801 template<class VCardT>
802 struct SpatialAggregateOperation<true, Category::spatialAggregateSumThen1IfPositive, VCardT>
803 {
804  template<class U, class VarT>
805  static void Perform(U& intermediateResults, const VarT& var, uint numSpace)
806  {
807  typedef typename VCardT::ResultsType ResultsType;
809  var,
810  numSpace);
811  }
812 };
813 
814 // `+`
815 template<class VCardT>
816 struct SpatialAggregateOperation<true, Category::spatialAggregateAverage, VCardT>
817 {
818  template<class U, class VarT>
819  static void Perform(U& intermediateResults, const VarT& var, uint numSpace)
820  {
821  typedef typename VCardT::ResultsType ResultsType;
823  var,
824  numSpace);
825  }
826 };
827 
828 // `>`
829 template<class VCardT>
830 struct SpatialAggregateOperation<true, Category::spatialAggregateMax, VCardT>
831 {
832  template<class U, class VarT>
833  static void Perform(U& intermediateResults, const VarT& var, uint numSpace)
834  {
835  typedef typename VCardT::ResultsType ResultsType;
837  var,
838  numSpace);
839  }
840 };
841 
842 } // namespace Antares::Solver::Variable
843 
844 #endif // __SOLVER_VARIABLE_INFO_H__
Definition: container.h:31
ThermalClusterList list
List of all thermal clusters (enabled and disabled) except must-run clusters.
Definition: container.h:88
Definition: study.h:57
const Data::Area * area
Current area.
Definition: data.h:63
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
CaptionType variableCaption
Caption for the current variable.
Definition: surveyresults.h:95
Solver::Variable::Private::SurveyResultsData data
Data (not related to the template parameter)
Definition: surveyresults.h:92
bool * isCurrentVarNA
Definition: surveyresults.h:132
VariableAccessor< typename VCardT::ResultsType, VCardT::columnCount >::Type ResultsType
The true type used for the results.
Definition: info.h:760