diff options
Diffstat (limited to 'parse/tuple_table.py')
-rw-r--r-- | parse/tuple_table.py | 128 |
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 @@ | |||
1 | from collections import defaultdict | 1 | from Cheetah.Template import Template |
2 | from collections import defaultdict,namedtuple | ||
2 | from point import SummaryPoint,Type | 3 | from point import SummaryPoint,Type |
3 | from dir_map import DirMap | 4 | from dir_map import DirMap |
5 | from col_map import ColMap,ColMapBuilder | ||
6 | |||
4 | 7 | ||
5 | from pprint import pprint | 8 | from pprint import pprint |
6 | 9 | ||
7 | class TupleTable(object): | 10 | class 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: | 45 | class 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 | |||