OGS
Histogram.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <algorithm>
7#include <cstddef>
8#include <iosfwd>
9#include <iterator>
10#include <string>
11#include <utility>
12#include <vector>
13
14namespace BaseLib
15{
20template <typename T>
22{
23public:
24 using Data =
25 typename std::vector<double>;
26
27public:
38 template <typename InputIterator>
39 Histogram(InputIterator first, InputIterator last, const int nr_bins = 16,
40 const bool computeHistogram = true)
41 : data_(first, last), nr_bins_(nr_bins), dirty_(true)
42 {
43 init(computeHistogram);
44 }
45
52 explicit Histogram(std::vector<T> data, const unsigned int nr_bins = 16,
53 const bool computeHistogram = true)
54 : data_(std::move(data)), nr_bins_(nr_bins), dirty_(true)
55 {
56 init(computeHistogram);
57 }
58
69 void update()
70 {
71 if (!dirty_)
72 {
73 return;
74 }
75
77
78 auto it = data_.begin();
79 for (unsigned int bin = 0; bin < nr_bins_; bin++)
80 {
81 auto itEnd = std::upper_bound(it, data_.end(),
82 min_ + (bin + 1) * bin_width_);
83 histogram_[bin] = std::distance(it, itEnd);
84 it = itEnd;
85 }
86 dirty_ = false;
87 }
88
89 void setMinimum(const T& minimum)
90 {
91 min_ = minimum;
92 dirty_ = true;
93 }
94 void setMaximum(const T& maximum)
95 {
96 max_ = maximum;
97 dirty_ = true;
98 }
99
100 const Data& getSortedData() const { return data_; }
101 const std::vector<std::size_t>& getBinCounts() const { return histogram_; }
102 const unsigned int& getNumberOfBins() const { return nr_bins_; }
103 const T& getMinimum() const { return min_; }
104 const T& getMaximum() const { return max_; }
105 const T& getBinWidth() const { return bin_width_; }
106
107 void prettyPrint(std::ostream& os,
108 const unsigned int line_width = 16) const;
109
110 int write(std::string const& file_name, std::string const& data_set_name,
111 std::string const& param_name) const;
112
113protected:
116 void init(const bool computeHistogram = true)
117 {
118 std::sort(data_.begin(), data_.end());
119 histogram_.resize(nr_bins_);
120 min_ = data_.front();
121 max_ = data_.back();
123
124 dirty_ = true;
125 if (computeHistogram)
126 {
127 update();
128 }
129 }
130
132 const unsigned int nr_bins_;
133 std::vector<std::size_t> histogram_;
136
137private:
138 bool dirty_;
139};
140
146template <typename T>
147std::ostream& operator<<(std::ostream& os, const Histogram<T>& h);
148
149extern template class Histogram<double>;
150extern template std::ostream& operator<<(std::ostream& os,
151 const Histogram<double>& h);
152} // namespace BaseLib
const T & getBinWidth() const
Definition Histogram.h:105
const T & getMinimum() const
Definition Histogram.h:103
bool dirty_
When set update() will recompute histogram.
Definition Histogram.h:138
void setMaximum(const T &maximum)
Definition Histogram.h:94
T max_
Minimum and maximum input data values.
Definition Histogram.h:134
const Data & getSortedData() const
Definition Histogram.h:100
const unsigned int & getNumberOfBins() const
Definition Histogram.h:102
const std::vector< std::size_t > & getBinCounts() const
Definition Histogram.h:101
typename std::vector< double > Data
Definition Histogram.h:24
void init(const bool computeHistogram=true)
Definition Histogram.h:116
void prettyPrint(std::ostream &os, const unsigned int line_width=16) const
Definition Histogram.cpp:48
Histogram(std::vector< T > data, const unsigned int nr_bins=16, const bool computeHistogram=true)
Definition Histogram.h:52
const T & getMaximum() const
Definition Histogram.h:104
std::vector< std::size_t > histogram_
Definition Histogram.h:133
Histogram(InputIterator first, InputIterator last, const int nr_bins=16, const bool computeHistogram=true)
Underlying input data vector type.
Definition Histogram.h:39
void setMinimum(const T &minimum)
Definition Histogram.h:89
const unsigned int nr_bins_
Definition Histogram.h:132
int write(std::string const &file_name, std::string const &data_set_name, std::string const &param_name) const
Definition Histogram.cpp:15
std::ostream & operator<<(std::ostream &os, const Histogram< T > &h)
Definition Histogram.cpp:70