ECF 1.7
make_stats.py
1import math
2import os.path
3from os import path
4
6
7 def __init__(self):
8 self.generations = []
9 self.times = []
10 self.evals = []
11 self.mins = []
12 self.maxs = []
13 self.avgs = []
14 self.stds = []
15
16 def readLogFile(self, fileName):
17 try:
18 logFile = open(fileName, 'r')
19 except IOError:
20 print("Couldn't open the file ", fileName)
21 quit()
22
23 generation = []
24 eval = []
25 time = []
26 max = []
27 min = []
28 avg = []
29 std = []
30 inGeneration = False
31 readMax = readMin = readAvg = readStd = False
32 readEval = readTime = False
33
34 for line in logFile:
35 items = [word for word in line.split()]
36 if(len(items) == 0):
37 continue
38 if(items[0] == "Generation:"):
39 generation.append(int(items[1]))
40 inGeneration = True
41 if(not readEval and items[0] == "Evaluations:"):
42 eval.append(int(items[1]))
43 readEval = True
44 if(not readTime and items[0] == "Elapsed"):
45 time.append(int(items[2]))
46 readTime = True
47 if(not readMax and items[0] == "max:"):
48 max.append(float(items[1]))
49 readMax = True
50 if(not readMin and items[0] == "min:"):
51 min.append(float(items[1]))
52 readMin = True
53 if(not readAvg and items[0] == "avg:"):
54 avg.append(float(items[1]))
55 readAvg = True
56 if(not readStd and items[0] == "stdev:"):
57 std.append(float(items[1]))
58 readStd = True
59 if(inGeneration and readMax and readMin and readAvg and readStd):
60 inGeneration = readMax = readMin = readAvg = readStd = False
61 readEval = readTime = False
62
63 logFile.close()
64 self.generations.append(generation)
65 self.times.append(time)
66 self.evals.append(eval)
67 self.mins.append(min)
68 self.maxs.append(max)
69 self.avgs.append(avg)
70 self.stds.append(std)
71# print("eval:", eval)
72# print("time:", time)
73# print("max:", max)
74# print("min:", min)
75# print(len(self.evals))
76
77
78 def getPartialLog(self, percentage):
79 stats = []
80 for i in range(len(self.generations)):
81 logNo = int((len(self.generations[i]) - 1) * percentage);
82 stat = []
83 stat.append(self.mins[i][logNo])
84 stat.append(self.maxs[i][logNo]);
85 stat.append(self.avgs[i][logNo]);
86 stat.append(self.generations[i][logNo]);
87 stat.append(self.evals[i][logNo]);
88 stat.append(self.times[i][logNo]);
89 stats.append(stat);
90 return stats;
91
92
93 def getStats(self):
94 stats = []
95 for i in range(len(self.generations)):
96 stat = []
97 stat.append(min(self.mins[i]))
98 stat.append(max(self.maxs[i]));
99 stat.append(self.avgs[i][-1]);
100 stat.append(self.stds[i][-1]);
101 stat.append(self.evals[i][-1]);
102 stat.append(self.times[i][-1]);
103 stat.append(self.generations[i][-1]);
104 stats.append(stat);
105 return stats;
106
107
108 def getMean(self, values):
109 sum = float(0)
110 for i in range(len(values)):
111 sum += values[i]
112 return sum / len(values)
113
114
115 def getStdDev(self, values):
116 if len(values) == 0:
117 return 0
118 numerator = float(0)
119 average = self.getMean(values)
120 for i in range(len(values)):
121 numerator += ((values[i] - average) * (values[i] - average));
122 denominator = (len(values) - 1)
123 return math.sqrt(numerator / denominator)
124
125
126 def getMin(self, values):
127 min = values[0]
128 for i in range(len(values)):
129 if min > values[i]:
130 min = values[i]
131 return min
132
133
134 def getMax(self, values):
135 max = values[0]
136 for i in range(len(values)):
137 if max < values[i]:
138 max = values[i]
139 return max
140
141
142 def getMedian(self, values):
143 values.sort()
144 if len(values) % 2 == 0:
145 return (values[int(len(values) / 2) - 1] + values[int(len(values) / 2)]) / 2
146 else:
147 return values[int(len(values) / 2)]
148
149
150def printStr(FloatNumber, Precision):
151 return "%0.*f" % (Precision, FloatNumber)
152
153
154
155
156# main
157if __name__ == "__main__":
158
159 # default values
160 logBase = "log_";
161 logExt = ".txt";
162 outFile = "stats.txt";
163 logStartNum = 1;
164 logEndNum = 0;
165 nDigits = 2;
166
167 line = input(" -- Log filename base (enter - \"" + logBase + "\") : ")
168 if line != "":
169 logBase = line
170
171 line = input(" -- Starting log number (enter - " + str(logStartNum) + ") : ")
172 if line != "":
173 logStartNum = int(line)
174
175 line = input(" -- End log number (enter - read all): ")
176 if line != "":
177 logEndNum = int(line)
178
179 line = input(" -- Log filename num of digits (enter - 2) : ")
180 if line != "":
181 nDigits = int(line)
182
183 line = input(" -- Extension (enter - \"" + logExt + "\") : ")
184 if line != "":
185 logExt = line
186
187 line = input(" -- Output file (enter - \"" + outFile + "\") : ")
188 if line != "":
189 outFile = line
190
191
192 logNum = logStartNum
193 rs = ReadStats()
194
195 while True:
196 fileName = ""
197 fileName += logBase
198 fileName += str(logNum).zfill(nDigits)
199 fileName += logExt
200
201 print("Log filename: ", fileName)
202 opened = False
203 if path.exists(fileName):
204 print("Found!")
205 opened = True
206 rs.readLogFile(fileName)
207 else:
208 print("File not found!")
209
210 logNum += 1
211 cont = False
212 if logEndNum >= logNum or opened == True:
213 cont = True
214 if not cont:
215 break
216
217 stats = rs.getStats()
218 nRuns = len(stats)
219 #print(stats)
220
221 file = open(outFile, "w")
222 file.write("runId\tfit_min\tfit_max\tfit_avg\tfit_std\t#evals\ttime\tgen\n")
223 for sample in range(nRuns):
224 output = str(sample + 1) + "\t"
225 for value in stats[sample]:
226 output += str(value) + "\t"
227 output += "\n"
228 file.write(output)
229 file.close()
getMean(self, values)