blob: bdf570ad2e853fa8cf1d7bc5ea78c9a1003569d2 [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']
Christophe Favergeon74a31ba2019-09-09 09:14:18 +010022MKBOOLFIELD=['HARDFP', 'FASTMATH', 'NEON', 'HELIUM','UNROLL', 'ROUNDING','OPTIMIZED']
Christophe Favergeon37b86222019-07-17 11:49:00 +020023MKINTFIELD=['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']
Christophe Favergeon74a31ba2019-09-09 09:14:18 +010034VALBOOLFIELD=['HARDFP', 'FASTMATH', 'NEON', 'HELIUM','UNROLL', 'ROUNDING','OPTIMIZED']
Christophe Favergeon37b86222019-07-17 11:49:00 +020035VALINTFIELD=['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)
Christophe Favergeon4a8d9dc2019-08-14 08:55:46 +020058 params = list(elem.params.full)
Christophe Favergeon37b86222019-07-17 11:49:00 +020059 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)
Christophe Favergeon4a8d9dc2019-08-14 08:55:46 +020078 params = list(elem.params.full)
79 common = diff(cols + ["TYPE"] , ['OLDID'] + params)
Christophe Favergeon058b63b2019-07-25 10:40:32 +020080
81 sql += "%sid INTEGER PRIMARY KEY" % (tableName)
82 start = ","
Christophe Favergeon37b86222019-07-17 11:49:00 +020083
84 for field in params:
85 sql += " %s\n %s INTEGER" % (start,field)
86 start = ","
87
88 for field in common:
89 if field in MKSTRFIELD:
90 sql += "%s\n %s TEXT" % (start,field)
91 if field in MKINTFIELD:
92 sql += "%s\n %s INTEGER" % (start,field)
93 if field in MKKEYFIELD:
94 sql += "%s\n %s INTEGER" % (start,MKKEYFIELDID[field])
95 if field in MKDATEFIELD:
96 sql += "%s\n %s TEXT" % (start,field)
97 if field in MKBOOLFIELD:
98 sql += "%s\n %s INTEGER" % (start,field)
99 start = ","
100 # Create foreign keys
101 sql += "%sFOREIGN KEY(typeid) REFERENCES TYPE(typeid)," % start
102 sql += "FOREIGN KEY(categoryid) REFERENCES CATEGORY(categoryid),"
103 sql += "FOREIGN KEY(platformid) REFERENCES PLATFORM(platformid),"
104 sql += "FOREIGN KEY(coreid) REFERENCES CORE(coreid),"
105 sql += "FOREIGN KEY(compilerid) REFERENCES COMPILER(compilerid)"
106 sql += " )"
Christophe Favergeon37b86222019-07-17 11:49:00 +0200107 conn.execute(sql)
108
109# Find the key or add it in a table
110def findInTable(conn,table,keystr,strv,key):
111 #print(sql)
112 r = conn.execute("select %s from %s where %s=?" % (key,table,keystr),(strv,))
113 result=r.fetchone()
114 if result != None:
115 return(result[0])
116 else:
117 conn.execute("INSERT INTO %s(%s) VALUES(?)" % (table,keystr),(strv,))
118 conn.commit()
119 r = conn.execute("select %s from %s where %s=?" % (key,table,keystr),(strv,))
120 result=r.fetchone()
121 if result != None:
122 #print(result)
123 return(result[0])
124 else:
125 return(None)
126
127def findInCompilerTable(conn,kind,version):
128 #print(sql)
129 r = conn.execute("select compilerid from COMPILER where compilerkindid=? AND version=?" , (kind,version))
130 result=r.fetchone()
131 if result != None:
132 return(result[0])
133 else:
134 conn.execute("INSERT INTO COMPILER(compilerkindid,version) VALUES(?,?)" ,(kind,version))
135 conn.commit()
136 r = conn.execute("select compilerid from COMPILER where compilerkindid=? AND version=?" , (kind,version))
137 result=r.fetchone()
138 if result != None:
139 #print(result)
140 return(result[0])
141 else:
142 return(None)
143
144
145def addRows(conn,elem,tableName,full):
146 # List of columns we have in DB which is
147 # different from the columns in the table
148 keep = getColumns(elem,full)
149 cols = list(full.columns)
Christophe Favergeon4a8d9dc2019-08-14 08:55:46 +0200150 params = list(elem.params.full)
Christophe Favergeon37b86222019-07-17 11:49:00 +0200151 common = diff(["TYPE"] + cols , ['OLDID'] + params)
Christophe Favergeon058b63b2019-07-25 10:40:32 +0200152 colNameList = []
153 for c in params + keep:
154 if c in MKKEYFIELD:
155 colNameList.append(MKKEYFIELDID[c])
156 else:
157 colNameList.append(c)
158 colNames = "".join(joinit(colNameList,","))
159 #print(colNameList)
160 #print(colNames)
Christophe Favergeon37b86222019-07-17 11:49:00 +0200161 #print(full)
162 for index, row in full.iterrows():
Christophe Favergeon058b63b2019-07-25 10:40:32 +0200163 sql = "INSERT INTO %s(%s) VALUES(" % (tableName,colNames)
Christophe Favergeon37b86222019-07-17 11:49:00 +0200164 keys = {}
165
166 # Get data from columns
167 for field in common:
168 if field in VALSTRFIELD:
169 keys[field]=row[field]
170 if field == "NAME":
171 name = row[field]
172 if re.match(r'^.*_f64',name):
173 keys["TYPE"] = "f64"
174 if re.match(r'^.*_f32',name):
175 keys["TYPE"] = "f32"
176 if re.match(r'^.*_f16',name):
177 keys["TYPE"] = "f16"
178 if re.match(r'^.*_q31',name):
179 keys["TYPE"] = "q31"
180 if re.match(r'^.*_q15',name):
181 keys["TYPE"] = "q15"
182 if re.match(r'^.*_q7',name):
183 keys["TYPE"] = "q7"
184
185 if re.match(r'^.*_s8',name):
186 keys["TYPE"] = "s8"
187 if re.match(r'^.*_u8',name):
188 keys["TYPE"] = "u8"
189 if re.match(r'^.*_s16',name):
190 keys["TYPE"] = "s16"
191 if re.match(r'^.*_u16',name):
192 keys["TYPE"] = "u16"
193 if re.match(r'^.*_s32',name):
194 keys["TYPE"] = "s32"
195 if re.match(r'^.*_u32',name):
196 keys["TYPE"] = "u32"
197 if re.match(r'^.*_s64',name):
198 keys["TYPE"] = "s64"
199 if re.match(r'^.*_u64',name):
200 keys["TYPE"] = "u64"
201
202 if field in VALINTFIELD:
203 keys[field]=row[field]
204 if field in VALDATEFIELD:
205 keys[field]=row[field]
206 if field in VALBOOLFIELD:
207 keys[field]=row[field]
208
209
210 # Get foreign keys and create missing data
211 for field in common:
212 if field in VALKEYFIELD:
213 if field == "CATEGORY":
214 val = findInTable(conn,"CATEGORY","category",row[field],"categoryid")
215 keys[field]=val
216 if field == "CORE":
217 val = findInTable(conn,"CORE","coredef",row[field],"coreid")
218 keys[field]=val
219 if field == "PLATFORM":
220 val = findInTable(conn,"PLATFORM","platform",row[field],"platformid")
221 keys[field]=val
222 if field == "TYPE":
223 val = findInTable(conn,"TYPE","type",keys["TYPE"],"typeid")
224 keys[field]=val
225 if field == "COMPILER":
226 compilerkind = findInTable(conn,"COMPILERKIND","compiler",row[field],"compilerkindid")
227 compiler = findInCompilerTable(conn,compilerkind,keys["VERSION"])
228 keys[field]=compiler
229
230 # Generate sql command
231 start = ""
232 for field in params:
233 sql += " %s\n %d" % (start,row[field])
234 start = ","
235
236 for field in keep:
237 if field in MKSTRFIELD or field in MKDATEFIELD:
238 sql += " %s\n \"%s\"" % (start,keys[field])
239 elif field in keep:
240 sql += " %s\n %d" % (start,keys[field])
241 start = ","
242
243 sql += " )"
244 #print(sql)
245 conn.execute(sql)
246 conn.commit()
247
248def addOneBenchmark(elem,fullPath,db,group):
Christophe Favergeon74a31ba2019-09-09 09:14:18 +0100249 if os.path.isfile(fullPath):
250 full=pd.read_csv(fullPath,dtype={'OLDID': str} ,keep_default_na = False)
251 full['DATE'] = datetime.datetime.now()
252 if group:
253 tableName = group
254 else:
255 tableName = elem.data["class"]
256 conn = sqlite3.connect(db)
257 createTableIfMissing(conn,elem,tableName,full)
258 addRows(conn,elem,tableName,full)
259 conn.close()
Christophe Favergeon37b86222019-07-17 11:49:00 +0200260
261
262def addToDB(benchmark,dbpath,elem,group):
263 if not elem.data["deprecated"]:
264 if elem.params:
265 benchPath = os.path.join(benchmark,elem.fullPath(),"fullBenchmark.csv")
266 print("Processing %s" % benchPath)
267 addOneBenchmark(elem,benchPath,dbpath,group)
268
269 for c in elem.children:
270 addToDB(benchmark,dbpath,c,group)
271
272
273
274parser = argparse.ArgumentParser(description='Generate summary benchmarks')
275
276parser.add_argument('-f', nargs='?',type = str, default=None, help="Test description file path")
277parser.add_argument('-b', nargs='?',type = str, default="FullBenchmark", help="Full Benchmark dir path")
Christophe Favergeon97ce6fd2019-07-29 07:44:23 +0200278#parser.add_argument('-e', action='store_true', help="Embedded test")
Christophe Favergeon37b86222019-07-17 11:49:00 +0200279parser.add_argument('-o', nargs='?',type = str, default="bench.db", help="Benchmark database")
280
281parser.add_argument('others', nargs=argparse.REMAINDER)
282
283args = parser.parse_args()
284
285if args.f is not None:
286 p = parse.Parser()
287 # Parse the test description file
288 root = p.parse(args.f)
289 d.deprecate(root,args.others)
290 if args.others:
291 group=args.others[0]
292 else:
293 group=None
294 addToDB(args.b,args.o,root,group)
295
296else:
297 parser.print_help()