7 class AutoTunerArgParser:
9 self.parser = argparse.ArgumentParser(description='Parsing the output log of the CSolver auto tuner ...')
10 self.parser.add_argument('--folder', '-f', metavar='bin', type=str, nargs=1,help='output log of running the autotuner ...')
11 self.args = self.parser.parse_args()
14 return self.args.folder[0]
18 TUNABLEHEADER = ["DECOMPOSEORDER", "MUSTREACHGLOBAL", "MUSTREACHLOCAL", "MUSTREACHPRUNE", "OPTIMIZEORDERSTRUCTURE",
19 "ORDERINTEGERENCODING", "PREPROCESS", "NODEENCODING", "EDGEENCODING", "MUSTEDGEPRUNE", "ELEMENTOPT",
20 "ENCODINGGRAPHOPT", "ELEMENTOPTSETS", "PROXYVARIABLE", "MUSTVALUE", "NAIVEENCODER", "VARIABLEORDER",
21 "PROBLEM","SATTIME", "EXECTIME","TUNERNUMBER"]
23 configs = {"EXECTIME": "-",
28 "ELEMENTOPTSETS" : "-",
29 "PROXYVARIABLE" : "-",
34 "ENCODINGGRAPHOPT" : "-"
37 REGEXES = {"EXECTIME": "CSOLVER solve time: (.*)",
38 "SATTIME":"SAT Solving time: (.*)",
39 "TESTCASE": "deserializing (.+) ...",
40 "PREPROCESS" : "Param PREPROCESS = (.*)range=\[0,1\]",
41 "ELEMENTOPT" : "Param ELEMENTOPT = (.*)range=\[0,1\]",
42 "ELEMENTOPTSETS" : "Param ELEMENTOPTSETS = (.*)range=\[0,1\]",
43 "PROXYVARIABLE" : "Param PROXYVARIABLE = (.*)range=\[1,5\]",
44 "#SubGraph" : "#SubGraph = (.*)",
45 "NODEENCODING" : "Param NODEENCODING = (.*)range=\[0,3\](.*)",
46 "EDGEENCODING" : "Param EDGEENCODING = (.*)range=\[0,2\](.*)",
47 "NAIVEENCODER" : "Param NAIVEENCODER = (.*)range=\[1,3\](.*)",
48 "ENCODINGGRAPHOPT" : "Param ENCODINGGRAPHOPT = (.*)range=\[0,1\]"
51 def printHeader(file):
54 for header in TUNABLEHEADER:
55 mystr+=str(header)+","
63 for i in range(len(TUNABLEHEADER)):
64 mystr += row[TUNABLEHEADER[i]]+ ","
65 data.append(row[TUNABLEHEADER[i]])
66 print ("mystr is:"+ mystr)
71 def loadTunerInfo(row, filename):
72 with open(filename) as f:
74 numbers = re.findall('\d+',line)
75 numbers = list(map(int,numbers))
76 row[TUNABLEHEADER[numbers[3]]] = row[TUNABLEHEADER[numbers[3]]] + str(numbers[7])
78 def loadSolverTime(row, filename):
81 with open(filename) as f:
84 p = re.compile(REGEXES[regex])
85 token = p.search(line)
87 if regex == "TESTCASE":
88 configs[regex] = re.search(REGEXES[regex], line).group(1)
90 configs[regex] = re.findall("\d+\.?\d*", line)[0]
91 row["SATTIME"] = configs["SATTIME"]
92 row["EXECTIME"] = configs["EXECTIME"]
94 def loadProblemName(row,filename):
96 with open(filename) as f:
97 problem = f.readline().replace("\n","")
98 probNumber = int(f.readline())
99 if probNumber >= len(PROBLEMS):
100 PROBLEMS.insert(probNumber,problem)
101 elif PROBLEMS[probNumber] != problem:
102 PROBLEMS[probNumber] = problem
103 row["PROBLEM"] = problem
105 def loadTunerNumber(row, filename):
106 with open(filename) as f:
107 row["TUNERNUMBER"] = f.readline().replace("\n","")
108 def analyzeLogs(file):
110 argprocess = AutoTunerArgParser()
116 row = {"DECOMPOSEORDER" : "",
117 "MUSTREACHGLOBAL" : "",
118 "MUSTREACHLOCAL" : "",
119 "MUSTREACHPRUNE" : "",
120 "OPTIMIZEORDERSTRUCTURE" : "",
121 "ORDERINTEGERENCODING" : "",
125 "MUSTEDGEPRUNE" : "",
127 "ENCODINGGRAPHOPT" : "",
128 "ELEMENTOPTSETS" : "",
129 "PROXYVARIABLE" : "",
132 "VARIABLEORDER" : "",
139 loadTunerNumber(row, argprocess.getFolder() + "/tunernum" + str(i))
140 loadTunerInfo(row, argprocess.getFolder()+"/tuner"+str(i)+"used")
141 loadSolverTime(row, argprocess.getFolder()+"/log"+str(i))
142 loadProblemName(row, argprocess.getFolder()+"/problem"+str(i))
143 data.append(dump(file, row))
150 def tunerCountAnalysis(file, rows):
158 if not row[TUNABLEHEADER[i]]:
161 mystr+=row[TUNABLEHEADER[i]]
162 if mystr not in tunercount:
163 tunercount.update({mystr : 1})
164 tunernumber.update({mystr : str(row["TUNERNUMBER"])})
166 tunercount[mystr] += 1
167 tunernumber[mystr] += "-" + str(row["TUNERNUMBER"])
169 problems = set(map(lambda x: x["PROBLEM"], rows))
170 print ("Number of repititive tuners")
171 for key in tunercount:
172 if tunercount[key] > 1:
173 print( key + "(ids:" + tunernumber[key] + ") = #" + str(tunercount[key]) )
175 def combineRowForEachTuner(rows):
180 if row["PROBLEM"] == PROBLEMS[0]:
184 combined[key] = row[key]
185 if row["PROBLEM"] == PROBLEMS[len(PROBLEMS)-1]:
186 newRows.append(combined)
189 def transformDataset(rows):
195 file = open("tuner.csv", "w")
196 rows, data = analyzeLogs(file)
197 tunerCountAnalysis(file, combineRowForEachTuner(rows) )
199 #transformDataset(data)
200 pl.plot(data, TUNABLEHEADER)
203 if __name__ == "__main__":