| #pragma once | 
 |  | 
 | #include <memory> | 
 | #include <vector> | 
 |  | 
 | namespace dnnlowp { | 
 |  | 
 | /** | 
 |  * bin_width = (max - min)/nbins | 
 |  * ith bin (zero-based indexing) contains [i*bin_width, (i+1)*bin_width) | 
 |  * with an exception that (nbins - 1)th bin contains | 
 |  * [(nbins-1)*bin_width, nbins*bin_width] | 
 |  * | 
 |  */ | 
 | class Histogram { | 
 |  public: | 
 |   Histogram(int nbins, float min, float max) | 
 |       : min_(min), max_(max), histogram_(nbins) {} | 
 |   Histogram(float min, float max, const std::vector<uint64_t>& bins) | 
 |       : min_(min), max_(max), histogram_(bins) {} | 
 |  | 
 |   void Add(float f, uint64_t cnt = 1); | 
 |   /** | 
 |    * This version collects histogram with single thread | 
 |    */ | 
 |   void Add(const float* f, int len); | 
 |  | 
 |   float Min() const { | 
 |     return min_; | 
 |   } | 
 |   float Max() const { | 
 |     return max_; | 
 |   } | 
 |  | 
 |   const std::vector<uint64_t>* GetHistogram() const { | 
 |     return &histogram_; | 
 |   } | 
 |  | 
 |  private: | 
 |   float min_, max_; | 
 |   std::vector<uint64_t> histogram_; | 
 | }; | 
 |  | 
 | /// An equi-width histogram where the spread of bins change over time when | 
 | /// we see new min or max values. | 
 | class DynamicHistogram { | 
 |  public: | 
 |   DynamicHistogram(int nbins); | 
 |  | 
 |   void Add(float f); | 
 |   void Add(const float* f, int len); | 
 |  | 
 |   /// Indicate we're not dynamically adjusting histogram bins any more and | 
 |   /// return the current static histogram. | 
 |   const Histogram* Finalize(); | 
 |  | 
 |  private: | 
 |   /// Dynamic histogram is implemented by the series of static histograms | 
 |   /// and expands from the old histogram to new histogram when | 
 |   /// we see a new extremum. | 
 |   /// An invariant: the beginning of the first bin of histograms_[i] exactly | 
 |   /// matches with the beginning of a bin in histograms_[i+1]. The end of the | 
 |   /// last bin of histograms_[i] exactly matches with the end of a bin in | 
 |   /// histograms_[i+1]. | 
 |   std::unique_ptr<Histogram> histogram_; | 
 |   int nbins_; | 
 |   float min_, max_; | 
 |  | 
 |   std::unique_ptr<Histogram> final_histogram_; | 
 | }; // class DynamicHistogram | 
 |  | 
 | } // namespace dnnlowp |