aboutsummaryrefslogtreecommitdiffstats
path: root/parse
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2012-10-29 21:48:23 -0400
committerJonathan Herman <hermanjl@cs.unc.edu>2012-10-29 21:48:23 -0400
commit2e804f8fa7d26755088e47357f8de6feb6dbe292 (patch)
tree5e96c664fcd2b072d80ad06808371dd0ceb61505 /parse
parent5b50c58ea4881dd185897dfa93860c60f551d815 (diff)
Added option to output parsed data as a python-parseable map.
Diffstat (limited to 'parse')
-rw-r--r--parse/point.py9
-rw-r--r--parse/sched.py5
-rw-r--r--parse/tuple_table.py41
3 files changed, 45 insertions, 10 deletions
diff --git a/parse/point.py b/parse/point.py
index 8fdd115..d5f4a5e 100644
--- a/parse/point.py
+++ b/parse/point.py
@@ -37,12 +37,13 @@ class Measurement(object):
37 self[Type.Max] = array.max() 37 self[Type.Max] = array.max()
38 self[Type.Avg] = array.mean() 38 self[Type.Avg] = array.mean()
39 self[Type.Var] = array.var() 39 self[Type.Var] = array.var()
40 self[Type.Min] = array.min()
40 return self 41 return self
41 42
42 def __check_type(self, type): 43 def __check_type(self, type):
43 if not type in Type: 44 if not type in Type:
44 raise AttributeError("Not a valid type '%s'" % type) 45 raise AttributeError("Not a valid type '%s'" % type)
45 46
46 def __getitem__(self, type): 47 def __getitem__(self, type):
47 self.__check_type(type) 48 self.__check_type(type)
48 return self.stats[type] 49 return self.stats[type]
@@ -60,11 +61,11 @@ class Measurement(object):
60 61
61 def __str__(self): 62 def __str__(self):
62 return "%s" % dict_str(self.stats, " ") 63 return "%s" % dict_str(self.stats, " ")
63 64
64 65
65class Summary(Measurement): 66class Summary(Measurement):
66 def __init__(self, id, measures, typemap = default_typemap): 67 def __init__(self, id, measures, typemap = default_typemap):
67 super(Summary, self).__init__("Summary-%s" % id) 68 super(Summary, self).__init__(id)
68 69
69 self.__check_types(measures, typemap) 70 self.__check_types(measures, typemap)
70 self.__summarize(measures, typemap) 71 self.__summarize(measures, typemap)
@@ -108,7 +109,7 @@ class ExpPoint(object):
108 def __check_val(self, obj): 109 def __check_val(self, obj):
109 if not isinstance(obj, Measurement): 110 if not isinstance(obj, Measurement):
110 raise AttributeError("Not a valid measurement '%s'" % obj) 111 raise AttributeError("Not a valid measurement '%s'" % obj)
111 112
112 def __getitem__(self, type): 113 def __getitem__(self, type):
113 return self.stats[type] 114 return self.stats[type]
114 115
diff --git a/parse/sched.py b/parse/sched.py
index cbb051e..80764b6 100644
--- a/parse/sched.py
+++ b/parse/sched.py
@@ -1,6 +1,9 @@
1""" 1"""
2TODO: No longer very pythonic, lot of duplicate code 2TODO: No longer very pythonic, lot of duplicate code
3print out task execution times 3print out task execution times or something
4get miss ratio and tardiness directly from schedule OR
5email list about turning on optional summary statistics OR
6set up run exps to only get release and completions to get these stats
4""" 7"""
5 8
6import config.config as conf 9import config.config as conf
diff --git a/parse/tuple_table.py b/parse/tuple_table.py
index 434eb22..465abb3 100644
--- a/parse/tuple_table.py
+++ b/parse/tuple_table.py
@@ -1,7 +1,9 @@
1from collections import defaultdict 1from collections import defaultdict
2from point import SummaryPoint 2from point import SummaryPoint,Type
3from dir_map import DirMap 3from dir_map import DirMap
4 4
5from pprint import pprint
6
5class ColMap(object): 7class ColMap(object):
6 def __init__(self): 8 def __init__(self):
7 self.rev_map = {} 9 self.rev_map = {}
@@ -31,13 +33,16 @@ class ColMap(object):
31 map[self.col_list[i]] = tuple[i] 33 map[self.col_list[i]] = tuple[i]
32 return map 34 return map
33 35
36 def force_add(self, column):
37 self.rev_map[column] = len(self.col_list)
38 self.col_list += [column]
39
34 def try_add(self, column, value): 40 def try_add(self, column, value):
35 if column not in self.rev_map: 41 if column not in self.rev_map:
36 if column not in self.value_map: 42 if column not in self.value_map:
37 self.value_map[column] = value 43 self.value_map[column] = value
38 elif value != self.value_map[column]: 44 elif value != self.value_map[column]:
39 self.rev_map[column] = len(self.col_list) 45 self.force_add(column)
40 self.col_list += [column]
41 46
42 def __str__(self): 47 def __str__(self):
43 return "<ColMap>%s" % (self.rev_map) 48 return "<ColMap>%s" % (self.rev_map)
@@ -53,6 +58,9 @@ class TupleTable(object):
53 key = self.col_map.get_key(kv) 58 key = self.col_map.get_key(kv)
54 self.table[key] += [point] 59 self.table[key] += [point]
55 60
61 def col_map(self):
62 return self.col_map
63
56 def get_exps(self, kv): 64 def get_exps(self, kv):
57 key = self.col_map.get_key(kv) 65 key = self.col_map.get_key(kv)
58 return self.table[key] 66 return self.table[key]
@@ -66,9 +74,32 @@ class TupleTable(object):
66 raise Exception("cannot reduce twice!") 74 raise Exception("cannot reduce twice!")
67 self.reduced = True 75 self.reduced = True
68 for key, values in self.table.iteritems(): 76 for key, values in self.table.iteritems():
69 self.table[key] = SummaryPoint(str(key), values) 77 self.table[key] = SummaryPoint(values[0].id, values)
70 78
71 def write_result(self, out_dir): 79 def write_map(self, out_map):
80 if not self.reduced:
81 raise Exception("must reduce table to write map!")
82
83 rows = {}
84
85 for key, point in self.table.iteritems():
86 row = {}
87 for name,measurement in point:
88 name = name.lower().replace('_','-')
89 row[name]={}
90 for base_type in Type:
91 type_key = str(base_type).lower()
92 if base_type in measurement[Type.Avg]:
93 value = measurement[Type.Avg][base_type]
94 row[name][type_key] = value
95 rows[key] = row
96
97 result = {'columns': self.col_map.columns(), 'rows':rows}
98
99 with open(out_map, 'wc') as map_file:
100 pprint(result,stream=map_file, width=20)
101
102 def write_csvs(self, out_dir):
72 dir_map = DirMap(out_dir) 103 dir_map = DirMap(out_dir)
73 104
74 for key, point in self.table.iteritems(): 105 for key, point in self.table.iteritems():