#!/usr/bin/env python class DataPoint: def __init__(self): self.nserver = 0; self.nclient = 0; self.heap_type = 0; self.total_time_to_add_req = 0; self.total_time_to_complete_req = 0; self.config = '' def set_name(self, config, heap_type): self.config = config; self.heap_type = heap_type def get_conig(self): import re return re.split(r"/|\.", self.config)[1] def __str__(self): return "s:%d, c:%d,h:%d,config:%s"%(self.nserver, self.nclient, self.heap_type, self.config); # end DataPoint def isFloat(elem): try: float(elem) return True except ValueError: return False #end isFloat def parse_config_params(fname): nclient = 0; nserver = 0; # read config file property with open(fname, 'r') as f: for line in f: line = line.strip('\n \t') if not line: continue; if line.startswith("client_count"): nclient += int(line.split('=')[-1]); if line.startswith("server_count"): nserver += int(line.split('=')[-1]); # end of file return [nserver, nclient]; # parse_config_params def make_aggregate_data_point(dps, config, heap_type): # create new aggregate point dp = DataPoint(); # set set and k_way_heap property dp.set_name(config, heap_type); num_run = 0 for _dp in dps: if _dp.config == config and _dp.heap_type == heap_type: # print _dp, config, heap_type dp.nserver =_dp.nserver dp.nclient = _dp.nclient num_run += 1 dp.total_time_to_add_req += _dp.total_time_to_add_req dp.total_time_to_complete_req += _dp.total_time_to_complete_req # average dp.total_time_to_add_req /= num_run; dp.total_time_to_complete_req /= num_run #print dp return dp; def parse_data_points(filename): dps = []; #data-points dp = None; state = 0; configs = {} k_ways = {} with open(filename, 'r') as f: for line in f: line = line.strip('\n \t') if not line: continue; # file_name:1:configs/dmc_sim_8_6.conf if line.startswith("file_name"): if dp: dps.append(dp); state = 0; # new data-point dp = DataPoint(); parts = line.split(':') fname = parts[-1]; dp.heap_type = int(parts[1]); if dp.heap_type not in k_ways: k_ways[dp.heap_type] = 1; # add to the dictionary configs[fname] = 1; dp.config = fname; params = parse_config_params(fname) dp.nserver = params[0]; dp.nclient = params[-1]; elif line.startswith("average"): # take last 2 averages r = [float(s) for s in line.split(' ') if isFloat(s)] state +=1; #print r, dp #if isFloat(s) if state == 3: dp.total_time_to_add_req = r[0] elif state == 4: dp.total_time_to_complete_req = r[0] else: pass else: pass; # final entry dps.append(dp) # compute average of multiple runs dps_avg = [] for config in configs: data_per_config = [] for k in k_ways: aggr_dp = make_aggregate_data_point(dps, config , k); data_per_config.append(aggr_dp); dps_avg.append(data_per_config); # end for return dps_avg; # end parse_data_points def create_header(num_cols): fields = ['nserver_nclient(config_file)','add_req', 'complete_req']; header = fields[0] #write add_req_{1, ...} for i in range(num_cols): header = '%s %s_%i'%(header, fields[1], i+2) #write complete_req_{1, ...} for i in range(num_cols): header = '%s %s_%i'%(header, fields[2], i+2) # new-line header = '%s\n'%(header) return header # end create_header def create_data_line(aggr_dp): # get common info dp = aggr_dp[0] data_line = "s:%d_c:%d "%(dp.nserver, dp.nclient); # get the point-count num_cols = len(aggr_dp); # write add_req_{1, ...} for i in range(num_cols): data_line = '%s %f'%(data_line, aggr_dp[i].total_time_to_add_req) # write complete_req_{1, ...} for i in range(num_cols): data_line = '%s %f'%(data_line, aggr_dp[i].total_time_to_complete_req) # new-line data_line = '%s\n'%(data_line) return data_line # end create_data_line def make_data(filename): # write the aggregated point in space separated file dps = parse_data_points(filename); if not len(dps) : return print "total points: ", len(dps) # open file with open('%s.dat'%(filename), 'w+') as f: # write header f.write(create_header(len(dps[0]))); # write data-line for aggr_dp in dps: f.write(create_data_line(aggr_dp)); def main(output_file): print output_file make_data(output_file); import sys if __name__ == "__main__": file_name="result" if len(sys.argv) > 1: file_name=sys.argv[1].strip() main(file_name)