aboutsummaryrefslogtreecommitdiffstats
path: root/parse
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-02-11 18:28:31 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-02-11 18:28:31 -0500
commitb2fa65ecfe14bb9377fbd8afa5f457a07472b6fb (patch)
tree5bb1402027e1c56eccf38682166b1850c8b89aa9 /parse
parent7c647198fc40e72ef6ca23c2484bf49eba2079ee (diff)
First attempt at plot_exps.py.
Diffstat (limited to 'parse')
-rw-r--r--parse/col_map.py38
-rw-r--r--parse/dir_map.py47
-rw-r--r--parse/tuple_table.py18
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
19class ColMap(object): 19class 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 @@
1import os
2import numpy as np 1import numpy as np
2import os
3import re
3 4
4from collections import defaultdict 5from 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):