DiSMEC++
histogram.h
Go to the documentation of this file.
1 // Copyright (c) 2021, Aalto University, developed by Erik Schultheis
2 // All rights reserved.
3 //
4 // SPDX-License-Identifier: MIT
5 
6 #ifndef DISMEC_HISTOGRAM_H
7 #define DISMEC_HISTOGRAM_H
8 
9 #include "stats_base.h"
10 #if defined __has_include
11 #if __has_include(<boost/histogram.hpp>)
12 #include <boost/histogram.hpp>
13 #define DISMEC_STATS_SUPPORT_HISTOGRAM 1
14 #endif
15 #endif
16 
17 namespace dismec::stats
18 {
19 #if DISMEC_STATS_SUPPORT_HISTOGRAM
20  template<class Axis>
21  class HistogramStat final : public StatImplBase<HistogramStat<Axis>> {
22  public:
23  HistogramStat(int bins, real_t min, real_t max);
24  ~HistogramStat() override = default;
25 
26  [[nodiscard]] std::unique_ptr<Statistics> clone() const override;
27  void merge_imp(const HistogramStat<Axis>& other);
28 
29  [[nodiscard]] nlohmann::json to_json() const override;
30  private:
31  void record_int(long value) override;
32  void record_real(real_t value) override;
33  void record_vec(const DenseRealVector& vector) override;
34 
35  boost::histogram::histogram<std::tuple<Axis>> m_Histogram;
36 
37  // we keep a copy of the constructor parameters for convenience, so we can easily clone!
38  int m_Bins;
39  real_t m_Min;
40  real_t m_Max;
41  };
42 
43  template<class Axis>
44  class TaggedHistogramStat final : public StatImplBase<TaggedHistogramStat<Axis>> {
45  public:
46  TaggedHistogramStat(std::string tag, int max_tag, int bins, real_t min, real_t max);
47  ~TaggedHistogramStat() override = default;
48 
49  [[nodiscard]] std::unique_ptr<Statistics> clone() const override;
50  void merge_imp(const TaggedHistogramStat<Axis>& other);
51 
52  [[nodiscard]] nlohmann::json to_json() const override;
53  void setup(const StatisticsCollection& source) override;
54  private:
55  void record_int(long value) override;
56  void record_real(real_t value) override;
57  void record_vec(const DenseRealVector& vector) override;
58 
59  using histogram_t = boost::histogram::histogram<std::tuple<Axis>>;
60  std::vector<histogram_t> m_Histograms;
61 
62  histogram_t& get_active_hist();
63 
64  // we keep a copy of the constructor parameters for convenience, so we can easily clone!
65  int m_Bins;
66  int m_MaxTag;
67  real_t m_Min;
68  real_t m_Max;
69 
70  TagContainer m_Tag;
71  };
72 #else
73 #warning "Compiling without histogram support"
74 #endif
75 
76  std::unique_ptr<Statistics> make_linear_histogram(int bins, real_t min, real_t max);
77  std::unique_ptr<Statistics> make_logarithmic_histogram(int bins, real_t min, real_t max);
78  std::unique_ptr<Statistics> make_linear_histogram(std::string tag, int max_tag, int bins, real_t min, real_t max);
79  std::unique_ptr<Statistics> make_logarithmic_histogram(std::string tag, int max_tag, int bins, real_t min, real_t max);
80 
81 }
82 
83 #endif //DISMEC_HISTOGRAM_H
nlohmann::json json
Definition: model-io.cpp:22
std::unique_ptr< Statistics > make_linear_histogram(int bins, real_t min, real_t max)
Definition: histogram.cpp:218
std::unique_ptr< Statistics > make_logarithmic_histogram(int bins, real_t min, real_t max)
Definition: histogram.cpp:222
types::DenseVector< real_t > DenseRealVector
Any dense, real values vector.
Definition: matrix_types.h:40
float real_t
Definition: regularizers.h:11