Galois
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Statistics.h
Go to the documentation of this file.
1 /*
2  * This file belongs to the Galois project, a C++ library for exploiting
3  * parallelism. The code is being released under the terms of the 3-Clause BSD
4  * License (a copy is located in LICENSE.txt at the top-level directory).
5  *
6  * Copyright (C) 2018, The University of Texas at Austin. All rights reserved.
7  * UNIVERSITY EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES CONCERNING THIS
8  * SOFTWARE AND DOCUMENTATION, INCLUDING ANY WARRANTIES OF MERCHANTABILITY,
9  * FITNESS FOR ANY PARTICULAR PURPOSE, NON-INFRINGEMENT AND WARRANTIES OF
10  * PERFORMANCE, AND ANY WARRANTY THAT MIGHT OTHERWISE ARISE FROM COURSE OF
11  * DEALING OR USAGE OF TRADE. NO WARRANTY IS EITHER EXPRESS OR IMPLIED WITH
12  * RESPECT TO THE USE OF THE SOFTWARE OR DOCUMENTATION. Under no circumstances
13  * shall University be liable for incidental, special, indirect, direct or
14  * consequential damages or loss of profits, interruption of business, or
15  * related expenses which may arise from use of Software or Documentation,
16  * including but not limited to those resulting from defects in Software and/or
17  * Documentation, or loss or inaccuracy of data of any kind.
18  */
19 
20 #ifndef GALOIS_STAT_MANAGER_H
21 #define GALOIS_STAT_MANAGER_H
22 
23 #include <limits>
24 #include <map>
25 #include <string>
26 #include <type_traits>
27 
28 #include <sys/resource.h>
29 #include <sys/time.h>
30 
31 #include <boost/uuid/uuid.hpp> // uuid class
32 #include <boost/uuid/uuid_generators.hpp> // generators
33 #include <boost/uuid/uuid_io.hpp> // streaming operators etc.
34 
35 #include "galois/config.h"
36 #include "galois/gIO.h"
37 #include "galois/gstl.h"
38 #include "galois/Threads.h"
42 #include "galois/Threads.h"
43 
54 namespace galois {
55 namespace runtime {
56 
57 boost::uuids::uuid getRandUUID();
58 
59 template <typename T>
60 class RunningMin {
61  T m_min;
62 
63 public:
64  RunningMin(void) : m_min(std::numeric_limits<T>::max()) {}
65 
66  void add(const T& val) { m_min = std::min(m_min, val); }
67 
68  const T& min(void) const { return m_min; }
69 };
70 
71 template <typename T>
72 class RunningMax {
73  T m_max;
74 
75 public:
76  RunningMax(void) : m_max(std::numeric_limits<T>::min()) {}
77 
78  void add(const T& val) { m_max = std::max(m_max, val); }
79 
80  const T& max(void) const { return m_max; }
81 };
82 
83 template <typename T>
84 class RunningSum {
85  T m_sum;
86  size_t m_count;
87 
88 public:
89  RunningSum(void) : m_sum(), m_count(0) {}
90 
91  void add(const T& val) {
92  m_sum += val;
93  ++m_count;
94  }
95 
96  const T& sum(void) const { return m_sum; }
97 
98  const size_t& count(void) const { return m_count; }
99 
100  T avg() const { return m_sum / m_count; }
101 };
102 
103 template <typename T>
104 class RunningVec {
105 
106  using Vec = gstl::Vector<T>;
107 
108  Vec m_vec;
109 
110 public:
111  void add(const T& val) { m_vec.push_back(val); }
112 
113  const Vec& values(void) const { return m_vec; }
114 };
115 
116 template <typename T>
117 class NamedStat {
118 
119  using Str = galois::gstl::Str;
120 
121  Str m_name;
122 
123 public:
124  void setName(const Str& name) { m_name = name; }
125 
126  void setName(Str&& name) { m_name = std::move(name); }
127 
128  const Str& name(void) const { return m_name; }
129 
130  void add(const T&) const {}
131 };
132 
133 template <typename T, typename... Bases>
134 class AggregStat : public Bases... {
135 
136 public:
138 
140 
142 
144 
146 
147  void add(const T& val) { (..., Bases::add(val)); }
148 };
149 
150 namespace {
151 static constexpr const char* StatTotalNames[] = {"SINGLE", "TMIN", "TMAX",
152  "TSUM", "TAVG"};
153 }
154 
155 struct StatTotal {
156 
157  enum Type { SINGLE = 0, TMIN, TMAX, TSUM, TAVG };
158 
159  static const char* str(const Type& t) { return StatTotalNames[t]; }
160 };
161 
162 namespace internal {
163 
164 template <typename Stat_tp>
165 struct BasicStatMap {
166 
167  using Stat = Stat_tp;
168  using Str = galois::gstl::Str;
169  using StrSet = galois::gstl::Set<Str>;
171  using const_iterator = typename StatMap::const_iterator;
172 
173 protected:
174  StrSet symbols;
175  StatMap statMap;
176 
177  const Str* getOrInsertSymbol(const Str& s) {
178  auto p = symbols.insert(s);
179  return &*(p.first);
180  }
181 
182  const Str* getSymbol(const Str& s) const {
183  auto i = symbols.find(s);
184 
185  if (i == symbols.cend()) {
186  return nullptr;
187  } else {
188  return &(*i);
189  }
190  }
191 
192 public:
193  template <typename... Args>
194  Stat& getOrInsertStat(const Str& region, const Str& category,
195  Args&&... args) {
196 
197  const Str* ln = getOrInsertSymbol(region);
198  const Str* cat = getOrInsertSymbol(category);
199 
200  auto tpl = std::make_tuple(ln, cat);
201 
202  auto p = statMap.emplace(tpl, Stat(std::forward<Args>(args)...));
203 
204  return p.first->second;
205  }
206 
207  const_iterator findStat(const Str& region, const Str& category) const {
208 
209  const Str* ln = getSymbol(region);
210  const Str* cat = getSymbol(category);
211  auto tpl = std::make_tuple(ln, cat);
212 
213  auto i = statMap.find(tpl);
214 
215  return i;
216  }
217 
218  const Stat& getStat(const Str& region, const Str& category) const {
219 
220  auto i = findStat(region, category);
221  assert(i != statMap.end());
222  return i->second;
223  }
224 
225  template <typename T, typename... Args>
226  void addToStat(const Str& region, const Str& category, const T& val,
227  Args&&... statArgs) {
228  Stat& s =
229  getOrInsertStat(region, category, std::forward<Args>(statArgs)...);
230  s.add(val);
231  }
232 
233  const_iterator cbegin(void) const { return statMap.cbegin(); }
234  const_iterator cend(void) const { return statMap.cend(); }
235 
236  const Str& region(const const_iterator& i) const {
237  return *(std::get<0>(i->first));
238  }
239 
240  const Str& category(const const_iterator& i) const {
241  return *(std::get<1>(i->first));
242  }
243 
244  const Stat& stat(const const_iterator& i) const { return i->second; }
245 };
246 
247 template <typename T>
248 using VecStat_with_MinMaxSum =
250 
251 template <typename T>
252 struct VecStat : public VecStat_with_MinMaxSum<T> {
253 
254  using Base = VecStat_with_MinMaxSum<T>;
255 
256  StatTotal::Type m_totalTy;
257 
258  explicit VecStat(const StatTotal::Type& type) : Base(), m_totalTy(type) {}
259 
260  const StatTotal::Type& totalTy(void) const { return m_totalTy; }
261 
262  T total(void) const {
263 
264  switch (m_totalTy) {
265 
266  case StatTotal::SINGLE:
267  assert(Base::values().size() > 0);
268  return Base::values()[0];
269 
270  case StatTotal::TMIN:
271  return Base::min();
272 
273  case StatTotal::TMAX:
274  return Base::max();
275 
276  case StatTotal::TSUM:
277  return Base::sum();
278 
279  case StatTotal::TAVG:
280  return Base::avg();
281 
282  default:
283  GALOIS_DIE("unreachable");
284  }
285  }
286 };
287 
288 template <>
289 struct VecStat<gstl::Str> : public AggregStat<gstl::Str>::with_mem {
290 
291  using Base = AggregStat<gstl::Str>::with_mem;
292 
293  StatTotal::Type m_totalTy;
294 
295  explicit VecStat(const StatTotal::Type& type) : Base(), m_totalTy(type) {}
296 
297  const StatTotal::Type& totalTy(void) const { return m_totalTy; }
298 
299  const gstl::Str& total(void) const {
300 
301  switch (m_totalTy) {
302 
303  case StatTotal::SINGLE:
304  assert(Base::values().size() > 0);
305  return Base::values()[0];
306 
307  default:
308  GALOIS_DIE("unreachable");
309  }
310  }
311 };
312 
313 template <typename T>
314 using VecStatManager = BasicStatMap<VecStat<T>>;
315 
316 template <typename T>
317 struct ScalarStat {
318  T m_val;
319  StatTotal::Type m_totalTy;
320 
321  explicit ScalarStat(const StatTotal::Type& type) : m_val(), m_totalTy(type) {}
322 
323  void add(const T& v) { m_val += v; }
324 
325  operator const T&(void) const { return m_val; }
326 
327  const StatTotal::Type& totalTy(void) const { return m_totalTy; }
328 };
329 
330 template <typename T>
331 using ScalarStatManager = BasicStatMap<ScalarStat<T>>;
332 
333 } // end namespace internal
334 
335 class StatManager {
336 
337 public:
339 
340  static constexpr const char* const SEP = ", ";
341  static constexpr const char* const TSTAT_SEP = "; ";
342  static constexpr const char* const TSTAT_NAME = "ThreadValues";
343  static constexpr const char* const TSTAT_ENV_VAR = "PRINT_PER_THREAD_STATS";
344 
345  static bool printingThreadVals(void);
346 
347  template <typename T>
348  static constexpr const char* statKind(void) {
349  return std::is_same<T, Str>::value ? "PARAM" : "STAT";
350  }
351 
352 private:
353  template <typename T>
354  struct StatManagerImpl {
355 
356  using MergedStats = internal::VecStatManager<T>;
357  using const_iterator = typename MergedStats::const_iterator;
358  using Stat = typename MergedStats::Stat;
359 
361  perThreadManagers;
362  MergedStats result;
363  bool merged = false;
364 
365  void addToStat(const Str& region, const Str& category, const T& val,
366  const StatTotal::Type& type) {
367  perThreadManagers.getLocal()->addToStat(region, category, val, type);
368  }
369 
370  void mergeStats(void) {
371 
372  if (merged) {
373  return;
374  }
375 
376  for (unsigned t = 0; t < perThreadManagers.size(); ++t) {
377 
378  const auto* manager = perThreadManagers.getRemote(t);
379 
380  for (auto i = manager->cbegin(), end_i = manager->cend(); i != end_i;
381  ++i) {
382  result.addToStat(manager->region(i), manager->category(i),
383  T(manager->stat(i)), manager->stat(i).totalTy());
384  }
385  }
386 
387  merged = true;
388  }
389 
390  const_iterator cbegin(void) const { return result.cbegin(); }
391  const_iterator cend(void) const { return result.cend(); }
392 
393  const Str& region(const const_iterator& i) const {
394  return result.region(i);
395  }
396 
397  const Str& category(const const_iterator& i) const {
398  return result.category(i);
399  }
400 
401  const Stat& stat(const const_iterator& i) const { return result.stat(i); }
402 
403  template <typename S, typename V>
404  void readStat(const const_iterator& i, S& region, S& category, T& total,
405  StatTotal::Type& type, V& thrdVals) const {
406  region = this->region(i);
407  category = this->category(i);
408 
409  total = this->stat(i).total();
410  type = this->stat(i).totalTy();
411 
412  thrdVals.clear();
413  thrdVals = this->stat(i).values();
414  }
415 
416  void print(std::ostream& out) const {
417 
418  for (auto i = cbegin(), end_i = cend(); i != end_i; ++i) {
419  out << statKind<T>() << SEP << this->region(i) << SEP
420  << this->category(i) << SEP;
421 
422  const auto& s = this->stat(i);
423  out << StatTotal::str(s.totalTy()) << SEP << s.total();
424 
425  out << "\n";
426 
428 
429  out << statKind<T>() << SEP << this->region(i) << SEP
430  << this->category(i) << SEP;
431  out << TSTAT_NAME << SEP;
432 
433  const char* sep = "";
434  for (const auto& v : s.values()) {
435  out << sep << v;
436  sep = TSTAT_SEP;
437  }
438 
439  out << "\n";
440  }
441  }
442  }
443  };
444 
445  using IntStats = StatManagerImpl<int64_t>;
446  using FPstats = StatManagerImpl<double>;
447  using StrStats = StatManagerImpl<Str>;
448  using int_iterator = typename IntStats::const_iterator;
449  using fp_iterator = typename FPstats::const_iterator;
450  using str_iterator = typename StrStats::const_iterator;
451 
452  std::string m_outfile;
453  IntStats intStats;
454  FPstats fpStats;
455  StrStats strStats;
456 
457 protected:
458  void mergeStats(void) {
459  intStats.mergeStats();
460  fpStats.mergeStats();
461  strStats.mergeStats();
462  }
463 
464  int_iterator intBegin(void) const;
465  int_iterator intEnd(void) const;
466 
467  fp_iterator fpBegin(void) const;
468  fp_iterator fpEnd(void) const;
469 
470  str_iterator paramBegin(void) const;
471  str_iterator paramEnd(void) const;
472 
473  template <typename S, typename V>
474  void readIntStat(const int_iterator& i, S& region, S& category,
475  int64_t& total, StatTotal::Type& type, V& vec) const {
476 
477  intStats.readStat(i, region, category, total, type, vec);
478  }
479 
480  template <typename S, typename V>
481  void readFPstat(const fp_iterator& i, S& region, S& category, double& total,
482  StatTotal::Type& type, V& vec) const {
483 
484  fpStats.readStat(i, region, category, total, type, vec);
485  }
486 
487  template <typename S, typename V>
488  void readParam(const str_iterator& i, S& region, S& category, Str& total,
489  StatTotal::Type& type, V& vec) const {
490 
491  strStats.readStat(i, region, category, total, type, vec);
492  }
493 
494  virtual void printStats(std::ostream& out);
495 
496  void printHeader(std::ostream& out) const;
497 
498 public:
499  explicit StatManager(const std::string& outfile = "");
500 
501  virtual ~StatManager();
502 
503  void setStatFile(const std::string& outfile);
504 
505  template <typename S1, typename S2, typename T,
506  typename = std::enable_if_t<std::is_integral<T>::value ||
507  std::is_floating_point<T>::value>>
508  void addToStat(const S1& region, const S2& category, const T& val,
509  const StatTotal::Type& type) {
510 
511  if (std::is_floating_point<T>::value) {
512  fpStats.addToStat(gstl::makeStr(region), gstl::makeStr(category),
513  double(val), type);
514 
515  } else {
516  intStats.addToStat(gstl::makeStr(region), gstl::makeStr(category),
517  int64_t(val), type);
518  }
519  }
520 
521  template <typename S1, typename S2, typename V>
522  void addToParam(const S1& region, const S2& category, const V& val) {
523  strStats.addToStat(gstl::makeStr(region), gstl::makeStr(category),
525  }
526 
527  void print(void);
528 };
529 
530 namespace internal {
531 
532 void setSysStatManager(StatManager* sm);
533 StatManager* sysStatManager(void);
534 
535 } // namespace internal
536 
537 template <typename S1, typename S2, typename T>
538 inline void reportStat(const S1& region, const S2& category, const T& value,
539  const StatTotal::Type& type) {
540  internal::sysStatManager()->addToStat(region, category, value, type);
541 }
542 
543 template <typename S1, typename S2, typename T>
544 inline void reportStat_Single(const S1& region, const S2& category,
545  const T& value) {
546  reportStat(region, category, value, StatTotal::SINGLE);
547 }
548 
549 template <typename S1, typename S2, typename T>
550 inline void reportStat_Tmin(const S1& region, const S2& category,
551  const T& value) {
552  reportStat(region, category, value, StatTotal::TMIN);
553 }
554 
555 template <typename S1, typename S2, typename T>
556 inline void reportStat_Tmax(const S1& region, const S2& category,
557  const T& value) {
558  reportStat(region, category, value, StatTotal::TMAX);
559 }
560 
561 template <typename S1, typename S2, typename T>
562 inline void reportStat_Tsum(const S1& region, const S2& category,
563  const T& value) {
564  reportStat(region, category, value, StatTotal::TSUM);
565 }
566 
567 template <typename S1, typename S2, typename T>
568 inline void reportStat_Tavg(const S1& region, const S2& category,
569  const T& value) {
570  reportStat(region, category, value, StatTotal::TAVG);
571 }
572 
573 template <bool Report = false, typename S1, typename S2, typename T>
574 inline void reportStatCond(const S1& region, const S2& category, const T& value,
575  const StatTotal::Type& type) {
576  if (Report)
577  internal::sysStatManager()->addToStat(region, category, value, type);
578 }
579 
580 template <bool Report = false, typename S1, typename S2, typename T>
581 inline void reportStatCond_Single(const S1& region, const S2& category,
582  const T& value) {
583  if (Report)
584  reportStat(region, category, value, StatTotal::SINGLE);
585 }
586 
587 template <bool Report = false, typename S1, typename S2, typename T>
588 inline void reportStatCond_Tmin(const S1& region, const S2& category,
589  const T& value) {
590  if (Report)
591  reportStat(region, category, value, StatTotal::TMIN);
592 }
593 
594 template <bool Report = false, typename S1, typename S2, typename T>
595 inline void reportStatCond_Tmax(const S1& region, const S2& category,
596  const T& value) {
597  if (Report)
598  reportStat(region, category, value, StatTotal::TMAX);
599 }
600 
601 template <bool Report = false, typename S1, typename S2, typename T>
602 inline void reportStatCond_Tsum(const S1& region, const S2& category,
603  const T& value) {
604  if (Report)
605  reportStat(region, category, value, StatTotal::TSUM);
606 }
607 
608 template <bool Report = false, typename S1, typename S2, typename T>
609 inline void reportStatCond_Tavg(const S1& region, const S2& category,
610  const T& value) {
611  if (Report)
612  reportStat(region, category, value, StatTotal::TAVG);
613 }
614 
615 template <typename S1, typename S2, typename V>
616 void reportParam(const S1& region, const S2& category, const V& value) {
617  internal::sysStatManager()->addToParam(region, category, value);
618 }
619 
620 void setStatFile(const std::string& f);
621 
625 void reportRUsage(const std::string& id);
626 
627 // TODO: switch to gstl::Str in here
629 void reportPageAlloc(const char* category);
631 void reportNumaAlloc(const char* category);
632 
633 } // end namespace runtime
634 } // end namespace galois
635 
636 #endif // GALOIS_STAT_MANAGER_H
static constexpr const char *const TSTAT_ENV_VAR
Definition: Statistics.h:343
void reportStatCond_Single(const S1 &region, const S2 &category, const T &value)
Definition: Statistics.h:581
void reportStatCond(const S1 &region, const S2 &category, const T &value, const StatTotal::Type &type)
Definition: Statistics.h:574
void reportRUsage(const std::string &id)
Reports maximum resident set size and page faults stats using rusage.
Definition: Statistics.cpp:47
RunningSum(void)
Definition: Statistics.h:89
const T & min(void) const
Definition: Statistics.h:68
void readParam(const str_iterator &i, S &region, S &category, Str &total, StatTotal::Type &type, V &vec) const
Definition: Statistics.h:488
StatManager(const std::string &outfile="")
Definition: Statistics.cpp:35
Definition: Statistics.h:134
fp_iterator fpBegin(void) const
Definition: Statistics.cpp:104
static constexpr const char *const TSTAT_NAME
Definition: Statistics.h:342
void reportStat_Tmax(const S1 &region, const S2 &category, const T &value)
Definition: Statistics.h:556
Definition: Statistics.h:157
void reportParam(const S1 &region, const S2 &category, const V &value)
Definition: Statistics.h:616
void reportStatCond_Tmax(const S1 &region, const S2 &category, const T &value)
Definition: Statistics.h:595
Definition: Statistics.h:157
std::map< K, V, C, FixedSizeAlloc< std::pair< const K, V >>> Map
Definition: gstl.h:65
void reportStatCond_Tavg(const S1 &region, const S2 &category, const T &value)
Definition: Statistics.h:609
void add(const T &val)
Definition: Statistics.h:147
static constexpr const char *const SEP
Definition: Statistics.h:340
Type
Definition: Statistics.h:157
#define GALOIS_DIE(...)
Definition: gIO.h:96
void add(const T &val)
Definition: Statistics.h:78
str_iterator paramBegin(void) const
Definition: Statistics.cpp:111
void setStatFile(const std::string &outfile)
Definition: Statistics.cpp:39
void reportStat_Tsum(const S1 &region, const S2 &category, const T &value)
Definition: Statistics.h:562
void reportStatCond_Tsum(const S1 &region, const S2 &category, const T &value)
Definition: Statistics.h:602
Definition: Statistics.h:104
void add(const T &val)
Definition: Statistics.h:111
Definition: Statistics.h:155
std::set< T, C, FixedSizeAlloc< T >> Set
Definition: gstl.h:62
Definition: Statistics.h:60
virtual ~StatManager()
Definition: Statistics.cpp:37
str_iterator paramEnd(void) const
Definition: Statistics.cpp:114
void reportPageAlloc(const char *category)
Reports Galois system memory stats for all threads.
Definition: Statistics.cpp:128
galois::gstl::Str Str
Definition: Statistics.h:338
void setName(Str &&name)
Definition: Statistics.h:126
T avg() const
Definition: Statistics.h:100
void print(void)
Definition: Statistics.cpp:68
void readFPstat(const fp_iterator &i, S &region, S &category, double &total, StatTotal::Type &type, V &vec) const
Definition: Statistics.h:481
std::vector< T, Pow2Alloc< T >> Vector
[STL vector using Pow_2_VarSizeAlloc]
Definition: gstl.h:52
Definition: Statistics.h:335
void reportStat_Single(const S1 &region, const S2 &category, const T &value)
Definition: Statistics.h:544
const Ty max(std::atomic< Ty > &a, const Ty &b)
Definition: AtomicHelpers.h:40
Definition: PerThreadStorage.h:88
Definition: Statistics.h:117
static bool printingThreadVals(void)
Definition: Statistics.cpp:64
void setName(const Str &name)
Definition: Statistics.h:124
void mergeStats(void)
Definition: Statistics.h:458
const Str & name(void) const
Definition: Statistics.h:128
Definition: Statistics.h:84
Str makeStr(const T &x)
Definition: gstl.h:102
int_iterator intBegin(void) const
Definition: Statistics.cpp:97
const size_t & count(void) const
Definition: Statistics.h:98
void reportNumaAlloc(const char *category)
Reports NUMA memory stats for all NUMA nodes.
Definition: Statistics.cpp:136
Definition: Statistics.h:72
const Vec & values(void) const
Definition: Statistics.h:113
void reportStatCond_Tmin(const S1 &region, const S2 &category, const T &value)
Definition: Statistics.h:588
static const char * str(const Type &t)
Definition: Statistics.h:159
const Ty min(std::atomic< Ty > &a, const Ty &b)
Definition: AtomicHelpers.h:70
void reportStat_Tavg(const S1 &region, const S2 &category, const T &value)
Definition: Statistics.h:568
AggregStat< T, RunningSum< T >, Bases...> with_sum
Definition: Statistics.h:141
int_iterator intEnd(void) const
Definition: Statistics.cpp:100
RunningMin(void)
Definition: Statistics.h:64
const Ty add(std::atomic< Ty > &a, const Ty &b)
Definition: AtomicHelpers.h:98
void addToStat(const S1 &region, const S2 &category, const T &val, const StatTotal::Type &type)
Definition: Statistics.h:508
void add(const T &val)
Definition: Statistics.h:91
Definition: Statistics.h:157
boost::uuids::uuid getRandUUID()
Definition: Statistics.cpp:28
virtual void printStats(std::ostream &out)
Definition: Statistics.cpp:82
fp_iterator fpEnd(void) const
Definition: Statistics.cpp:107
RunningMax(void)
Definition: Statistics.h:76
void add(const T &val)
Definition: Statistics.h:66
void reportStat(const S1 &region, const S2 &category, const T &value, const StatTotal::Type &type)
Definition: Statistics.h:538
static constexpr const char * statKind(void)
Definition: Statistics.h:348
const T & max(void) const
Definition: Statistics.h:80
Definition: Statistics.h:157
void printHeader(std::ostream &out) const
Definition: Statistics.cpp:90
void setStatFile(const std::string &f)
Definition: Statistics.cpp:43
const T & sum(void) const
Definition: Statistics.h:96
static constexpr const char *const TSTAT_SEP
Definition: Statistics.h:341
void reportStat_Tmin(const S1 &region, const S2 &category, const T &value)
Definition: Statistics.h:550
Definition: Statistics.h:157
void addToParam(const S1 &region, const S2 &category, const V &val)
Definition: Statistics.h:522
std::basic_string< char, std::char_traits< char >, Pow2Alloc< char >> Str
Definition: gstl.h:75
void readIntStat(const int_iterator &i, S &region, S &category, int64_t &total, StatTotal::Type &type, V &vec) const
Definition: Statistics.h:474
void add(const T &) const
Definition: Statistics.h:130