1 | import matplotlib.pyplot as plt |
---|
2 | from mpl_toolkits.mplot3d import axes3d |
---|
3 | import numpy as np |
---|
4 | import os |
---|
5 | import sys |
---|
6 | |
---|
7 | def wykres(threadsy,capacitiesy,wyniki,iteracje,atrybut): |
---|
8 | kolory=['red','green','blue'] |
---|
9 | alfy=[0.1,0.1,0.8] |
---|
10 | fig = plt.figure() |
---|
11 | ax = fig.add_subplot(111, projection='3d') |
---|
12 | ax.view_init(30,-150) |
---|
13 | for i,iteracja in enumerate(iteracje): |
---|
14 | X, Y = np.meshgrid(threadsy, capacitiesy) #X,Y are arrays of same size, 2D, with separated indexes |
---|
15 | Z=np.empty(X.shape) |
---|
16 | Z.fill(np.nan) #instead of nan, one could set -10 to clearly see on the plot which values are missing |
---|
17 | for wynik in wyniki: |
---|
18 | threads,capacity,slownik=wynik |
---|
19 | if slownik['iter']==iteracja: |
---|
20 | print(threads,capacity,slownik[atrybut] if atrybut in slownik else np.nan) |
---|
21 | threadsindex=threadsy.index(threads) |
---|
22 | capacitiesindex=capacitiesy.index(capacity) |
---|
23 | Z[capacitiesindex,threadsindex]=slownik[atrybut] if atrybut in slownik else np.nan |
---|
24 | print(Z) |
---|
25 | ktore=len(kolory)-len(iteracje)+i |
---|
26 | ax.plot_surface(X, Y, Z, rstride=1, cstride=1, color=kolory[ktore], linewidth=1, alpha=alfy[ktore],edgecolor=(0,0,0,alfy[ktore])) |
---|
27 | ax.set_xlabel('threads') |
---|
28 | ax.set_ylabel('capacity') |
---|
29 | ax.set_zlabel(atrybut) |
---|
30 | ax.set_xticks(threadsy) |
---|
31 | ax.set_yticks(capacitiesy) |
---|
32 | ax.set_zlim((0,ax.get_zlim()[1])) #scale from (forced) zero to auto |
---|
33 | plt.savefig("wykres_%d_%s.png" % (iteracja,atrybut)) |
---|
34 | #plt.show() #if you wanted to rotate the chart interactively |
---|
35 | plt.close() |
---|
36 | |
---|
37 | |
---|
38 | |
---|
39 | |
---|
40 | |
---|
41 | ####################################################### main ####################################################### |
---|
42 | |
---|
43 | threadsy=set() #used to store values of 'threads' that are in use. This is helpful because later a single multi-dimensional numpy array is used to keep all results |
---|
44 | capacitiesy=set() #used to store values of 'capacity' that are in use |
---|
45 | wyniki=[] #list of all results |
---|
46 | |
---|
47 | os.chdir(sys.argv[1]) #files with plots will also be created in that directory |
---|
48 | for plik in os.listdir('.'): |
---|
49 | if plik.endswith(".out") and plik.count('_')==2: |
---|
50 | podzielone=plik.replace('.','_').split('_') |
---|
51 | threads=int(podzielone[1]) |
---|
52 | capacity=int(podzielone[2]) |
---|
53 | threadsy.add(threads) |
---|
54 | capacitiesy.add(capacity) |
---|
55 | plik = open("test_%d_%d.out" % (threads,capacity), "r") #should be the same name as the original file |
---|
56 | slowniki = [] |
---|
57 | for linia in plik: |
---|
58 | linia=linia.strip() |
---|
59 | if linia.startswith("Script.Message: iter="): |
---|
60 | slownik={} |
---|
61 | for pole in linia.split(' '): |
---|
62 | if '=' in pole: |
---|
63 | pole=pole.strip(',') |
---|
64 | pole=pole.split('=') |
---|
65 | slownik[pole[0]]=float(pole[1]) |
---|
66 | print(slownik) |
---|
67 | slowniki.append(slownik) |
---|
68 | wyniki.append((threads,capacity,slownik)) |
---|
69 | plik.close() |
---|
70 | |
---|
71 | threadsy=sorted(list(threadsy)) |
---|
72 | capacitiesy=sorted(list(capacitiesy)) |
---|
73 | print(threadsy) |
---|
74 | print(capacitiesy) |
---|
75 | |
---|
76 | wykres(threadsy,capacitiesy,wyniki,[3.0,6.0,9.0],'simsteps') |
---|
77 | wykres(threadsy,capacitiesy,wyniki,[3.0,6.0,9.0],'evals') |
---|
78 | wykres(threadsy,capacitiesy,wyniki,[3.0,6.0,9.0],'migrations') |
---|
79 | wykres(threadsy,capacitiesy,wyniki,[4.0,9.0],'fit_avg') |
---|
80 | wykres(threadsy,capacitiesy,wyniki,[4.0,9.0],'fit_max') |
---|
81 | |
---|
82 | #draws simple 2D plots of progress in consecutive iter's: |
---|
83 | #x=[] |
---|
84 | #y1=[] |
---|
85 | #y2=[] |
---|
86 | #for s in slowniki: |
---|
87 | # x.append(s['iter']) |
---|
88 | # y1.append(s['avg_fit']) |
---|
89 | # y2.append(s['max_fit']) |
---|
90 | #plt.plot(x,y1) |
---|
91 | #plt.plot(x,y2) |
---|
92 | #plt.savefig("avg_%d_%d.png" % (threads,capacity)) |
---|
93 | #plt.close() |
---|
94 | |
---|