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): |
