blob: a6352cec10fcc6d77c688563b683653b211e2557 [file] [log] [blame]
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +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
Christophe Favergeon37b86222019-07-17 11:49:00 +020015import TestScripts.Deprecate as d
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +020016
17def findItem(root,path):
18 """ Find a node in a tree
19
20 Args:
21 path (list) : A list of node ID
22 This list is describing a path in the tree.
23 By starting from the root and following this path,
24 we can find the node in the tree.
25 Raises:
26 Nothing
27 Returns:
28 TreeItem : A node
29 """
30 # The list is converted into a queue.
31 q = deque(path)
32 q.popleft()
33 c = root
34 while q:
35 n = q.popleft()
36 # We get the children based on its ID and continue
37 c = c[n-1]
38 return(c)
39
40
41
42NORMAL = 1
43INTEST = 2
44TESTPARAM = 3
45
46def joinit(iterable, delimiter):
47 it = iter(iterable)
48 yield next(it)
49 for x in it:
50 yield delimiter
51 yield x
52
53def formatProd(a,b):
54 if a == "Intercept":
Christophe Favergeone15894e2020-05-14 07:25:53 +020055 return("%.3f" % b)
56 return("%s * %.3f" % (a,b))
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +020057
Christophe Favergeonfeb73932020-05-20 14:48:06 +020058def log2(x):
59 return(np.log2(x))
60
61def log(x):
62 return(np.log(x))
63
Christophe Favergeon5cacf9d2019-08-14 10:41:17 +020064def summaryBenchmark(resultPath,elem,path):
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +020065 regressionPath=os.path.join(os.path.dirname(path),"regression.csv")
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +020066
Christophe Favergeon74a31ba2019-09-09 09:14:18 +010067 if os.path.isfile(path):
68 print(" Generating %s" % regressionPath)
69 full=pd.read_csv(path,dtype={'OLDID': str} ,keep_default_na = False)
70 #print(full)
71
72 csvheaders = []
73 with open(os.path.join(resultPath,'currentConfig.csv'), 'r') as f:
74 reader = csv.reader(f)
75 csvheaders = next(reader, None)
76
77 groupList = list(set(elem.params.full) - set(elem.params.summary))
78 #grouped=full.groupby(list(elem.params.summary) + ['ID','CATEGORY']).max()
79 #grouped.reset_index(level=grouped.index.names, inplace=True)
80 #print(grouped)
81 #print(grouped.columns)
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +020082
83
Christophe Favergeon74a31ba2019-09-09 09:14:18 +010084 def reg(d):
85 m=d["CYCLES"].max()
Christophe Favergeonfeb73932020-05-20 14:48:06 +020086 #print( elem.params.formula)
87
Christophe Favergeon74a31ba2019-09-09 09:14:18 +010088 results = smf.ols('CYCLES ~ ' + elem.params.formula, data=d).fit()
Christophe Favergeonfeb73932020-05-20 14:48:06 +020089
Christophe Favergeon74a31ba2019-09-09 09:14:18 +010090 f=joinit([formatProd(a,b) for (a,b) in zip(results.params.index,results.params.values)]," + ")
91 f="".join(f)
92 f = re.sub(r':','*',f)
93 #print(results.summary())
94 return(pd.Series({'Regression':"%s" % f,'MAX' : m,'MAXREGCOEF' : results.params.values[-1]}))
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +020095
Christophe Favergeon4fa1e232020-05-15 12:28:17 +020096 regList = ['ID','OLDID','CATEGORY','TESTNAME','NAME'] + csvheaders + groupList
Christophe Favergeon74a31ba2019-09-09 09:14:18 +010097
98 regression=full.groupby(regList).apply(reg)
99 regression.reset_index(level=regression.index.names, inplace=True)
100 renamingDict = { a : b for (a,b) in zip(elem.params.full,elem.params.paramNames)}
101 regression = regression.rename(columns=renamingDict)
102 regression.to_csv(regressionPath,index=False,quoting=csv.QUOTE_NONNUMERIC)
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +0200103
104
Christophe Favergeon5cacf9d2019-08-14 10:41:17 +0200105def extractBenchmarks(resultPath,benchmark,elem):
Christophe Favergeon37b86222019-07-17 11:49:00 +0200106 if not elem.data["deprecated"]:
107 if elem.params:
108 benchPath = os.path.join(benchmark,elem.fullPath(),"fullBenchmark.csv")
109 print("Processing %s" % benchPath)
Christophe Favergeon5cacf9d2019-08-14 10:41:17 +0200110 summaryBenchmark(resultPath,elem,benchPath)
Christophe Favergeon37b86222019-07-17 11:49:00 +0200111
112 for c in elem.children:
Christophe Favergeon5cacf9d2019-08-14 10:41:17 +0200113 extractBenchmarks(resultPath,benchmark,c)
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +0200114
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +0200115
116
117parser = argparse.ArgumentParser(description='Generate summary benchmarks')
118
Christophe Favergeon512b1482020-02-07 11:25:11 +0100119parser.add_argument('-f', nargs='?',type = str, default="Output.pickle", help="Test description cache")
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +0200120parser.add_argument('-b', nargs='?',type = str, default="FullBenchmark", help="Full Benchmark dir path")
Christophe Favergeon5cacf9d2019-08-14 10:41:17 +0200121# Needed to find the currentConfig.csv and know the headers
122parser.add_argument('-r', nargs='?',type = str, default=None, help="Result file path")
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +0200123
Christophe Favergeon37b86222019-07-17 11:49:00 +0200124parser.add_argument('others', nargs=argparse.REMAINDER)
125
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +0200126args = parser.parse_args()
127
128if args.f is not None:
Christophe Favergeon6f8eee92019-10-09 12:21:27 +0100129 #p = parse.Parser()
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +0200130 # Parse the test description file
Christophe Favergeon6f8eee92019-10-09 12:21:27 +0100131 #root = p.parse(args.f)
132 root=parse.loadRoot(args.f)
Christophe Favergeon37b86222019-07-17 11:49:00 +0200133 d.deprecate(root,args.others)
Christophe Favergeon5cacf9d2019-08-14 10:41:17 +0200134 resultPath=os.path.dirname(args.r)
135 extractBenchmarks(resultPath,args.b,root)
Christophe Favergeon3b2a0ee2019-06-12 13:29:14 +0200136
137else:
138 parser.print_help()