diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-02-11 18:28:31 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-02-11 18:28:31 -0500 |
commit | b2fa65ecfe14bb9377fbd8afa5f457a07472b6fb (patch) | |
tree | 5bb1402027e1c56eccf38682166b1850c8b89aa9 /parse | |
parent | 7c647198fc40e72ef6ca23c2484bf49eba2079ee (diff) |
First attempt at plot_exps.py.
Diffstat (limited to 'parse')
-rw-r--r-- | parse/col_map.py | 38 | ||||
-rw-r--r-- | parse/dir_map.py | 47 | ||||
-rw-r--r-- | parse/tuple_table.py | 18 |
3 files changed, 72 insertions, 31 deletions
diff --git a/parse/col_map.py b/parse/col_map.py index 6f83ca1..8132639 100644 --- a/parse/col_map.py +++ b/parse/col_map.py | |||
@@ -6,9 +6,9 @@ class ColMapBuilder(object): | |||
6 | 6 | ||
7 | def build(self): | 7 | def build(self): |
8 | columns = sorted(self.value_map.keys(), | 8 | columns = sorted(self.value_map.keys(), |
9 | key=lambda c: (len(self.value_map[c]), c)) | 9 | key=lambda c: (-len(self.value_map[c]), c)) |
10 | col_list = filter(lambda c : len(self.value_map[c]) > 1, columns) | 10 | col_list = filter(lambda c : len(self.value_map[c]) > 1, columns) |
11 | return ColMap(col_list) | 11 | return ColMap(col_list, self.value_map) |
12 | 12 | ||
13 | def try_add(self, column, value): | 13 | def try_add(self, column, value): |
14 | self.value_map[column].add( value ) | 14 | self.value_map[column].add( value ) |
@@ -17,9 +17,17 @@ class ColMapBuilder(object): | |||
17 | del(self.value_map[column]) | 17 | del(self.value_map[column]) |
18 | 18 | ||
19 | class ColMap(object): | 19 | class ColMap(object): |
20 | def __init__(self, col_list): | 20 | def __init__(self, col_list, values = None): |
21 | self.col_list = col_list | 21 | self.col_list = col_list |
22 | self.rev_map = {} | 22 | self.rev_map = {} |
23 | self.values = values | ||
24 | |||
25 | self.minimums = [] | ||
26 | for c in col_list: | ||
27 | end = 1 | ||
28 | while c[:end] in self.minimums: | ||
29 | end += 1 | ||
30 | self.minimums += [c[:end]] | ||
23 | 31 | ||
24 | for i, col in enumerate(col_list): | 32 | for i, col in enumerate(col_list): |
25 | self.rev_map[col] = i | 33 | self.rev_map[col] = i |
@@ -27,6 +35,9 @@ class ColMap(object): | |||
27 | def columns(self): | 35 | def columns(self): |
28 | return self.col_list | 36 | return self.col_list |
29 | 37 | ||
38 | def get_values(self): | ||
39 | return self.values | ||
40 | |||
30 | def get_key(self, kv): | 41 | def get_key(self, kv): |
31 | '''Convert a key-value dict into an ordered tuple of values.''' | 42 | '''Convert a key-value dict into an ordered tuple of values.''' |
32 | key = () | 43 | key = () |
@@ -46,8 +57,7 @@ class ColMap(object): | |||
46 | kv[self.col_list[i]] = key[i] | 57 | kv[self.col_list[i]] = key[i] |
47 | return kv | 58 | return kv |
48 | 59 | ||
49 | 60 | def encode(self, kv, minimum=False): | |
50 | def encode(self, kv): | ||
51 | '''Converted a dict into a string with items sorted according to | 61 | '''Converted a dict into a string with items sorted according to |
52 | the ColMap key order.''' | 62 | the ColMap key order.''' |
53 | def escape(val): | 63 | def escape(val): |
@@ -55,13 +65,23 @@ class ColMap(object): | |||
55 | 65 | ||
56 | vals = [] | 66 | vals = [] |
57 | 67 | ||
58 | for key in self.col_list: | 68 | if minimum: |
69 | format = "%s:%s" | ||
70 | join = ", " | ||
71 | else: | ||
72 | format = "%s=%s" | ||
73 | join = "_" | ||
74 | |||
75 | reverse = list(self.col_list) | ||
76 | reverse.reverse() | ||
77 | for key in reverse: | ||
59 | if key not in kv: | 78 | if key not in kv: |
60 | continue | 79 | continue |
61 | k, v = escape(key), escape(kv[key]) | 80 | display = key if not minimum else self.minimums[self.rev_map[key]] |
62 | vals += ["%s=%s" % (k, v)] | 81 | k, v = escape(display), escape(kv[key]) |
82 | vals += [format % (k, v)] | ||
63 | 83 | ||
64 | return "_".join(vals) | 84 | return join.join(vals) |
65 | 85 | ||
66 | @staticmethod | 86 | @staticmethod |
67 | def decode(string): | 87 | def decode(string): |
diff --git a/parse/dir_map.py b/parse/dir_map.py index e4d83e6..11c872a 100644 --- a/parse/dir_map.py +++ b/parse/dir_map.py | |||
@@ -1,5 +1,6 @@ | |||
1 | import os | ||
2 | import numpy as np | 1 | import numpy as np |
2 | import os | ||
3 | import re | ||
3 | 4 | ||
4 | from collections import defaultdict | 5 | from collections import defaultdict |
5 | 6 | ||
@@ -10,6 +11,29 @@ class DirMap(object): | |||
10 | self.children = defaultdict(lambda : DirMap.Node(self)) | 11 | self.children = defaultdict(lambda : DirMap.Node(self)) |
11 | self.values = [] | 12 | self.values = [] |
12 | 13 | ||
14 | def heir(self, generation=1): | ||
15 | def heir2(node, generation): | ||
16 | if not generation: | ||
17 | return node | ||
18 | elif not node.children: | ||
19 | return None | ||
20 | else: | ||
21 | next_heir = node.children.values()[0] | ||
22 | return next_heir.heir(generation - 1) | ||
23 | return heir2(self, generation) | ||
24 | |||
25 | def leafs(self, path=[], offset=0): | ||
26 | path = list(path) | ||
27 | check_node = self.heir(offset) | ||
28 | if check_node and check_node.children: | ||
29 | for child_name, child_node in self.children.iteritems(): | ||
30 | path += [child_name] | ||
31 | for leaf in child_node.leafs(path, offset): | ||
32 | yield leaf | ||
33 | path.pop() | ||
34 | else: | ||
35 | yield (path, self) | ||
36 | |||
13 | def __init__(self): | 37 | def __init__(self): |
14 | self.root = DirMap.Node(None) | 38 | self.root = DirMap.Node(None) |
15 | self.values = [] | 39 | self.values = [] |
@@ -22,8 +46,7 @@ class DirMap(object): | |||
22 | 46 | ||
23 | def remove_childless(self): | 47 | def remove_childless(self): |
24 | def remove_childless2(node): | 48 | def remove_childless2(node): |
25 | for key in node.children.keys(): | 49 | for key, child in node: |
26 | child = node.children[key] | ||
27 | remove_childless2(child) | 50 | remove_childless2(child) |
28 | if not (child.children or child.values): | 51 | if not (child.children or child.values): |
29 | node.children.pop(key) | 52 | node.children.pop(key) |
@@ -52,19 +75,8 @@ class DirMap(object): | |||
52 | 75 | ||
53 | write2([out_dir], self.root) | 76 | write2([out_dir], self.root) |
54 | 77 | ||
55 | 78 | def leafs(self, offset=0): | |
56 | def leafs(self): | 79 | for leaf in self.root.leafs([], offset): |
57 | def leafs2(path, node): | ||
58 | if node.children: | ||
59 | for child_name, child_node in node.children.iteritems(): | ||
60 | path += [child_name] | ||
61 | for leaf in leafs2(path, child_node): | ||
62 | yield leaf | ||
63 | path.pop() | ||
64 | elif path: | ||
65 | yield (path, node.values) | ||
66 | |||
67 | for leaf in leafs2([], self.root): | ||
68 | yield leaf | 80 | yield leaf |
69 | 81 | ||
70 | @staticmethod | 82 | @staticmethod |
@@ -77,6 +89,9 @@ class DirMap(object): | |||
77 | if os.path.isdir(path): | 89 | if os.path.isdir(path): |
78 | map(lambda x : read2(path+"/"+x), os.listdir(path)) | 90 | map(lambda x : read2(path+"/"+x), os.listdir(path)) |
79 | else: | 91 | else: |
92 | if not re.match(r'.*\.csv', path): | ||
93 | return | ||
94 | |||
80 | with open(path, 'rb') as f: | 95 | with open(path, 'rb') as f: |
81 | data = np.loadtxt(f, delimiter=",") | 96 | data = np.loadtxt(f, delimiter=",") |
82 | 97 | ||
diff --git a/parse/tuple_table.py b/parse/tuple_table.py index 469a424..105b786 100644 --- a/parse/tuple_table.py +++ b/parse/tuple_table.py | |||
@@ -12,7 +12,7 @@ class TupleTable(object): | |||
12 | self.col_map = col_map | 12 | self.col_map = col_map |
13 | self.table = defaultdict(default) | 13 | self.table = defaultdict(default) |
14 | 14 | ||
15 | def col_map(self): | 15 | def get_col_map(self): |
16 | return self.col_map | 16 | return self.col_map |
17 | 17 | ||
18 | def __getitem__(self, kv): | 18 | def __getitem__(self, kv): |
@@ -93,14 +93,21 @@ class ReducedTupleTable(TupleTable): | |||
93 | Leaf = namedtuple('Leaf', ['stat', 'variable', 'base', | 93 | Leaf = namedtuple('Leaf', ['stat', 'variable', 'base', |
94 | 'summary', 'config', 'values']) | 94 | 'summary', 'config', 'values']) |
95 | def leafs(): | 95 | def leafs(): |
96 | for path, values in dir_map.leafs(): | 96 | for path, node in dir_map.leafs(): |
97 | stat, variable, base_type, summary_type, leaf = path | 97 | # The path will be of at least size 1: the filename |
98 | leaf = path.pop() | ||
99 | |||
100 | # Set acceptable defaults for the rest of the path | ||
101 | path += ['?', '?', 'Avg', 'Avg'][len(path):] | ||
102 | |||
103 | [stat, variable, base_type, summary_type] = path | ||
98 | 104 | ||
99 | config_str = leaf[:leaf.index('.csv')] | 105 | config_str = leaf[:leaf.index('.csv')] |
100 | config = ColMap.decode(config_str) | 106 | config = ColMap.decode(config_str) |
101 | 107 | ||
102 | yield Leaf(stat, variable, base_type, | 108 | leaf = Leaf(stat, variable, base_type, |
103 | summary_type, config, values) | 109 | summary_type, config, node.values) |
110 | yield leaf | ||
104 | 111 | ||
105 | builder = ColMapBuilder() | 112 | builder = ColMapBuilder() |
106 | 113 | ||
@@ -119,7 +126,6 @@ class ReducedTupleTable(TupleTable): | |||
119 | summary = table[leaf.config][leaf.stat] | 126 | summary = table[leaf.config][leaf.stat] |
120 | summary[leaf.summary][leaf.base] = y | 127 | summary[leaf.summary][leaf.base] = y |
121 | 128 | ||
122 | print("read: %s" % table) | ||
123 | return table | 129 | return table |
124 | 130 | ||
125 | def write_map(self, out_map): | 131 | def write_map(self, out_map): |