diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-09-27 19:03:22 -0400 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-09-27 19:03:22 -0400 |
commit | 7c09ec981c6e06af2e62d67a609eb53728267954 (patch) | |
tree | 76a93db7cadc452ac70eabbd52fdd87ed5fd54c4 /parse/tuple_table.py | |
parent | 5554e053e9f3d5f7987d3f1d889802b211af8eab (diff) |
Added script to parse directory data, create CSVs for every chagned value.
This change also makes SchedTrace and OverheadTrace events configurable.
Diffstat (limited to 'parse/tuple_table.py')
-rw-r--r-- | parse/tuple_table.py | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/parse/tuple_table.py b/parse/tuple_table.py new file mode 100644 index 0000000..df80b37 --- /dev/null +++ b/parse/tuple_table.py | |||
@@ -0,0 +1,76 @@ | |||
1 | from collections import defaultdict | ||
2 | from point import SummaryPoint | ||
3 | from dir_map import DirMap | ||
4 | |||
5 | class ColMap(object): | ||
6 | def __init__(self): | ||
7 | self.rev_map = {} | ||
8 | self.col_list = [] | ||
9 | |||
10 | def columns(self): | ||
11 | return self.col_list | ||
12 | |||
13 | def get_key(self, kv): | ||
14 | key = () | ||
15 | added = 0 | ||
16 | |||
17 | for col in self.col_list: | ||
18 | if col not in kv: | ||
19 | key += (None,) | ||
20 | else: | ||
21 | added += 1 | ||
22 | key += (kv[col],) | ||
23 | |||
24 | if added != len(kv): | ||
25 | raise Exception("column map '%s' missed field in map\n%s" % | ||
26 | (self.col_list, kv)) | ||
27 | |||
28 | return key | ||
29 | |||
30 | def get_map(self, tuple): | ||
31 | map = {} | ||
32 | for i in range(0, len(tuple)): | ||
33 | map[self.col_list[i]] = tuple[i] | ||
34 | return map | ||
35 | |||
36 | def try_add(self, column): | ||
37 | if column not in self.rev_map: | ||
38 | self.rev_map[column] = len(self.col_list) | ||
39 | self.col_list += [column] | ||
40 | |||
41 | def __str__(self): | ||
42 | return "<ColMap>%s" % (self.rev_map) | ||
43 | |||
44 | class TupleTable(object): | ||
45 | def __init__(self, col_map): | ||
46 | self.col_map = col_map | ||
47 | self.table = defaultdict(lambda: []) | ||
48 | self.reduced = False | ||
49 | |||
50 | def add_exp(self, kv, point): | ||
51 | key = self.col_map.get_key(kv) | ||
52 | self.table[key] += [point] | ||
53 | |||
54 | def __reduce(self): | ||
55 | if self.reduced: | ||
56 | raise Exception("cannot reduce twice!") | ||
57 | self.reduced = True | ||
58 | for key, values in self.table.iteritems(): | ||
59 | self.table[key] = SummaryPoint(key, values) | ||
60 | |||
61 | def write_result(self, out_dir): | ||
62 | dir_map = DirMap(out_dir) | ||
63 | self.__reduce() | ||
64 | for key, point in self.table.iteritems(): | ||
65 | kv = self.col_map.get_map(key) | ||
66 | |||
67 | for col in self.col_map.columns(): | ||
68 | val = kv[col] | ||
69 | kv.pop(col) | ||
70 | |||
71 | dir_map.add_point(col, val, kv, point) | ||
72 | |||
73 | kv[col] = val | ||
74 | |||
75 | dir_map.reduce() | ||
76 | dir_map.write() | ||