30 #ifndef DEF_METRICS_HPP
31 #define DEF_METRICS_HPP
46 enum metrictype {REAL, INTEGER, TIME, STRING, VECTOR};
59 std::string stringval;
60 std::vector<double> v;
66 inline metrics_entry(
double firstvalue, metrictype _valtype) {
67 minvalue = firstvalue;
68 maxvalue = firstvalue;
73 if (valtype == VECTOR) v.push_back(firstvalue);
84 minvalue = std::numeric_limits<double>::max();
85 maxvalue = std::numeric_limits<double>::min();
87 inline void adj(
double v) {
92 minvalue = std::min(v,minvalue);
93 maxvalue = std::max(v,maxvalue);
98 inline void add(
double x) {
103 if (valtype == VECTOR) {
111 inline void set(
double v) {
116 inline void set(std::string s) {
120 inline void add_vector_entry(
size_t i,
double x) {
121 if (v.size() < i + 1) v.resize(i + 1);
129 inline void set_vector_entry(
size_t i,
double x) {
130 if (v.size() < i + 1) v.resize(i + 1);
132 value = value - v[i] + x;
133 cumvalue = cumvalue - v[i] + x;
136 minvalue = x; maxvalue = x;
137 for (
size_t i = 0; i < v.size(); ++i) {
142 inline void timer_start() {
143 gettimeofday(&start_time, NULL);
146 inline void timer_stop() {
148 gettimeofday(&end, NULL);
149 lasttime = end.tv_sec - start_time.tv_sec + ((double)(end.tv_usec - start_time.tv_usec)) / 1.0E6;
158 virtual void do_report(std::string name, std::string
id, std::map<std::string, metrics_entry> & entries) = 0;
167 std::string name, ident;
168 std::map<std::string, metrics_entry> entries;
172 inline metrics(std::string _name =
"", std::string _id =
"") : name(_name), ident (_id) {
175 inline void clear() {
180 inline std::string iterkey(std::string key,
int iter) {
182 sprintf(s,
"%s.%d", key.c_str(), iter);
183 return std::string(s);
189 inline void add(std::string key,
double value, metrictype type = REAL) {
191 if (entries.count(key) == 0) {
194 entries[key].add(value);
199 inline void add_to_vector(std::string key,
double value) {
200 if (entries.count(key) == 0) {
203 entries[key].add(value);
207 inline void add_vector_entry(std::string key,
size_t idx,
double value) {
208 if (entries.count(key) == 0) {
209 entries[key] = metrics_entry(VECTOR);
211 entries[key].add_vector_entry(idx, value);
214 inline void set(std::string key,
size_t value) {
215 set(key, (double)value, INTEGER);
219 inline void set(std::string key,
int value) {
220 set(key, (double)value, INTEGER);
223 inline void set(std::string key,
double value, metrictype type = REAL) {
224 if (entries.count(key) == 0) {
225 entries[key] = metrics_entry(value, type);
227 entries[key].set(value);
231 inline void set_integer(std::string key,
size_t value) {
232 if (entries.count(key) == 0) {
233 entries[key] = metrics_entry((
double)value, INTEGER);
235 entries[key].set((
double)value);
239 inline void set(std::string key, std::string s) {
240 if (entries.count(key) == 0) {
241 entries[key] = metrics_entry(s);
247 inline void set_vector_entry_integer(std::string key,
size_t idx,
size_t value) {
248 set_vector_entry(key, idx, (
double)(value));
251 inline void set_vector_entry(std::string key,
size_t idx,
double value) {
254 if (entries.count(key) == 0) {
255 entries[key] = metrics_entry(VECTOR);
257 entries[key].set_vector_entry(idx, value);
261 inline void start_time(std::string key) {
264 if (entries.count(key) == 0) {
265 entries[key] = metrics_entry(TIME);
267 entries[key].timer_start();
272 metrics_entry start_time() {
273 metrics_entry me(TIME);
280 inline void stop_time(metrics_entry me, std::string key,
bool show=
false) {
284 if (entries.count(key) == 0) {
285 entries[key] = metrics_entry(TIME);
287 entries[key].add(me.lasttime);
289 std::cout << key <<
": " << me.lasttime <<
" secs." << std::endl;
294 inline void stop_time(metrics_entry me, std::string key,
int iternum,
bool show=
false) {
298 double t = me.lasttime;
299 if (entries.count(key) == 0) {
300 entries[key] = metrics_entry(TIME);
304 std::cout << key <<
": " << me.lasttime <<
" secs." << std::endl;
307 sprintf(s,
"%s.%d", key.c_str(), iternum);
309 if (entries.count(ikey) == 0) {
310 entries[ikey] = metrics_entry(TIME);
312 entries[ikey].add(t);
319 inline void stop_time(std::string key,
bool show =
false) {
321 std::cout << key <<
": " << entries[key].lasttime <<
" secs." << std::endl;
322 entries[key].timer_stop();
325 inline metrics_entry
get(std::string key) {
329 void report(imetrics_reporter & reporter) {
331 reporter.do_report(name, ident, entries);