3 from __future__ import print_function
4 import testlog_parser, sys, os, xml, re
5 from table_formatter import *
6 from optparse import OptionParser
8 cvsize_re = re.compile("^\d+x\d+$")
9 cvtype_re = re.compile("^(CV_)(8U|8S|16U|16S|32S|32F|64F)(C\d{1,3})?$")
12 if cvsize_re.match(a):
13 size = [int(d) for d in a.split('x')]
14 return size[0] * size[1]
15 elif cvtype_re.match(a):
16 if a.startswith("CV_"):
20 depth = (0, 1) [a[1] == 'S']
22 depth = (2, 3) [a[2] == 'S']
33 channels = int(a[a.index('C') + 1:])
34 #return (depth & 7) + ((channels - 1) << 3)
35 return ((channels-1) & 511) + (depth << 9)
38 convert = lambda text: int(text) if text.isdigit() else text
39 alphanum_keyselector = lambda key: [ convert(c) for c in re.split('([0-9]+)', str(keyselector(key))) ]
41 def getValueParams(test):
42 param = test.get("value_param")
45 if param.startswith("("):
47 if param.endswith(")"):
54 idx = param.find(",", prev_pos)
57 idxlb = param.find("(", prev_pos, idx)
60 idxlb = param.find("(", idxlb+1, idx)
61 idxrb = param.find(")", prev_pos, idx)
64 idxrb = param.find(")", idxrb+1, idx)
67 args.append(param[start:idx].strip())
70 args.append(param[start:].strip())
72 #return [p.strip() for p in param.split(",")]
74 def nextPermutation(indexes, lists, x, y):
77 while idx == x or idx == y:
82 if v < len(lists[idx]):
90 def getTestWideName(sname, indexes, lists, x, y):
92 for i in range(len(indexes)):
100 name += lists[i][indexes[i]]
101 return str(name + ")")
103 def getTest(stests, x, y, row, col):
105 if pair[1][x] == row and pair[1][y] == col:
109 if __name__ == "__main__":
110 parser = OptionParser()
111 parser.add_option("-o", "--output", dest="format", help="output results in text format (can be 'txt', 'html' or 'auto' - default)", metavar="FMT", default="auto")
112 parser.add_option("-u", "--units", dest="units", help="units for output values (s, ms (default), us, ns or ticks)", metavar="UNITS", default="ms")
113 parser.add_option("-m", "--metric", dest="metric", help="output metric", metavar="NAME", default="gmean")
114 parser.add_option("-x", "", dest="x", help="argument number for rows", metavar="ROW", default=1)
115 parser.add_option("-y", "", dest="y", help="argument number for columns", metavar="COL", default=0)
116 parser.add_option("-f", "--filter", dest="filter", help="regex to filter tests", metavar="REGEX", default=None)
117 (options, args) = parser.parse_args()
120 print("Usage:\n", os.path.basename(sys.argv[0]), "<log_name1>.xml", file=sys.stderr)
123 options.generateHtml = detectHtmlOutputType(options.format)
124 if options.metric not in metrix_table:
125 options.metric = "gmean"
126 if options.metric.endswith("%"):
127 options.metric = options.metric[:-1]
128 getter = metrix_table[options.metric][1]
130 tests = testlog_parser.parseLogFile(args[0])
132 expr = re.compile(options.filter)
133 tests = [(t,getValueParams(t)) for t in tests if expr.search(str(t))]
135 tests = [(t,getValueParams(t)) for t in tests]
137 args[0] = os.path.basename(args[0])
140 print("Error - no tests matched", file=sys.stderr)
143 argsnum = len(tests[0][1])
144 sname = tests[0][0].shortName()
147 for i in range(argsnum):
153 sn = pair[0].shortName()
159 if len(pair[1]) != argsnum:
160 print("Error - unable to create chart tables for functions having different argument numbers", file=sys.stderr)
162 for i in range(argsnum):
163 arglists[i][pair[1][i]] = 1
165 if names1 or len(names) != 1:
166 print("Error - unable to create tables for functions from different test suits:", file=sys.stderr)
168 for name in sorted(names):
169 print("%4s: %s" % (i, name), file=sys.stderr)
172 print("Other suits in this log (can not be chosen):", file=sys.stderr)
173 for name in sorted(names1):
174 print("%4s: %s" % (i, name), file=sys.stderr)
179 print("Error - tests from %s have less than 2 parameters" % sname, file=sys.stderr)
182 for i in range(argsnum):
183 arglists[i] = sorted([str(key) for key in arglists[i].iterkeys()], key=alphanum_keyselector)
185 if options.generateHtml and options.format != "moinwiki":
186 htmlPrintHeader(sys.stdout, "Report %s for %s" % (args[0], sname))
188 indexes = [0] * argsnum
191 if x == y or x < 0 or y < 0 or x >= argsnum or y >= argsnum:
200 for i in range(argsnum):
201 if i != x and i != y:
202 if v[i] != arglists[i][indexes[i]]:
208 tbl = table(metrix_table[options.metric][0] + " for\n" + getTestWideName(sname, indexes, arglists, x, y))
209 tbl.newColumn("x", "X\Y")
210 for col in arglists[y]:
211 tbl.newColumn(col, col, align="center")
212 for row in arglists[x]:
214 tbl.newCell("x", row)
215 for col in arglists[y]:
216 case = getTest(stests, x, y, row, col)
218 status = case.get("status")
220 tbl.newCell(col, status, color = "red")
222 val = getter(case, None, options.units)
223 if isinstance(val, float):
224 tbl.newCell(col, "%.2f %s" % (val, options.units), val)
226 tbl.newCell(col, val, val)
228 tbl.newCell(col, "-")
230 if options.generateHtml:
231 tbl.htmlPrintTable(sys.stdout, options.format == "moinwiki")
233 tbl.consolePrintTable(sys.stdout)
234 if not nextPermutation(indexes, arglists, x, y):
237 if options.generateHtml and options.format != "moinwiki":
238 htmlPrintFooter(sys.stdout)