| #!/usr/bin/env python |
| import sys, argparse |
| import csv |
| |
| import matplotlib.pyplot as plt |
| import numpy as np |
| |
| def parse_args(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument("csv_files", nargs=2, default=None, help="CSV files with level runtimes") |
| parser.add_argument("-f", default=None, help="Output filename") |
| parser.add_argument("--min_fwd_width", type=int, default=None, help="Minimum forward width for parllel") |
| parser.add_argument("--min_bck_width", type=int, default=None, help="Minimum backward width for parllel") |
| |
| args = parser.parse_args() |
| |
| return args |
| |
| def main(): |
| args = parse_args() |
| |
| data = {} |
| for filename in args.csv_files: |
| with open(filename) as f: |
| data[filename] = {} |
| csv_reader = csv.DictReader(f) |
| |
| for field in csv_reader.fieldnames: |
| data[filename][field] = [] |
| |
| for row in csv_reader: |
| for field in csv_reader.fieldnames: |
| data[filename][field].append(float(row[field])) |
| |
| for filename, series in data.iteritems(): |
| print "File: ", filename |
| #for series_name, data_values in series.iteritems(): |
| #print "\tSeries: ", series_name |
| #print "\tValuse: ", data_values |
| |
| |
| #Calculate derived series |
| derived_series = {} |
| |
| traversals = ['Fwd', 'Bck'] |
| |
| N_AVG = 100 |
| for traversal in ['Fwd', 'Bck']: |
| #Per-level speed-up |
| first_array = data[args.csv_files[0]]["%s_Time" % traversal] |
| second_array = data[args.csv_files[1]]["%s_Time" % traversal] |
| |
| derived_series["Level Speed-up %s" % traversal] = [] |
| for i in xrange(len(first_array)): |
| if(second_array[i] == 0.0): |
| derived_series["Level Speed-up %s" % traversal].append(None) |
| else: |
| derived_series["Level Speed-up %s" % traversal].append(first_array[i] / second_array[i]) |
| |
| #Averaged level speed-up |
| derived_series["Avg Level Speed-up %s" % traversal] = [] |
| for i in xrange(len(first_array)): |
| first_avg = sum(first_array[max(0,i-N_AVG):i]) / N_AVG |
| second_avg = sum(second_array[max(0,i-N_AVG):i]) / N_AVG |
| if(second_avg == 0.0): |
| derived_series["Avg Level Speed-up %s" % traversal].append(None) |
| else: |
| derived_series["Avg Level Speed-up %s" % traversal].append(first_avg / second_avg) |
| |
| |
| #Cummulative time |
| for filename in args.csv_files: |
| derived_series["Cumm Time %s %s" % (filename.split('_')[0], traversal)] = [] |
| val_sum = 0. |
| for value in data[filename]["%s_Time" % traversal]: |
| val_sum += value |
| derived_series["Cumm Time %s %s" % (filename.split('_')[0], traversal)].append(val_sum) |
| |
| #Cummulative Speed-up |
| derived_series["Cumm Speed-Up %s" % traversal] = [] |
| first_cumm_array = derived_series["Cumm Time %s %s" % (args.csv_files[0].split('_')[0], traversal)] |
| second_cumm_array = derived_series["Cumm Time %s %s" % (args.csv_files[1].split('_')[0], traversal)] |
| for i in xrange(len(first_cumm_array)): |
| if(second_array[i] == 0.0): |
| derived_series["Cumm Speed-Up %s" % traversal].append(None) |
| else: |
| derived_series["Cumm Speed-Up %s" % traversal].append(first_cumm_array[i] / second_cumm_array[i]) |
| |
| |
| |
| #Plot results |
| fig, ax = plt.subplots(4, sharex=True) |
| |
| |
| #Cummulative Times |
| for series_name in derived_series.keys(): |
| if series_name.startswith("Cumm Time"): |
| ax[0].plot(data[args.csv_files[0]]["Level"], derived_series[series_name], label=series_name[len("Cumm Time"):]) |
| ax[0].legend(loc='best') |
| ax[0].set_ylabel("Cummulative\nTime (sec)") |
| ax[0].set_title("Per Level Performance Characteristics") |
| ax[0].set_ylim(bottom=0) |
| |
| #Per-level Speed-up |
| for traversal in traversals: |
| series_name = "Avg Level Speed-up %s" % traversal |
| |
| ax[1].plot(data[args.csv_files[0]]["Level"], derived_series[series_name], label=traversal) |
| ax[1].legend(loc='best') |
| #ax[1].set_yscale('log') |
| ax[1].set_ylabel("Level Speed-Up\n(N_AVG %d)" % N_AVG) |
| ax[1].set_ylim(bottom=0) |
| |
| for traversal in traversals: |
| series_name = "Cumm Speed-Up %s" % traversal |
| |
| ax[2].plot(data[args.csv_files[0]]["Level"], derived_series[series_name], label=traversal) |
| ax[2].legend(loc='best') |
| ax[2].set_ylabel("Cummulative\nSpeed-Up") |
| ax[2].set_ylim(bottom=0) |
| |
| ax[3].plot(data[args.csv_files[0]]["Level"], data[args.csv_files[0]]["Width"], label="width") |
| |
| if args.min_fwd_width: |
| ax[3].plot(data[args.csv_files[0]]["Level"], [args.min_fwd_width for x in xrange(len(data[args.csv_files[0]]["Level"]))], label="Min // Fwd") |
| if args.min_fwd_width: |
| ax[3].plot(data[args.csv_files[0]]["Level"], [args.min_bck_width for x in xrange(len(data[args.csv_files[0]]["Level"]))], label="Min // Bck") |
| |
| ax[3].set_yscale('log') |
| ax[3].set_xlabel("Level") |
| ax[3].set_ylabel("Level Width") |
| #ax[3].set_xlim(right=len(data[args.csv_files[0]]["Level"])) |
| ax[3].legend(loc='best') |
| |
| #ax[0].set_xscale('log') |
| #ax[1].set_xscale('log') |
| #ax[2].set_xscale('log') |
| #ax[3].set_xscale('log') |
| plt.tight_layout() |
| if args.f: |
| plt.savefig(args.f, dpi=300) |
| else: |
| plt.show() |
| |
| |
| if __name__ == "__main__": |
| main() |