Scripts needed for automation of learning process ... Tested on Sypet benchmark ...
[satune.git] / src / Scripts / autotunerparser.py
1 import re
2 import argparse
3 import sys
4
5
6 class AutoTunerArgParser:
7     def __init__(self):
8         self.parser = argparse.ArgumentParser(description='Parsing the output log of the CSolver auto tuner ...')
9         self.parser.add_argument('--file', '-f', metavar='out.log', type=str, nargs=1,help='output log of running the autotuner ...')
10         self.args = self.parser.parse_args()
11         
12     def getFileName(self):
13         return self.args.file[0]
14
15 HEADER = ["TESTCASE", "SATTIME", "EXECTIME", "PREPROCESS", "ELEMENTOPT", "ELEMENTOPTSETS", "PROXYVARIABLE", "#SubGraph", "NODEENCODING", "EDGEENCODING", "NAIVEENCODER", "ENCODINGGRAPHOPT"]
16
17 configs = {"EXECTIME": "-",
18                 "SATTIME":"-",
19                 "TESTCASE":"-",
20                 "PREPROCESS" : "-",
21                 "ELEMENTOPT" : "-",
22                 "ELEMENTOPTSETS" : "-",
23                 "PROXYVARIABLE" : "-",
24                 "#SubGraph" : "-",
25                 "NODEENCODING" : "-",
26                 "EDGEENCODING" : "-",
27                 "NAIVEENCODER" :"-",
28                 "ENCODINGGRAPHOPT" : "-"
29                 }
30
31 REGEXES = {"EXECTIME": "CSOLVER solve time: (.*)",
32                 "SATTIME":"SAT Solving time: (.*)",
33                 "TESTCASE": "deserializing (.+) ...",
34                 "PREPROCESS" : "Param PREPROCESS = (.*)range=\[0,1\]",
35                 "ELEMENTOPT" : "Param ELEMENTOPT = (.*)range=\[0,1\]",
36                 "ELEMENTOPTSETS" : "Param ELEMENTOPTSETS = (.*)range=\[0,1\]",
37                 "PROXYVARIABLE" : "Param PROXYVARIABLE = (.*)range=\[1,5\]",
38                 "#SubGraph" : "#SubGraph = (.*)",
39                 "NODEENCODING" : "Param NODEENCODING = (.*)range=\[0,3\](.*)",
40                 "EDGEENCODING" : "Param EDGEENCODING = (.*)range=\[0,2\](.*)",
41                 "NAIVEENCODER" : "Param NAIVEENCODER = (.*)range=\[1,3\](.*)",
42                 "ENCODINGGRAPHOPT" : "Param ENCODINGGRAPHOPT = (.*)range=\[0,1\]"
43                 }
44 def reorderEntry(entry):
45         global HEADER
46         result = []
47         for key in HEADER:
48                 result.append(entry[key])
49         return result
50
51
52 def printHeader(file):
53         global HEADER
54         mystr=""
55         for key in HEADER:
56                  mystr+=key+","
57         print >>file, mystr
58         
59 def printConfig(file, data):
60         print data
61         mystr=""
62         for val  in data:
63                  mystr+=str(val)+","
64         print >> file, mystr
65
66
67 def main():
68         global configs
69         argprocess = AutoTunerArgParser()
70         output = open("tuner.csv", "w")
71         printHeader(output)
72         result = []
73         with open(argprocess.getFileName()) as file:
74                 for line in file:
75                         if line.startswith("Mutating"):
76                                 result.append(reorderEntry(configs))
77                         elif line.startswith("Best tuner"):
78                                 result.append(reorderEntry(configs))
79                         else :
80                                 for regex in REGEXES:
81                                         p = re.compile(REGEXES[regex])
82                                         token = p.search(line)
83                                         if token is not None:
84                                                 if regex == "TESTCASE":
85                                                         configs[regex] = re.search(REGEXES[regex], line).group(1)
86                                                 else:
87                                                         configs[regex] = re.findall("\d+\.?\d*", line)[0]
88
89         #configs["EXECTIME"] = "BEST TUNE:"
90         result.append(reorderEntry(configs))
91         result.sort(key = lambda entry: entry[0])
92         for entry in result:
93                 printConfig(output, entry)
94         print "Done with parsing " + argprocess.getFileName()
95
96 if __name__ == "__main__":
97         main()