00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "statistics.h"
00011
00012 #include <sstream>
00013 #include <time.h>
00014 #include "error.h"
00015
00016 using namespace std;
00017 using namespace PathFind;
00018
00019
00020
00021 Statistics::Statistics()
00022 {
00023 clear();
00024 }
00025
00026 void Statistics::add(double value)
00027 {
00028 m_count += 1.0;
00029 m_sum += value;
00030 m_sumSq += (value * value);
00031 }
00032
00033 void Statistics::add(const Statistics& statistics)
00034 {
00035 m_count += statistics.m_count;
00036 m_sum += statistics.m_sum;
00037 m_sumSq += statistics.m_sumSq;
00038 }
00039
00040 void Statistics::clear()
00041 {
00042 m_count = 0;
00043 m_sum = 0;
00044 m_sumSq = 0;
00045 }
00046
00047 double Statistics::getVariance() const
00048 {
00049 double mean = getMean();
00050 return m_sumSq / m_count - mean * mean;
00051 }
00052
00053 void Statistics::print(ostream& o) const
00054 {
00055 o << getMean() << ' ' << getDeviation();
00056 }
00057
00058
00059
00060 void StatisticsCollection::add(const StatisticsCollection& collection)
00061 {
00062 if (m_map.size() != collection.m_map.size())
00063 throw Error("Trying to add incompatible statistics collections");
00064 map<string,Statistics>::iterator p;
00065 for (p = m_map.begin(); p != m_map.end(); ++p)
00066 {
00067 map<string,Statistics>::const_iterator k
00068 = collection.m_map.find(p->first);
00069 if (k == collection.m_map.end())
00070 throw Error("Trying to add incompatible statistics collections");
00071 p->second.add(k->second);
00072 }
00073 }
00074
00075 void StatisticsCollection::clear()
00076 {
00077 map<string,Statistics>::iterator p;
00078 for (p = m_map.begin(); p != m_map.end(); ++p)
00079 p->second.clear();
00080 }
00081
00082 void StatisticsCollection::create(const string& name)
00083 {
00084 m_map[name] = Statistics();
00085 }
00086
00087 const Statistics& StatisticsCollection::get(const string& name) const
00088 {
00089 map<string,Statistics>::const_iterator p = m_map.find(name);
00090 if (p == m_map.end())
00091 {
00092 ostringstream o;
00093 o << "Unknown statistics name " << name << '.';
00094 throw Error(o.str());
00095 }
00096 return p->second;
00097 }
00098
00099
00100 Statistics& StatisticsCollection::get(const string& name)
00101 {
00102 map<string,Statistics>::iterator p = m_map.find(name);
00103 if (p == m_map.end())
00104 {
00105 ostringstream o;
00106 o << "Unknown statistics name " << name << '.';
00107 throw Error(o.str());
00108 }
00109 return p->second;
00110 }
00111
00112 void StatisticsCollection::print(ostream& o) const
00113 {
00114 map<string,Statistics>::const_iterator p;
00115 for (p = m_map.begin(); p != m_map.end(); ++p)
00116 {
00117 string name = p->first;
00118 const Statistics& statistics = p->second;
00119 o << name << ' ';
00120 statistics.print(o);
00121 o << '\n';
00122 }
00123 }
00124
00125
00126
00127 #if 0
00128
00129 void check(bool expression, int line)
00130 {
00131 if (! expression)
00132 cerr << "Error line " << line << '\n';
00133 }
00134
00135 int main()
00136 {
00137 Statistics statistics;
00138 statistics.add(1.0);
00139 statistics.add(2.0);
00140 statistics.add(3.0);
00141 check(fabs(statistics.getMean() - 2.000) < 0.001, __LINE__);
00142 check(fabs(statistics.getDeviation() - 0.816) < 0.001, __LINE__);
00143
00144 Statistics statistics2;
00145 statistics2.add(-1.0);
00146 statistics2.add(2.5);
00147 statistics2.add(2.5);
00148 statistics2.add(2.7);
00149 check(fabs(statistics2.getMean() - 1.675) < 0.001, __LINE__);
00150 check(fabs(statistics2.getDeviation() - 1.547) < 0.001, __LINE__);
00151
00152 statistics.add(statistics2);
00153 check(fabs(statistics.getMean() - 1.814) < 0.001, __LINE__);
00154 check(fabs(statistics.getDeviation() - 1.296) < 0.001, __LINE__);
00155 return 0;
00156 }
00157
00158 #endif
00159
00160