Skip to content

Commit

Permalink
+ replace float with double
Browse files Browse the repository at this point in the history
+ improved comments
  • Loading branch information
RobTillaart committed Sep 29, 2013
1 parent be3ad90 commit a9e0b67
Showing 2 changed files with 52 additions and 25 deletions.
60 changes: 43 additions & 17 deletions libraries/Histogram/histogram.cpp
Original file line number Diff line number Diff line change
@@ -7,13 +7,14 @@
// HISTORY:
// 0.1.0 - 2012-11-10 initial version
// 0.1.1 - 2012-11-10 added PMF() and CDF()
// 0.1.2 - 2012-12-23 changed float to double; some comments
//
// Released to the public domain
//

#include "histogram.h"

Histogram::Histogram(uint8_t len, float *bounds)
Histogram::Histogram(uint8_t len, double *bounds)
{
_bounds = bounds;
_len = len;
@@ -23,7 +24,7 @@ Histogram::Histogram(uint8_t len, float *bounds)

Histogram::~Histogram()
{
free(_data);
free(_data); // free may still has a bug :(
}

// resets all counters
@@ -37,14 +38,14 @@ void Histogram::clear()
}

// adds a new value to the histogram - increasing
void Histogram::add(float f)
void Histogram::add(double f)
{
_data[find(f)]++;
_cnt++;
}

// adds a new value to the histogram - decreasing
void Histogram::sub(float f)
void Histogram::sub(double f)
{
_data[find(f)]--;
_cnt++;;
@@ -62,35 +63,60 @@ unsigned long Histogram::count()
return _cnt;
}

// returns the absolute count of a bucket
// returns the count of a bucket
long Histogram::bucket(uint8_t idx)
{
if (idx > _len) return 0;
if (idx > _len+1) return 0;
return _data[idx];
}

#define frequency(x) PMF(x)

// returns the relative frequency of a bucket
float Histogram::PMF(uint8_t idx)
double Histogram::frequency(uint8_t idx)
{
if (_cnt < 1) return NAN;
if (_cnt == 0) return NAN;
if (idx > _len+1) return 0;
return _data[idx]/ _cnt;
return (1.0 * _data[idx]) / _cnt;
}

// returns the relative frequency of a bucket
float Histogram::CDF(uint8_t idx)
// returns the probability of the bucket of a value
double Histogram::PMF(double val)
{
if (_cnt == 0) return NAN;
uint8_t idx = find(val);
return (1.0 *_data[idx]) / _cnt;
}

// returns the cummulative probability of
// values <= value
double Histogram::CDF(double val)
{
if (_cnt < 1) return NAN;
if (idx > _len+1) idx = _len+1;
if (_cnt == 0) return NAN;
uint8_t idx = find(val);
long sum = 0;
for (uint8_t i=0; i<= idx; i++) sum += _data[i];
return sum/ _cnt;
return (1.0 * sum) / _cnt;
}

// EXPERIMENTAL
// returns the value of the original array for
// which the CDF is at least prob.
double Histogram::VAL(double prob)
{
if (_cnt == 0) return NAN;
if (prob < 0.0) prob = 0.0;
if (prob > 1.0) prob = 1.0;

long sum = 0;
for (uint8_t i = 0; i <= _len; i++)
{
sum += _data[i];
if (sum >= (prob * _cnt)) return _bounds[i];
}
return INFINITY;
}

// returns the bucket number for value f
uint8_t Histogram::find(float f)
uint8_t Histogram::find(double f)
{
uint8_t i = 0;
while(i < _len && f > _bounds[i]) i++;
17 changes: 9 additions & 8 deletions libraries/Histogram/histogram.h
Original file line number Diff line number Diff line change
@@ -18,22 +18,23 @@
class Histogram
{
public:
Histogram(uint8_t len, float *bounds);
Histogram(uint8_t len, double *bounds);
~Histogram();
void clear();
void add(float val);
void sub(float val);
void add(double val);
void sub(double val);
uint8_t size();
unsigned long count();
long bucket(uint8_t idx);
float frequency(uint8_t idx);
float PMF(uint8_t idx);
float CDF(uint8_t idx);
uint8_t find(float f);
double frequency(uint8_t idx);
double PMF(double val);
double CDF(double val);
double VAL(double prob);
uint8_t find(double f);
// void strategy();

protected:
float * _bounds;
double * _bounds;
long * _data;
uint8_t _len;
unsigned long _cnt;

0 comments on commit a9e0b67

Please sign in to comment.