37c37
< Histogram::Histogram(int binsize, int bins)
---
> Histogram::Histogram(int binsize, uint32_t bins)
40,41c40
< m_bins = bins;
< clear();
---
> clear(bins);
49c48
< Histogram::clear(int binsize, int bins)
---
> Histogram::clear(int binsize, uint32_t bins)
56c55
< Histogram::clear(int bins)
---
> Histogram::clear(uint32_t bins)
58d56
< m_bins = bins;
61,62c59,60
< m_data.resize(m_bins);
< for (int i = 0; i < m_bins; i++) {
---
> m_data.resize(bins);
> for (uint32_t i = 0; i < bins; i++) {
64a63
>
67d65
<
71a70,74
> void
> Histogram::doubleBinSize()
> {
> assert(m_binsize != -1);
> uint32_t t_bins = m_data.size();
72a76,85
> for (uint32_t i = 0; i < t_bins/2; i++) {
> m_data[i] = m_data[i*2] + m_data[i*2 + 1];
> }
> for (uint32_t i = t_bins/2; i < t_bins; i++) {
> m_data[i] = 0;
> }
>
> m_binsize *= 2;
> }
>
83c96,97
< int index;
---
> uint32_t index;
>
96,104c110,112
< while (m_max >= (m_bins * m_binsize)) {
< for (int i = 0; i < m_bins/2; i++) {
< m_data[i] = m_data[i*2] + m_data[i*2 + 1];
< }
< for (int i = m_bins/2; i < m_bins; i++) {
< m_data[i] = 0;
< }
< m_binsize *= 2;
< }
---
> uint32_t t_bins = m_data.size();
>
> while (m_max >= (t_bins * m_binsize)) doubleBinSize();
107c115,116
< assert(index >= 0);
---
>
> assert(index < m_data.size());
113c122
< Histogram::add(const Histogram& hist)
---
> Histogram::add(Histogram& hist)
115,117c124
< assert(hist.getBins() == m_bins);
< assert(hist.getBinSize() == -1); // assume log histogram
< assert(m_binsize == -1);
---
> uint32_t t_bins = m_data.size();
119,120c126,127
< for (int j = 0; j < hist.getData(0); j++) {
< add(0);
---
> if (hist.getBins() != t_bins) {
> fatal("Histograms with different number of bins cannot be combined!");
123,125c130,138
< for (int i = 1; i < m_bins; i++) {
< for (int j = 0; j < hist.getData(i); j++) {
< add(1<<(i-1)); // account for the + 1 index
---
> m_max = max(m_max, hist.getMax());
> m_count += hist.size();
> m_sumSamples += hist.getTotal();
> m_sumSquaredSamples += hist.getSquaredTotal();
>
> // Both histograms are log base 2.
> if (hist.getBinSize() == -1 && m_binsize == -1) {
> for (int j = 0; j < hist.getData(0); j++) {
> add(0);
126a140,162
>
> for (uint32_t i = 1; i < t_bins; i++) {
> for (int j = 0; j < hist.getData(i); j++) {
> add(1<<(i-1)); // account for the + 1 index
> }
> }
> } else if (hist.getBinSize() >= 1 && m_binsize >= 1) {
> // Both the histogram are linear.
> // We are assuming that the two histograms have the same
> // minimum value that they can store.
>
> while (m_binsize > hist.getBinSize()) hist.doubleBinSize();
> while (hist.getBinSize() > m_binsize) doubleBinSize();
>
> assert(m_binsize == hist.getBinSize());
>
> for (uint32_t i = 0; i < t_bins; i++) {
> m_data[i] += hist.getData(i);
>
> if (m_data[i] > 0) m_largest_bin = i;
> }
> } else {
> fatal("Don't know how to combine log and linear histograms!");
180c216,217
< for (int i = 0; i < m_bins && i <= m_largest_bin; i++) {
---
>
> for (uint32_t i = 0; i <= m_largest_bin; i++) {