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.parser.add_argument('--number', '-n', metavar='122', type=int, nargs=1,help='Number of runs ...')
12 self.args = self.parser.parse_args()
15 return self.args.folder[0]
17 def getRunNumber(self):
18 return self.args.number[0]
22 TUNABLEHEADER = ["DECOMPOSEORDER", "MUSTREACHGLOBAL", "MUSTREACHLOCAL", "MUSTREACHPRUNE", "OPTIMIZEORDERSTRUCTURE",
23 "ORDERINTEGERENCODING", "PREPROCESS", "NODEENCODING", "EDGEENCODING", "MUSTEDGEPRUNE", "ELEMENTOPT",
24 "ENCODINGGRAPHOPT", "ELEMENTOPTSETS", "PROXYVARIABLE", "MUSTVALUE", "NAIVEENCODER", "VARIABLEORDER",
25 "PROBLEM","SATTIME", "EXECTIME","TUNERNUMBER"]
27 configs = {"EXECTIME": "-",
32 "ELEMENTOPTSETS" : "-",
33 "PROXYVARIABLE" : "-",
38 "ENCODINGGRAPHOPT" : "-"
41 REGEXES = {"EXECTIME": "CSOLVER solve time: (.*)",
42 "SATTIME":"SAT Solving time: (.*)",
43 "TESTCASE": "deserializing (.+) ...",
44 "PREPROCESS" : "Param PREPROCESS = (.*)range=\[0,1\]",
45 "ELEMENTOPT" : "Param ELEMENTOPT = (.*)range=\[0,1\]",
46 "ELEMENTOPTSETS" : "Param ELEMENTOPTSETS = (.*)range=\[0,1\]",
47 "PROXYVARIABLE" : "Param PROXYVARIABLE = (.*)range=\[1,5\]",
48 "#SubGraph" : "#SubGraph = (.*)",
49 "NODEENCODING" : "Param NODEENCODING = (.*)range=\[0,3\](.*)",
50 "EDGEENCODING" : "Param EDGEENCODING = (.*)range=\[0,2\](.*)",
51 "NAIVEENCODER" : "Param NAIVEENCODER = (.*)range=\[1,3\](.*)",
52 "ENCODINGGRAPHOPT" : "Param ENCODINGGRAPHOPT = (.*)range=\[0,1\]"
55 def printHeader(file):
58 for header in TUNABLEHEADER:
59 mystr+=str(header)+","
65 for i in range(len(TUNABLEHEADER)):
66 mystr += row[TUNABLEHEADER[i]]+ ","
67 print "mystr is:"+ mystr
70 def loadTunerInfo(row, filename):
71 with open(filename) as f:
73 numbers = re.findall('\d+',line)
74 numbers = map(int,numbers)
75 row[TUNABLEHEADER[numbers[3]]] = row[TUNABLEHEADER[numbers[3]]] + str(numbers[7])
77 def loadSolverTime(row, filename):
80 with open(filename) as f:
83 p = re.compile(REGEXES[regex])
84 token = p.search(line)
86 if regex == "TESTCASE":
87 configs[regex] = re.search(REGEXES[regex], line).group(1)
89 configs[regex] = re.findall("\d+\.?\d*", line)[0]
90 row["SATTIME"] = configs["SATTIME"]
91 row["EXECTIME"] = configs["EXECTIME"]
93 def loadProblemName(row,filename):
95 with open(filename) as f:
96 problem = f.readline().replace("\n","")
97 probNumber = int(f.readline())
98 if probNumber >= len(PROBLEMS):
99 PROBLEMS.insert(probNumber,problem)
100 elif PROBLEMS[probNumber] != problem:
101 PROBLEMS[probNumber] = problem
102 row["PROBLEM"] = problem
104 def loadTunerNumber(row, filename):
105 with open(filename) as f:
106 row["TUNERNUMBER"] = f.readline().replace("\n","")
107 def analyzeLogs(file):
109 argprocess = AutoTunerArgParser()
112 for i in range(argprocess.getRunNumber()):
113 row = {"DECOMPOSEORDER" : "",
114 "MUSTREACHGLOBAL" : "",
115 "MUSTREACHLOCAL" : "",
116 "MUSTREACHPRUNE" : "",
117 "OPTIMIZEORDERSTRUCTURE" : "",
118 "ORDERINTEGERENCODING" : "",
122 "MUSTEDGEPRUNE" : "",
124 "ENCODINGGRAPHOPT" : "",
125 "ELEMENTOPTSETS" : "",
126 "PROXYVARIABLE" : "",
129 "VARIABLEORDER" : "",
135 loadTunerNumber(row, argprocess.getFolder() + "/tunernum" + str(i))
136 loadTunerInfo(row, argprocess.getFolder()+"/tuner"+str(i)+"used")
137 loadSolverTime(row, argprocess.getFolder()+"/log"+str(i))
138 loadProblemName(row, argprocess.getFolder()+"/problem"+str(i))
143 def tunerCountAnalysis(file, rows):
151 if not row[TUNABLEHEADER[i]]:
154 mystr+=row[TUNABLEHEADER[i]]
155 if mystr not in tunercount:
156 tunercount.update({mystr : 1})
157 tunernumber.update({mystr : str(row["TUNERNUMBER"])})
159 tunercount[mystr] += 1
160 tunernumber[mystr] += "-" + str(row["TUNERNUMBER"])
162 problems = set(map(lambda x: x["PROBLEM"], rows))
163 print "Number of repititive tuners"
164 for key in tunercount:
165 if tunercount[key] > 1:
166 print key + "(ids:" + tunernumber[key] + ") = #" + str(tunercount[key])
168 def combineRowForEachTuner(rows):
173 if row["PROBLEM"] == PROBLEMS[0]:
177 combined[key] = row[key]
178 if row["PROBLEM"] == PROBLEMS[len(PROBLEMS)-1]:
179 newRows.append(combined)
183 file = open("tuner.csv", "w")
184 rows = analyzeLogs(file)
185 tunerCountAnalysis(file, combineRowForEachTuner(rows) )
189 if __name__ == "__main__":