blob: 0ef54b43af609f25c4ceca7b3740d7f3e5a0fea9 [file] [log] [blame]
Christophe Favergeon37b86222019-07-17 11:49:00 +02001# Process the test results
2# Test status (like passed, or failed with error code)
3
4import argparse
5import re
6import TestScripts.NewParser as parse
7import TestScripts.CodeGen
8from collections import deque
9import os.path
10import numpy as np
11import pandas as pd
12import statsmodels.api as sm
13import statsmodels.formula.api as smf
14import csv
15import TestScripts.Deprecate as d
16import sqlite3
17import datetime, time
18import re
19
20# For table creation
21MKSTRFIELD=['NAME']
22MKBOOLFIELD=['HARDFP', 'FASTMATH', 'NEON', 'UNROLL', 'ROUNDING','OPTIMIZED']
23MKINTFIELD=['ID', 'CYCLES']
24MKDATEFIELD=['DATE']
25MKKEYFIELD=['CATEGORY', 'PLATFORM', 'CORE', 'COMPILER','TYPE']
26MKKEYFIELDID={'CATEGORY':'categoryid',
27 'PLATFORM':'platformid',
28 'CORE':'coreid',
29 'COMPILER':'compilerid',
30 'TYPE':'typeid'}
31
32# For table value extraction
33VALSTRFIELD=['NAME','VERSION']
34VALBOOLFIELD=['HARDFP', 'FASTMATH', 'NEON', 'UNROLL', 'ROUNDING','OPTIMIZED']
35VALINTFIELD=['ID', 'CYCLES']
36VALDATEFIELD=['DATE']
37VALKEYFIELD=['CATEGORY', 'PLATFORM', 'CORE', 'COMPILER','TYPE']
38
39def joinit(iterable, delimiter):
40 it = iter(iterable)
41 yield next(it)
42 for x in it:
43 yield delimiter
44 yield x
45
46def tableExists(c,tableName):
47 req=(tableName,)
48 r=c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name=?",req)
49 return(r.fetchone() != None)
50
51def diff(first, second):
52 second = set(second)
53 return [item for item in first if item not in second]
54
55def getColumns(elem,full):
56 colsToKeep=[]
57 cols = list(full.columns)
58 params = list(joinit(elem.params.full,","))
59 common = diff(cols + ["TYPE"] , ['OLDID'] + params)
60
61 for field in common:
62 if field in MKSTRFIELD:
63 colsToKeep.append(field)
64 if field in MKINTFIELD:
65 colsToKeep.append(field)
66 if field in MKKEYFIELD:
67 colsToKeep.append(field)
68 if field in MKDATEFIELD:
69 colsToKeep.append(field)
70 if field in MKBOOLFIELD:
71 colsToKeep.append(field)
72 return(colsToKeep)
73
74def createTableIfMissing(conn,elem,tableName,full):
75 if not tableExists(conn,tableName):
76 sql = "CREATE TABLE %s (" % tableName
77 cols = list(full.columns)
78 params = list(joinit(elem.params.full,","))
79 common = diff(cols + ["TYPE"] , ['OLDID'] + params)
80 start = ""
81
82 for field in params:
83 sql += " %s\n %s INTEGER" % (start,field)
84 start = ","
85
86 for field in common:
87 if field in MKSTRFIELD:
88 sql += "%s\n %s TEXT" % (start,field)
89 if field in MKINTFIELD:
90 sql += "%s\n %s INTEGER" % (start,field)
91 if field in MKKEYFIELD:
92 sql += "%s\n %s INTEGER" % (start,MKKEYFIELDID[field])
93 if field in MKDATEFIELD:
94 sql += "%s\n %s TEXT" % (start,field)
95 if field in MKBOOLFIELD:
96 sql += "%s\n %s INTEGER" % (start,field)
97 start = ","
98 # Create foreign keys
99 sql += "%sFOREIGN KEY(typeid) REFERENCES TYPE(typeid)," % start
100 sql += "FOREIGN KEY(categoryid) REFERENCES CATEGORY(categoryid),"
101 sql += "FOREIGN KEY(platformid) REFERENCES PLATFORM(platformid),"
102 sql += "FOREIGN KEY(coreid) REFERENCES CORE(coreid),"
103 sql += "FOREIGN KEY(compilerid) REFERENCES COMPILER(compilerid)"
104 sql += " )"
105 #print(sql)
106 conn.execute(sql)
107
108# Find the key or add it in a table
109def findInTable(conn,table,keystr,strv,key):
110 #print(sql)
111 r = conn.execute("select %s from %s where %s=?" % (key,table,keystr),(strv,))
112 result=r.fetchone()
113 if result != None:
114 return(result[0])
115 else:
116 conn.execute("INSERT INTO %s(%s) VALUES(?)" % (table,keystr),(strv,))
117 conn.commit()
118 r = conn.execute("select %s from %s where %s=?" % (key,table,keystr),(strv,))
119 result=r.fetchone()
120 if result != None:
121 #print(result)
122 return(result[0])
123 else:
124 return(None)
125
126def findInCompilerTable(conn,kind,version):
127 #print(sql)
128 r = conn.execute("select compilerid from COMPILER where compilerkindid=? AND version=?" , (kind,version))
129 result=r.fetchone()
130 if result != None:
131 return(result[0])
132 else:
133 conn.execute("INSERT INTO COMPILER(compilerkindid,version) VALUES(?,?)" ,(kind,version))
134 conn.commit()
135 r = conn.execute("select compilerid from COMPILER where compilerkindid=? AND version=?" , (kind,version))
136 result=r.fetchone()
137 if result != None:
138 #print(result)
139 return(result[0])
140 else:
141 return(None)
142
143
144def addRows(conn,elem,tableName,full):
145 # List of columns we have in DB which is
146 # different from the columns in the table
147 keep = getColumns(elem,full)
148 cols = list(full.columns)
149 params = list(joinit(elem.params.full,","))
150 common = diff(["TYPE"] + cols , ['OLDID'] + params)
151 #print(full)
152 for index, row in full.iterrows():
153 sql = "INSERT INTO %s VALUES(" % tableName
154 keys = {}
155
156 # Get data from columns
157 for field in common:
158 if field in VALSTRFIELD:
159 keys[field]=row[field]
160 if field == "NAME":
161 name = row[field]
162 if re.match(r'^.*_f64',name):
163 keys["TYPE"] = "f64"
164 if re.match(r'^.*_f32',name):
165 keys["TYPE"] = "f32"
166 if re.match(r'^.*_f16',name):
167 keys["TYPE"] = "f16"
168 if re.match(r'^.*_q31',name):
169 keys["TYPE"] = "q31"
170 if re.match(r'^.*_q15',name):
171 keys["TYPE"] = "q15"
172 if re.match(r'^.*_q7',name):
173 keys["TYPE"] = "q7"
174
175 if re.match(r'^.*_s8',name):
176 keys["TYPE"] = "s8"
177 if re.match(r'^.*_u8',name):
178 keys["TYPE"] = "u8"
179 if re.match(r'^.*_s16',name):
180 keys["TYPE"] = "s16"
181 if re.match(r'^.*_u16',name):
182 keys["TYPE"] = "u16"
183 if re.match(r'^.*_s32',name):
184 keys["TYPE"] = "s32"
185 if re.match(r'^.*_u32',name):
186 keys["TYPE"] = "u32"
187 if re.match(r'^.*_s64',name):
188 keys["TYPE"] = "s64"
189 if re.match(r'^.*_u64',name):
190 keys["TYPE"] = "u64"
191
192 if field in VALINTFIELD:
193 keys[field]=row[field]
194 if field in VALDATEFIELD:
195 keys[field]=row[field]
196 if field in VALBOOLFIELD:
197 keys[field]=row[field]
198
199
200 # Get foreign keys and create missing data
201 for field in common:
202 if field in VALKEYFIELD:
203 if field == "CATEGORY":
204 val = findInTable(conn,"CATEGORY","category",row[field],"categoryid")
205 keys[field]=val
206 if field == "CORE":
207 val = findInTable(conn,"CORE","coredef",row[field],"coreid")
208 keys[field]=val
209 if field == "PLATFORM":
210 val = findInTable(conn,"PLATFORM","platform",row[field],"platformid")
211 keys[field]=val
212 if field == "TYPE":
213 val = findInTable(conn,"TYPE","type",keys["TYPE"],"typeid")
214 keys[field]=val
215 if field == "COMPILER":
216 compilerkind = findInTable(conn,"COMPILERKIND","compiler",row[field],"compilerkindid")
217 compiler = findInCompilerTable(conn,compilerkind,keys["VERSION"])
218 keys[field]=compiler
219
220 # Generate sql command
221 start = ""
222 for field in params:
223 sql += " %s\n %d" % (start,row[field])
224 start = ","
225
226 for field in keep:
227 if field in MKSTRFIELD or field in MKDATEFIELD:
228 sql += " %s\n \"%s\"" % (start,keys[field])
229 elif field in keep:
230 sql += " %s\n %d" % (start,keys[field])
231 start = ","
232
233 sql += " )"
234 #print(sql)
235 conn.execute(sql)
236 conn.commit()
237
238def addOneBenchmark(elem,fullPath,db,group):
239 full=pd.read_csv(fullPath,dtype={'OLDID': str} ,keep_default_na = False)
240 full['DATE'] = datetime.datetime.now()
241 if group:
242 tableName = group
243 else:
244 tableName = elem.data["class"]
245 conn = sqlite3.connect(db)
246 createTableIfMissing(conn,elem,tableName,full)
247 addRows(conn,elem,tableName,full)
248 conn.close()
249
250
251def addToDB(benchmark,dbpath,elem,group):
252 if not elem.data["deprecated"]:
253 if elem.params:
254 benchPath = os.path.join(benchmark,elem.fullPath(),"fullBenchmark.csv")
255 print("Processing %s" % benchPath)
256 addOneBenchmark(elem,benchPath,dbpath,group)
257
258 for c in elem.children:
259 addToDB(benchmark,dbpath,c,group)
260
261
262
263parser = argparse.ArgumentParser(description='Generate summary benchmarks')
264
265parser.add_argument('-f', nargs='?',type = str, default=None, help="Test description file path")
266parser.add_argument('-b', nargs='?',type = str, default="FullBenchmark", help="Full Benchmark dir path")
267parser.add_argument('-e', action='store_true', help="Embedded test")
268parser.add_argument('-o', nargs='?',type = str, default="bench.db", help="Benchmark database")
269
270parser.add_argument('others', nargs=argparse.REMAINDER)
271
272args = parser.parse_args()
273
274if args.f is not None:
275 p = parse.Parser()
276 # Parse the test description file
277 root = p.parse(args.f)
278 d.deprecate(root,args.others)
279 if args.others:
280 group=args.others[0]
281 else:
282 group=None
283 addToDB(args.b,args.o,root,group)
284
285else:
286 parser.print_help()