source: doc/theses/colby_parsons_MMAth/benchmarks/actors/plotData.py @ 625f3e2

ADTast-experimental
Last change on this file since 625f3e2 was 625f3e2, checked in by caparson <caparson@…>, 15 months ago

added latex compatible output format

  • Property mode set to 100644
File size: 5.1 KB
Line 
1import os
2import sys
3import time
4import matplotlib.pyplot as plt
5import matplotlib.ticker as ticks
6import math
7from scipy import stats as st
8import numpy as np
9from enum import Enum
10from statistics import median
11
12import matplotlib
13matplotlib.use("pgf")
14matplotlib.rcParams.update({
15    "pgf.texsystem": "pdflatex",
16    'font.family': 'serif',
17    'text.usetex': True,
18    'pgf.rcfonts': False,
19})
20
21readfile = open(sys.argv[1], "r")
22
23machineName = ""
24
25if len(sys.argv) > 2:
26    machineName = sys.argv[2]
27
28# first line has num times per experiment
29line = readfile.readline()
30numTimes = int(line)
31
32# second line has processor args
33line = readfile.readline()
34procs = []
35for val in line.split():
36    procs.append(int(val))
37
38# 3rd line has number of variants
39line = readfile.readline()
40names = line.split()
41numVariants = len(names)
42
43lines = (line.rstrip() for line in readfile) # All lines including the blank ones
44lines = (line for line in lines if line) # Non-blank lines
45
46class Bench(Enum):
47    Unset = 0
48    Executor = 1
49    Matrix = 2
50    Repeat = 3
51    Balance_One = 4
52    Balance_Multi = 5
53    Static = 7
54    Dynamic = 8
55
56nameSet = False
57currBench = Bench.Unset # default val
58count = 0
59procCount = 0
60currVariant = 0
61name = ""
62var_name = ""
63sendData = [0.0 for j in range(numVariants)]
64data = [[0.0 for i in range(len(procs))] for j in range(numVariants)]
65bars = [[[0.0 for i in range(len(procs))],[0.0 for k in range(len(procs))]] for j in range(numVariants)]
66tempData = [0.0 for i in range(numTimes)]
67for idx, line in enumerate(lines):
68    # print(line)
69   
70    if currBench == Bench.Unset:
71        if line == "executor":
72            name = "Executor"
73            currBench = Bench.Executor
74        elif line == "matrix":
75            name = "Matrix"
76            currBench = Bench.Matrix
77        elif line == "repeat":
78            name = "Repeat"
79            currBench = Bench.Repeat
80        elif line == "balance_one":
81            name = "Balance-One"
82            currBench = Bench.Balance_One
83        elif line == "balance_multi":
84            name = "Balance-Multi"
85            currBench = Bench.Balance_Multi
86        elif line == "static":
87            name = "Static"
88            currBench = Bench.Static
89        elif line == "dynamic":
90            name = "Dynamic"
91            currBench = Bench.Dynamic
92        else:
93            print("Expected benchmark name")
94            sys.exit()
95        continue
96
97    if line[0:4] == "proc":
98        continue
99
100    if currBench == Bench.Static or currBench == Bench.Dynamic:
101        if not nameSet:
102            nameSet = True
103            continue
104        lineArr = line.split()
105        tempData[count] = float(lineArr[-1])
106        count += 1
107        if count == numTimes:
108            currMedian = median( tempData )
109            sendData[currVariant] = currMedian
110            count = 0
111            nameSet = False
112            currVariant += 1
113
114            if currVariant == numVariants:
115                fileName = "data/" + machineName
116                if currBench == Bench.Static:
117                    fileName += "SendStatic"
118                else:
119                    fileName += "SendDynamic"
120                f = open(fileName, 'w')
121                f.write(" & ".join(map(lambda a: str(int(a)) + 'ns', sendData)))
122
123                # reset
124                currBench = Bench.Unset
125                currVariant = 0
126               
127    else:
128        if not nameSet:
129            nameSet = True
130            continue
131       
132        lineArr = line.split()
133        tempData[count] = float(lineArr[-1])
134        count += 1
135        if count == numTimes:
136            currMedian = median( tempData )
137            data[currVariant][procCount] = currMedian
138            lower, upper = st.t.interval(0.95, numTimes - 1, loc=np.mean(tempData), scale=st.sem(tempData))
139            bars[currVariant][0][procCount] = currMedian - lower
140            bars[currVariant][1][procCount] = upper - currMedian
141            count = 0
142            procCount += 1
143
144            if procCount == len(procs):
145                procCount = 0
146                nameSet = False
147                currVariant += 1
148
149                if currVariant == numVariants:
150                    fig, ax = plt.subplots()
151                    plt.title(name + " Benchmark")
152                    plt.ylabel("Runtime (seconds)")
153                    plt.xlabel("Cores")
154                    for idx, arr in enumerate(data):
155                        plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker='o' )
156                    if currBench == Bench.Executor or currBench == Bench.Matrix or currBench == Bench.Balance_One or currBench == Bench.Repeat:
157                        plt.yscale("log")
158                        plt.ylim(1, None)
159                        ax.get_yaxis().set_major_formatter(ticks.ScalarFormatter())
160                    else:
161                        plt.ylim(0, None)
162                    ax.legend(names)
163                    # fig.savefig("plots/" + name + ".png")
164                    plt.savefig("plots/" + machineName + name + ".pgf")
165                    fig.clf()
166
167                    # reset
168                    currBench = Bench.Unset
169                    currVariant = 0
Note: See TracBrowser for help on using the repository browser.