aboutsummaryrefslogtreecommitdiffstats
path: root/parse/tuple_table.py
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-02-08 16:20:01 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-02-08 16:20:01 -0500
commit7c647198fc40e72ef6ca23c2484bf49eba2079ee (patch)
tree270de30a1cd896382a0954b2d8f7994ca84f88b7 /parse/tuple_table.py
parentd312e270ed5c2926c8651291a4026062213876f8 (diff)
Added translation from DirMap to ReducedTupleTable.
Diffstat (limited to 'parse/tuple_table.py')
-rw-r--r--parse/tuple_table.py128
1 files changed, 86 insertions, 42 deletions
diff --git a/parse/tuple_table.py b/parse/tuple_table.py
index 0b84296..469a424 100644
--- a/parse/tuple_table.py
+++ b/parse/tuple_table.py
@@ -1,61 +1,50 @@
1from collections import defaultdict 1from Cheetah.Template import Template
2from collections import defaultdict,namedtuple
2from point import SummaryPoint,Type 3from point import SummaryPoint,Type
3from dir_map import DirMap 4from dir_map import DirMap
5from col_map import ColMap,ColMapBuilder
6
4 7
5from pprint import pprint 8from pprint import pprint
6 9
7class TupleTable(object): 10class TupleTable(object):
8 def __init__(self, col_map): 11 def __init__(self, col_map, default=lambda:[]):
9 self.col_map = col_map 12 self.col_map = col_map
10 self.table = defaultdict(lambda: []) 13 self.table = defaultdict(default)
11 self.reduced = False
12
13 # TODO: rename, make exp agnostic, extend for exps
14 def add_exp(self, kv, point):
15 key = self.col_map.get_key(kv)
16 self.table[key] += [point]
17 14
18 def col_map(self): 15 def col_map(self):
19 return self.col_map 16 return self.col_map
20 17
21 def get_exps(self, kv): 18 def __getitem__(self, kv):
22 key = self.col_map.get_key(kv) 19 key = self.col_map.get_key(kv)
23 return self.table[key] 20 return self.table[key]
24 21
22 def __setitem__(self, kv, value):
23 key = self.col_map.get_key(kv)
24 self.table[key]
25
25 def __contains__(self, kv): 26 def __contains__(self, kv):
26 key = self.col_map.get_key(kv) 27 key = self.col_map.get_key(kv)
27 return key in self.table 28 return key in self.table
28 29
29 def reduce(self): 30 def reduce(self):
30 if self.reduced: 31 reduced = ReducedTupleTable(self.col_map)
31 raise Exception("cannot reduce twice!") 32 for key, value in self.table.iteritems():
32 self.reduced = True 33 if type(value) == type([]):
33 for key, values in self.table.iteritems(): 34 value = SummaryPoint(value[0].id, value)
34 self.table[key] = SummaryPoint(values[0].id, values) 35 reduced.table[key] = value
35 36 return reduced
36 def write_map(self, out_map): 37
37 if not self.reduced: 38 def __str__(self):
38 raise Exception("must reduce table to write map!") 39 s = str(Template("""ColMap: $col_map
39 40 #for $item in $table
40 rows = {} 41 $item :$table[$item]
41 42 #end for""", searchList=vars(self)))
42 for key, point in self.table.iteritems(): 43 return s
43 row = {} 44
44 for name,measurement in point: 45class ReducedTupleTable(TupleTable):
45 name = name.lower().replace('_','-') 46 def __init__(self, col_map):
46 row[name]={} 47 super(ReducedTupleTable, self).__init__(col_map, default=SummaryPoint)
47 for base_type in Type:
48 type_key = str(base_type).lower()
49 if base_type in measurement[Type.Avg]:
50 value = measurement[Type.Avg][base_type]
51 row[name][type_key] = value
52 rows[key] = row
53
54 result = {'columns': self.col_map.columns(), 'rows':rows}
55
56 with open(out_map, 'wc') as map_file:
57 pprint(result,stream=map_file, width=20)
58
59 48
60 def __add_to_dirmap(self, dir_map, variable, kv, point): 49 def __add_to_dirmap(self, dir_map, variable, kv, point):
61 value = kv.pop(variable) 50 value = kv.pop(variable)
@@ -71,8 +60,7 @@ class TupleTable(object):
71 continue 60 continue
72 # Ex: release/num_tasks/measured-max/avg/x=5.csv 61 # Ex: release/num_tasks/measured-max/avg/x=5.csv
73 leaf = self.col_map.encode(kv) + ".csv" 62 leaf = self.col_map.encode(kv) + ".csv"
74 path = [ stat, variable, "taskset-" + base_type, 63 path = [ stat, variable, base_type, summary_type, leaf ]
75 summary_type, leaf ]
76 result = measurement[base_type] 64 result = measurement[base_type]
77 65
78 dir_map.add_values(path, [(value, result)]) 66 dir_map.add_values(path, [(value, result)])
@@ -96,5 +84,61 @@ class TupleTable(object):
96 84
97 self.__add_to_dirmap(dir_map, col, kv, point) 85 self.__add_to_dirmap(dir_map, col, kv, point)
98 86
99 dir_map.reduce() 87 dir_map.remove_childless()
88 print("wrote: %s" % self)
100 return dir_map 89 return dir_map
90
91 @staticmethod
92 def from_dir_map(dir_map):
93 Leaf = namedtuple('Leaf', ['stat', 'variable', 'base',
94 'summary', 'config', 'values'])
95 def leafs():
96 for path, values in dir_map.leafs():
97 stat, variable, base_type, summary_type, leaf = path
98
99 config_str = leaf[:leaf.index('.csv')]
100 config = ColMap.decode(config_str)
101
102 yield Leaf(stat, variable, base_type,
103 summary_type, config, values)
104
105 builder = ColMapBuilder()
106
107 # Gather all possible config values for ColMap
108 for leaf_deets in leafs():
109 for k, v in leaf_deets.config.iteritems():
110 builder.try_add(k, v)
111
112 col_map = builder.build()
113 table = ReducedTupleTable(col_map)
114
115 # Set values at each point
116 for leaf in leafs():
117 for (x, y) in leaf.values:
118 leaf.config[leaf.variable] = str(x)
119 summary = table[leaf.config][leaf.stat]
120 summary[leaf.summary][leaf.base] = y
121
122 print("read: %s" % table)
123 return table
124
125 def write_map(self, out_map):
126 rows = {}
127
128 for key, point in self.table.iteritems():
129 row = {}
130 for name,measurement in point:
131 name = name.lower().replace('_','-')
132 row[name]={}
133 for base_type in Type:
134 type_key = str(base_type).lower()
135 if base_type in measurement[Type.Avg]:
136 value = measurement[Type.Avg][base_type]
137 row[name][type_key] = value
138 rows[key] = row
139
140 result = {'columns': self.col_map.columns(), 'rows':rows}
141
142 with open(out_map, 'wc') as map_file:
143 pprint(result,stream=map_file, width=20)
144