#!/usr/bin/env python3 from decimal import Decimal import os.path import pandas import numpy import pprint phaseNames = [ 'prePre', 'preMix', 'prePost', 'realPre', 'realMix', 'realPost' ] runNames = [ '100_mg', '100_ec', '200_mg', '200_ec', '300_mg', '300_ec', '400_mg', '400_ec', '500_mg', '500_ec' ] nodeNames = [ 'node1', 'node2', 'node3' ] fileNames = [ 'result_node1_100_OFF.csv', 'result_node1_100_ON.csv', 'result_node1_200_OFF.csv', 'result_node1_200_ON.csv', 'result_node1_300_OFF.csv', 'result_node1_300_ON.csv', 'result_node1_400_OFF.csv', 'result_node1_400_ON.csv', 'result_node1_500_OFF.csv', 'result_node1_500_ON.csv', 'result_node2_100_OFF.csv', 'result_node2_100_ON.csv', 'result_node2_200_OFF.csv', 'result_node2_200_ON.csv', 'result_node2_300_OFF.csv', 'result_node2_300_ON.csv', 'result_node2_400_OFF.csv', 'result_node2_400_ON.csv', 'result_node2_500_OFF.csv', 'result_node2_500_ON.csv', 'result_node3_100_OFF.csv', 'result_node3_100_ON.csv', 'result_node3_200_OFF.csv', 'result_node3_200_ON.csv', 'result_node3_300_OFF.csv', 'result_node3_300_ON.csv', 'result_node3_400_OFF.csv', 'result_node3_400_ON.csv', 'result_node3_500_OFF.csv', 'result_node3_500_ON.csv' ] usedcolnames = [ 'pre_pre_startuser_time', 'pre_pre_enduser_time', 'pre_mix_startuser_time', 'pre_mix_enduser_time', 'pre_post_startuser_time', 'pre_post_enduser_time', 'real_pre_startuser_time', 'real_pre_enduser_time', 'real_mix_startuser_time', 'real_mix_enduser_time', 'real_post_startuser_time', 'real_post_enduser_time' ] def getColumn(data, start, end): startCol = getattr(data, start).tolist()[1:] endCol = getattr(data, end).tolist()[1:] difference = [(Decimal(a) - Decimal(b)) / Decimal(1000000000) for a, b in zip(endCol, startCol)] return difference def getColumnAverage(data, start, end): difference = getColumn(data, start, end) difference.sort() del difference[-10:] arr = numpy.array(difference) mean = numpy.mean(arr) stdev = numpy.std(arr) return { 'mean': mean, 'stdev': stdev } def getPhaseAverages(filename): colNames = open(filename).readline().rstrip().split(', ') stats = dict() data = pandas.read_csv(filename, names=colNames) for start, end, name in zip(usedcolnames[::2], usedcolnames[1::2], phaseNames): stats[name] = getColumnAverage(data, start, end) return stats def getRunAverages(runFiles): stats = dict() for runName, file in zip(runNames, runFiles): stats[runName] = getPhaseAverages(file) return stats def getNodeAverages(): nodeData = dict() for node in nodeNames: startIndex = nodeNames.index(node) * 10 endIndex = startIndex + 10 nodeData[node] = getRunAverages(fileNames[startIndex:endIndex]) return nodeData def writeRawTableFile(csvfilename, tabfilename): colNames = open(csvfilename).readline().rstrip().split(', ') data = pandas.read_csv(csvfilename, names=colNames) columnList = list() for start, end in zip(usedcolnames[::2], usedcolnames[1::2]): column = getColumn(data, start, end) columnList.append(column) with open(tabfilename, 'w') as tabfile: tabfile.write(r'prepre (s) & premix (s) & prepost (s) & realpre (s) & realmix (s) & realpost (s) \\\hline\hline' + '\n') for x in zip(*columnList): tabfile.write(' & '.join(["{0:.3f}".format(y) for y in x]) + r' \\\hline' + '\n') def writeRawResultTableFiles(fileNames): for fileName in fileNames: tabFileName = os.path.splitext(fileName)[0] + ".tab" writeRawTableFile(fileName, tabFileName) def writeSummaryLines(data, file, run): for node in nodeNames: nodeData = data[node][run] row = list() row.append(node) phaseData = ['{0:.3f} ({1:.3f})'.format(x['mean'], x['stdev']) for x in [nodeData[phase] for phase in phaseNames]] row = row + phaseData file.write(" & ".join(row) + r' \\\hline' + '\n') def writeSummaryTables(data): with open('ec_summary.tab', 'w') as tabFile: tabFile.write(r'Node & prepre (s (\textsigma)) & premix (s (\textsigma)) & prepost (s (\textsigma)) & realpre (s (\textsigma)) & realmix (s (\textsigma)) & realpost (s (\textsigma)) \\\hline\hline' + '\n') writeSummaryLines(data, tabFile, '500_ec') with open('mg_summary.tab', 'w') as tabFile: tabFile.write(r'Node & prepre (s (\textsigma)) & premix (s (\textsigma)) & prepost (s (\textsigma)) & realpre (s (\textsigma)) & realmix (s (\textsigma)) & realpost (s (\textsigma)) \\\hline\hline' + '\n') writeSummaryLines(data, tabFile, '500_mg') def writeGraph(data, phaseName): graphData = dict() for node in nodeNames: mgData = list() ecData = list() phaseData = data[node] for mgKey, ecKey in zip(runNames[::2], runNames[1::2]): mgData.append(phaseData[mgKey][phaseName]) ecData.append(phaseData[ecKey][phaseName]) graphData[node] = {'ec': ecData, 'mg': mgData} with open('{0}.graph'.format(phaseName), 'w') as graphFile: graphFile.write(r'%--------------------------------------------------------------------' + '\n') graphFile.write(r'\addplot[color=red] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node1']['ec'][0]['mean'], graphData['node1']['ec'][1]['mean'], graphData['node1']['ec'][2]['mean'], graphData['node1']['ec'][3]['mean'], graphData['node1']['ec'][4]['mean'] ) + '\n') graphFile.write(r'\addplot[name path=n1ec_top,color=red!70] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node1']['ec'][0]['mean'] + graphData['node1']['ec'][0]['stdev'], graphData['node1']['ec'][1]['mean'] + graphData['node1']['ec'][1]['stdev'], graphData['node1']['ec'][2]['mean'] + graphData['node1']['ec'][2]['stdev'], graphData['node1']['ec'][3]['mean'] + graphData['node1']['ec'][3]['stdev'], graphData['node1']['ec'][4]['mean'] + graphData['node1']['ec'][4]['stdev'] ) + '\n') graphFile.write(r'\addplot[name path=n1ec_down,color=red!70] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node1']['ec'][0]['mean'] - graphData['node1']['ec'][0]['stdev'], graphData['node1']['ec'][1]['mean'] - graphData['node1']['ec'][1]['stdev'], graphData['node1']['ec'][2]['mean'] - graphData['node1']['ec'][2]['stdev'], graphData['node1']['ec'][3]['mean'] - graphData['node1']['ec'][3]['stdev'], graphData['node1']['ec'][4]['mean'] - graphData['node1']['ec'][4]['stdev'] ) + '\n') graphFile.write(r'\addplot[red!50,fill opacity=0.5] fill between[of=n1ec_top and n1ec_down];' + '\n\n') graphFile.write(r'%--------------------------------------------------------------------' + '\n') graphFile.write(r'\addplot[color=green] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node2']['ec'][0]['mean'], graphData['node2']['ec'][1]['mean'], graphData['node2']['ec'][2]['mean'], graphData['node2']['ec'][3]['mean'], graphData['node2']['ec'][4]['mean'] ) + '\n') graphFile.write(r'\addplot[name path=n2ec_top,color=green!70] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node2']['ec'][0]['mean'] + graphData['node2']['ec'][0]['stdev'], graphData['node2']['ec'][1]['mean'] + graphData['node2']['ec'][1]['stdev'], graphData['node2']['ec'][2]['mean'] + graphData['node2']['ec'][2]['stdev'], graphData['node2']['ec'][3]['mean'] + graphData['node2']['ec'][3]['stdev'], graphData['node2']['ec'][4]['mean'] + graphData['node2']['ec'][4]['stdev'] ) + '\n') graphFile.write(r'\addplot[name path=n2ec_down,color=green!70] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node2']['ec'][0]['mean'] - graphData['node2']['ec'][0]['stdev'], graphData['node2']['ec'][1]['mean'] - graphData['node2']['ec'][1]['stdev'], graphData['node2']['ec'][2]['mean'] - graphData['node2']['ec'][2]['stdev'], graphData['node2']['ec'][3]['mean'] - graphData['node2']['ec'][3]['stdev'], graphData['node2']['ec'][4]['mean'] - graphData['node2']['ec'][4]['stdev'] ) + '\n') graphFile.write(r'\addplot[green!50,fill opacity=0.5] fill between[of=n2ec_top and n2ec_down];' + '\n\n') graphFile.write(r'%--------------------------------------------------------------------' + '\n') graphFile.write(r'\addplot[color=blue] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node3']['ec'][0]['mean'], graphData['node3']['ec'][1]['mean'], graphData['node3']['ec'][2]['mean'], graphData['node3']['ec'][3]['mean'], graphData['node3']['ec'][4]['mean'] ) + '\n') graphFile.write(r'\addplot[name path=n3ec_top,color=blue!70] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node3']['ec'][0]['mean'] + graphData['node3']['ec'][0]['stdev'], graphData['node3']['ec'][1]['mean'] + graphData['node3']['ec'][1]['stdev'], graphData['node3']['ec'][2]['mean'] + graphData['node3']['ec'][2]['stdev'], graphData['node3']['ec'][3]['mean'] + graphData['node3']['ec'][3]['stdev'], graphData['node3']['ec'][4]['mean'] + graphData['node3']['ec'][4]['stdev'] ) + '\n') graphFile.write(r'\addplot[name path=n3ec_down,color=blue!70] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node3']['ec'][0]['mean'] - graphData['node3']['ec'][0]['stdev'], graphData['node3']['ec'][1]['mean'] - graphData['node3']['ec'][1]['stdev'], graphData['node3']['ec'][2]['mean'] - graphData['node3']['ec'][2]['stdev'], graphData['node3']['ec'][3]['mean'] - graphData['node3']['ec'][3]['stdev'], graphData['node3']['ec'][4]['mean'] - graphData['node3']['ec'][4]['stdev'] ) + '\n') graphFile.write(r'\addplot[blue!50,fill opacity=0.5] fill between[of=n3ec_top and n3ec_down];' + '\n\n') graphFile.write(r'%--------------------------------------------------------------------' + '\n') graphFile.write(r'\addplot[color=yellow] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node1']['mg'][0]['mean'], graphData['node1']['mg'][1]['mean'], graphData['node1']['mg'][2]['mean'], graphData['node1']['mg'][3]['mean'], graphData['node1']['mg'][4]['mean'] ) + '\n') graphFile.write(r'\addplot[name path=n1mg_top,color=yellow!70] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node1']['mg'][0]['mean'] + graphData['node1']['mg'][0]['stdev'], graphData['node1']['mg'][1]['mean'] + graphData['node1']['mg'][1]['stdev'], graphData['node1']['mg'][2]['mean'] + graphData['node1']['mg'][2]['stdev'], graphData['node1']['mg'][3]['mean'] + graphData['node1']['mg'][3]['stdev'], graphData['node1']['mg'][4]['mean'] + graphData['node1']['mg'][4]['stdev'] ) + '\n') graphFile.write(r'\addplot[name path=n1mg_down,color=yellow!70] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node1']['mg'][0]['mean'] - graphData['node1']['mg'][0]['stdev'], graphData['node1']['mg'][1]['mean'] - graphData['node1']['mg'][1]['stdev'], graphData['node1']['mg'][2]['mean'] - graphData['node1']['mg'][2]['stdev'], graphData['node1']['mg'][3]['mean'] - graphData['node1']['mg'][3]['stdev'], graphData['node1']['mg'][4]['mean'] - graphData['node1']['mg'][4]['stdev'] ) + '\n') graphFile.write(r'\addplot[yellow!50,fill opacity=0.5] fill between[of=n1mg_top and n1mg_down];' + '\n\n') graphFile.write(r'%--------------------------------------------------------------------' + '\n') graphFile.write(r'\addplot[color=orange] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node2']['mg'][0]['mean'], graphData['node2']['mg'][1]['mean'], graphData['node2']['mg'][2]['mean'], graphData['node2']['mg'][3]['mean'], graphData['node2']['mg'][4]['mean'] ) + '\n') graphFile.write(r'\addplot[name path=n2mg_top,color=orange!70] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node2']['mg'][0]['mean'] + graphData['node2']['mg'][0]['stdev'], graphData['node2']['mg'][1]['mean'] + graphData['node2']['mg'][1]['stdev'], graphData['node2']['mg'][2]['mean'] + graphData['node2']['mg'][2]['stdev'], graphData['node2']['mg'][3]['mean'] + graphData['node2']['mg'][3]['stdev'], graphData['node2']['mg'][4]['mean'] + graphData['node2']['mg'][4]['stdev'] ) + '\n') graphFile.write(r'\addplot[name path=n2mg_down,color=orange!70] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node2']['mg'][0]['mean'] - graphData['node2']['mg'][0]['stdev'], graphData['node2']['mg'][1]['mean'] - graphData['node2']['mg'][1]['stdev'], graphData['node2']['mg'][2]['mean'] - graphData['node2']['mg'][2]['stdev'], graphData['node2']['mg'][3]['mean'] - graphData['node2']['mg'][3]['stdev'], graphData['node2']['mg'][4]['mean'] - graphData['node2']['mg'][4]['stdev'] ) + '\n') graphFile.write(r'\addplot[orange!50,fill opacity=0.5] fill between[of=n2mg_top and n2mg_down];' + '\n\n') graphFile.write(r'%--------------------------------------------------------------------' + '\n') graphFile.write(r'\addplot[color=black] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node3']['mg'][0]['mean'], graphData['node3']['mg'][1]['mean'], graphData['node3']['mg'][2]['mean'], graphData['node3']['mg'][3]['mean'], graphData['node3']['mg'][4]['mean'] ) + '\n') graphFile.write(r'\addplot[name path=n3mg_top,color=black!70] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node3']['mg'][0]['mean'] + graphData['node3']['mg'][0]['stdev'], graphData['node3']['mg'][1]['mean'] + graphData['node3']['mg'][1]['stdev'], graphData['node3']['mg'][2]['mean'] + graphData['node3']['mg'][2]['stdev'], graphData['node3']['mg'][3]['mean'] + graphData['node3']['mg'][3]['stdev'], graphData['node3']['mg'][4]['mean'] + graphData['node3']['mg'][4]['stdev'] ) + '\n') graphFile.write(r'\addplot[name path=n3mg_down,color=black!70] coordinates {{(0,0)(100,{0:.3f})(200,{1:.3f})(300,{2:.3f})(400,{3:.3f})(500,{4:.3f})}};'.format( graphData['node3']['mg'][0]['mean'] - graphData['node3']['mg'][0]['stdev'], graphData['node3']['mg'][1]['mean'] - graphData['node3']['mg'][1]['stdev'], graphData['node3']['mg'][2]['mean'] - graphData['node3']['mg'][2]['stdev'], graphData['node3']['mg'][3]['mean'] - graphData['node3']['mg'][3]['stdev'], graphData['node3']['mg'][4]['mean'] - graphData['node3']['mg'][4]['stdev'] ) + '\n') graphFile.write(r'\addplot[black!50,fill opacity=0.5] fill between[of=n3mg_top and n3mg_down];' + '\n\n') def writeGraphs(data): for phaseName in phaseNames: writeGraph(data, phaseName) def writeAppendixTable(data, run): with open(run + '.tab', 'w') as tabFile: tabFile.write(r'Node & prepre (s (\textsigma)) & premix (s (\textsigma)) & prepost (s (\textsigma)) & realpre (s (\textsigma)) & realmix (s (\textsigma)) & realpost (s (\textsigma)) \\\hline\hline' + '\n') for node in nodeNames: nodeData = data[node][run] row = list() row.append(node) phaseData = ['{0:.3f} ({1:.3f})'.format(x['mean'], x['stdev']) for x in [nodeData[phase] for phase in phaseNames]] row = row + phaseData tabFile.write(' & '.join(row) + r' \\\hline' + '\n') def writeAppendixTables(data): for run in runNames: writeAppendixTable(data, run) def writeResults(): writeRawResultTableFiles(fileNames) data = getNodeAverages() writeSummaryTables(data) writeGraphs(data) writeAppendixTables(data) writeResults()