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