From 2e804f8fa7d26755088e47357f8de6feb6dbe292 Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Mon, 29 Oct 2012 21:48:23 -0400 Subject: Added option to output parsed data as a python-parseable map. --- parse/point.py | 9 +++++---- parse/sched.py | 5 ++++- parse/tuple_table.py | 41 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 45 insertions(+), 10 deletions(-) (limited to 'parse') diff --git a/parse/point.py b/parse/point.py index 8fdd115..d5f4a5e 100644 --- a/parse/point.py +++ b/parse/point.py @@ -37,12 +37,13 @@ class Measurement(object): self[Type.Max] = array.max() self[Type.Avg] = array.mean() self[Type.Var] = array.var() + self[Type.Min] = array.min() return self def __check_type(self, type): if not type in Type: raise AttributeError("Not a valid type '%s'" % type) - + def __getitem__(self, type): self.__check_type(type) return self.stats[type] @@ -60,11 +61,11 @@ class Measurement(object): def __str__(self): return "%s" % dict_str(self.stats, " ") - + class Summary(Measurement): def __init__(self, id, measures, typemap = default_typemap): - super(Summary, self).__init__("Summary-%s" % id) + super(Summary, self).__init__(id) self.__check_types(measures, typemap) self.__summarize(measures, typemap) @@ -108,7 +109,7 @@ class ExpPoint(object): def __check_val(self, obj): if not isinstance(obj, Measurement): raise AttributeError("Not a valid measurement '%s'" % obj) - + def __getitem__(self, type): return self.stats[type] diff --git a/parse/sched.py b/parse/sched.py index cbb051e..80764b6 100644 --- a/parse/sched.py +++ b/parse/sched.py @@ -1,6 +1,9 @@ """ TODO: No longer very pythonic, lot of duplicate code -print out task execution times +print out task execution times or something +get miss ratio and tardiness directly from schedule OR +email list about turning on optional summary statistics OR +set up run exps to only get release and completions to get these stats """ import config.config as conf diff --git a/parse/tuple_table.py b/parse/tuple_table.py index 434eb22..465abb3 100644 --- a/parse/tuple_table.py +++ b/parse/tuple_table.py @@ -1,7 +1,9 @@ from collections import defaultdict -from point import SummaryPoint +from point import SummaryPoint,Type from dir_map import DirMap +from pprint import pprint + class ColMap(object): def __init__(self): self.rev_map = {} @@ -31,13 +33,16 @@ class ColMap(object): map[self.col_list[i]] = tuple[i] return map + def force_add(self, column): + self.rev_map[column] = len(self.col_list) + self.col_list += [column] + def try_add(self, column, value): if column not in self.rev_map: if column not in self.value_map: self.value_map[column] = value elif value != self.value_map[column]: - self.rev_map[column] = len(self.col_list) - self.col_list += [column] + self.force_add(column) def __str__(self): return "%s" % (self.rev_map) @@ -53,6 +58,9 @@ class TupleTable(object): key = self.col_map.get_key(kv) self.table[key] += [point] + def col_map(self): + return self.col_map + def get_exps(self, kv): key = self.col_map.get_key(kv) return self.table[key] @@ -66,9 +74,32 @@ class TupleTable(object): raise Exception("cannot reduce twice!") self.reduced = True for key, values in self.table.iteritems(): - self.table[key] = SummaryPoint(str(key), values) + self.table[key] = SummaryPoint(values[0].id, values) - def write_result(self, out_dir): + def write_map(self, out_map): + if not self.reduced: + raise Exception("must reduce table to write map!") + + rows = {} + + for key, point in self.table.iteritems(): + row = {} + for name,measurement in point: + name = name.lower().replace('_','-') + row[name]={} + for base_type in Type: + type_key = str(base_type).lower() + if base_type in measurement[Type.Avg]: + value = measurement[Type.Avg][base_type] + row[name][type_key] = value + rows[key] = row + + result = {'columns': self.col_map.columns(), 'rows':rows} + + with open(out_map, 'wc') as map_file: + pprint(result,stream=map_file, width=20) + + def write_csvs(self, out_dir): dir_map = DirMap(out_dir) for key, point in self.table.iteritems(): -- cgit v1.2.2