00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <algorithm>
00026 #include <iomanip>
00027 #include <numeric>
00028 #include <utility>
00029
00030 #include "WAssert.h"
00031 #include "WHistogramBasic.h"
00032 #include "WLimits.h"
00033 #include "WLogger.h"
00034
00035 WHistogramBasic::WHistogramBasic( double min, double max, size_t buckets ):
00036 WHistogram( min, max, buckets ),
00037 m_bins( buckets, 0 ),
00038 m_intervalWidth( ( m_maximum - m_minimum ) / static_cast< double >( m_nbBuckets ) )
00039 {
00040 }
00041
00042 WHistogramBasic::WHistogramBasic( const WHistogramBasic& hist ):
00043 WHistogram( hist ),
00044 m_bins( hist.m_bins ),
00045 m_intervalWidth( hist.m_intervalWidth )
00046
00047 {
00048 }
00049
00050 WHistogramBasic::~WHistogramBasic()
00051 {
00052 }
00053
00054 size_t WHistogramBasic::operator[]( size_t index ) const
00055 {
00056 return m_bins[ index ];
00057 }
00058
00059 size_t WHistogramBasic::at( size_t index ) const
00060 {
00061 if( index >= m_bins.size() )
00062 {
00063 wlog::error( "WHistogramBasic" ) << index << "th interval is not available, there are only: " << m_bins.size();
00064 return 0;
00065 }
00066 return m_bins[ index ];
00067 }
00068
00069 double WHistogramBasic::getBucketSize( size_t ) const
00070 {
00071 return m_intervalWidth;
00072 }
00073
00074 std::pair< double, double > WHistogramBasic::getIntervalForIndex( size_t index ) const
00075 {
00076 double first = m_minimum + m_intervalWidth * index;
00077 double second = m_minimum + m_intervalWidth * ( index + 1 );
00078 return std::make_pair( first, second );
00079 }
00080
00081 void WHistogramBasic::insert( double value )
00082 {
00083 if( value > m_maximum || value < m_minimum )
00084 {
00085 wlog::warn( "WHistogramBasic" ) << std::scientific << std::setprecision( 16 ) << "Inserted value out of bounds, thread: "
00086 << value << " as min, resp. max: " << m_minimum << "," << m_maximum;
00087 return;
00088 }
00089
00090 if( value == m_maximum )
00091 {
00092 value = m_maximum - wlimits::DBL_EPS;
00093 }
00094
00095 m_bins.at( static_cast< size_t >( std::abs( value - m_minimum ) / m_intervalWidth ) )++;
00096 }
00097
00098 size_t WHistogramBasic::valuesSize() const
00099 {
00100 return std::accumulate( m_bins.begin(), m_bins.end(), 0 );
00101 }
00102