2012-11-24 02:57:22 +08:00
#!/usr/bin/env python
2011-09-06 23:30:28 +08:00
import testlog_parser , sys , os , xml , re
from table_formatter import *
from optparse import OptionParser
cvsize_re = re . compile ( " ^ \ d+x \ d+$ " )
2011-09-07 17:38:12 +08:00
cvtype_re = re . compile ( " ^(CV_)(8U|8S|16U|16S|32S|32F|64F)(C \ d { 1,3})?$ " )
2011-09-06 23:30:28 +08:00
def keyselector ( a ) :
if cvsize_re . match ( a ) :
size = [ int ( d ) for d in a . split ( ' x ' ) ]
return size [ 0 ] * size [ 1 ]
elif cvtype_re . match ( a ) :
2011-09-07 17:38:12 +08:00
if a . startswith ( " CV_ " ) :
a = a [ 3 : ]
2011-09-06 23:30:28 +08:00
depth = 7
if a [ 0 ] == ' 8 ' :
depth = ( 0 , 1 ) [ a [ 1 ] == ' S ' ]
elif a [ 0 ] == ' 1 ' :
depth = ( 2 , 3 ) [ a [ 2 ] == ' S ' ]
elif a [ 2 ] == ' S ' :
depth = 4
elif a [ 0 ] == ' 3 ' :
depth = 5
elif a [ 0 ] == ' 6 ' :
depth = 6
2011-09-07 17:38:12 +08:00
cidx = a . find ( ' C ' )
if cidx < 0 :
channels = 1
else :
channels = int ( a [ a . index ( ' C ' ) + 1 : ] )
2011-09-06 23:30:28 +08:00
#return (depth & 7) + ((channels - 1) << 3)
2011-09-07 17:38:12 +08:00
return ( ( channels - 1 ) & 511 ) + ( depth << 9 )
2011-09-06 23:30:28 +08:00
return a
2012-10-17 07:18:30 +08:00
convert = lambda text : int ( text ) if text . isdigit ( ) else text
2011-11-29 23:43:46 +08:00
alphanum_keyselector = lambda key : [ convert ( c ) for c in re . split ( ' ([0-9]+) ' , str ( keyselector ( key ) ) ) ]
2011-11-22 21:57:44 +08:00
2011-09-06 23:30:28 +08:00
def getValueParams ( test ) :
param = test . get ( " value_param " )
if not param :
return [ ]
if param . startswith ( " ( " ) :
param = param [ 1 : ]
if param . endswith ( " ) " ) :
param = param [ : - 1 ]
2011-11-01 23:41:43 +08:00
args = [ ]
prev_pos = 0
start = 0
balance = 0
while True :
idx = param . find ( " , " , prev_pos )
if idx < 0 :
break
idxlb = param . find ( " ( " , prev_pos , idx )
while idxlb > = 0 :
balance + = 1
idxlb = param . find ( " ( " , idxlb + 1 , idx )
idxrb = param . find ( " ) " , prev_pos , idx )
while idxrb > = 0 :
balance - = 1
idxrb = param . find ( " ) " , idxrb + 1 , idx )
assert ( balance > = 0 )
if balance == 0 :
args . append ( param [ start : idx ] . strip ( ) )
start = idx + 1
prev_pos = idx + 1
args . append ( param [ start : ] . strip ( ) )
return args
#return [p.strip() for p in param.split(",")]
2011-09-06 23:30:28 +08:00
def nextPermutation ( indexes , lists , x , y ) :
idx = len ( indexes ) - 1
while idx > = 0 :
while idx == x or idx == y :
idx - = 1
if idx < 0 :
return False
v = indexes [ idx ] + 1
if v < len ( lists [ idx ] ) :
indexes [ idx ] = v ;
return True ;
else :
indexes [ idx ] = 0 ;
idx - = 1
return False
def getTestWideName ( sname , indexes , lists , x , y ) :
name = sname + " ::( "
for i in range ( len ( indexes ) ) :
if i > 0 :
name + = " , "
if i == x :
name + = " X "
elif i == y :
name + = " Y "
else :
name + = lists [ i ] [ indexes [ i ] ]
2012-10-17 07:18:30 +08:00
return str ( name + " ) " )
2011-09-06 23:30:28 +08:00
def getTest ( stests , x , y , row , col ) :
for pair in stests :
if pair [ 1 ] [ x ] == row and pair [ 1 ] [ y ] == col :
return pair [ 0 ]
2012-10-17 07:18:30 +08:00
return None
2011-09-06 23:30:28 +08:00
if __name__ == " __main__ " :
parser = OptionParser ( )
parser . add_option ( " -o " , " --output " , dest = " format " , help = " output results in text format (can be ' txt ' , ' html ' or ' auto ' - default) " , metavar = " FMT " , default = " auto " )
parser . add_option ( " -u " , " --units " , dest = " units " , help = " units for output values (s, ms (default), mks, ns or ticks) " , metavar = " UNITS " , default = " ms " )
parser . add_option ( " -m " , " --metric " , dest = " metric " , help = " output metric " , metavar = " NAME " , default = " gmean " )
parser . add_option ( " -x " , " " , dest = " x " , help = " argument number for rows " , metavar = " ROW " , default = 1 )
parser . add_option ( " -y " , " " , dest = " y " , help = " argument number for columns " , metavar = " COL " , default = 0 )
parser . add_option ( " -f " , " --filter " , dest = " filter " , help = " regex to filter tests " , metavar = " REGEX " , default = None )
( options , args ) = parser . parse_args ( )
2012-10-17 07:18:30 +08:00
2011-09-06 23:30:28 +08:00
if len ( args ) != 1 :
print >> sys . stderr , " Usage: \n " , os . path . basename ( sys . argv [ 0 ] ) , " <log_name1>.xml "
exit ( 1 )
options . generateHtml = detectHtmlOutputType ( options . format )
if options . metric not in metrix_table :
options . metric = " gmean "
if options . metric . endswith ( " % " ) :
options . metric = options . metric [ : - 1 ]
getter = metrix_table [ options . metric ] [ 1 ]
2012-10-17 07:18:30 +08:00
2011-09-06 23:30:28 +08:00
tests = testlog_parser . parseLogFile ( args [ 0 ] )
if options . filter :
expr = re . compile ( options . filter )
tests = [ ( t , getValueParams ( t ) ) for t in tests if expr . search ( str ( t ) ) ]
2011-09-07 17:38:12 +08:00
else :
tests = [ ( t , getValueParams ( t ) ) for t in tests ]
2012-10-17 07:18:30 +08:00
2011-09-07 17:38:12 +08:00
args [ 0 ] = os . path . basename ( args [ 0 ] )
2012-10-17 07:18:30 +08:00
2011-09-06 23:30:28 +08:00
if not tests :
print >> sys . stderr , " Error - no tests matched "
exit ( 1 )
2012-10-17 07:18:30 +08:00
2011-09-06 23:30:28 +08:00
argsnum = len ( tests [ 0 ] [ 1 ] )
sname = tests [ 0 ] [ 0 ] . shortName ( )
2012-10-17 07:18:30 +08:00
2011-09-06 23:30:28 +08:00
arglists = [ ]
for i in range ( argsnum ) :
arglists . append ( { } )
2012-10-17 07:18:30 +08:00
2011-09-07 17:38:12 +08:00
names = set ( )
2011-11-20 02:02:00 +08:00
names1 = set ( )
2011-09-06 23:30:28 +08:00
for pair in tests :
2011-09-07 17:38:12 +08:00
sn = pair [ 0 ] . shortName ( )
2011-09-07 19:41:30 +08:00
if len ( pair [ 1 ] ) > 1 :
names . add ( sn )
2011-11-20 02:02:00 +08:00
else :
names1 . add ( sn )
2011-09-07 17:38:12 +08:00
if sn == sname :
if len ( pair [ 1 ] ) != argsnum :
print >> sys . stderr , " Error - unable to create chart tables for functions having different argument numbers "
sys . exit ( 1 )
for i in range ( argsnum ) :
arglists [ i ] [ pair [ 1 ] [ i ] ] = 1
2012-10-17 07:18:30 +08:00
2011-11-20 02:02:00 +08:00
if names1 or len ( names ) != 1 :
2011-09-07 19:41:30 +08:00
print >> sys . stderr , " Error - unable to create tables for functions from different test suits: "
2011-09-07 17:38:12 +08:00
i = 1
for name in sorted ( names ) :
print >> sys . stderr , " %4s : %s " % ( i , name )
i + = 1
2011-11-20 02:02:00 +08:00
if names1 :
2014-03-03 01:04:17 +08:00
print >> sys . stderr , " Other suits in this log (can not be chosen): "
2011-11-20 02:02:00 +08:00
for name in sorted ( names1 ) :
print >> sys . stderr , " %4s : %s " % ( i , name )
i + = 1
2011-09-07 17:38:12 +08:00
sys . exit ( 1 )
2012-10-17 07:18:30 +08:00
2011-09-07 17:38:12 +08:00
if argsnum < 2 :
print >> sys . stderr , " Error - tests from %s have less than 2 parameters " % sname
exit ( 1 )
2012-10-17 07:18:30 +08:00
2011-09-06 23:30:28 +08:00
for i in range ( argsnum ) :
2011-11-22 21:57:44 +08:00
arglists [ i ] = sorted ( [ str ( key ) for key in arglists [ i ] . iterkeys ( ) ] , key = alphanum_keyselector )
2012-10-17 07:18:30 +08:00
2011-09-09 20:15:09 +08:00
if options . generateHtml and options . format != " moinwiki " :
2011-09-06 23:30:28 +08:00
htmlPrintHeader ( sys . stdout , " Report %s for %s " % ( args [ 0 ] , sname ) )
2012-10-17 07:18:30 +08:00
2011-09-06 23:30:28 +08:00
indexes = [ 0 ] * argsnum
x = int ( options . x )
y = int ( options . y )
if x == y or x < 0 or y < 0 or x > = argsnum or y > = argsnum :
x = 1
y = 0
2012-10-17 07:18:30 +08:00
2011-09-06 23:30:28 +08:00
while True :
stests = [ ]
for pair in tests :
t = pair [ 0 ]
v = pair [ 1 ]
for i in range ( argsnum ) :
if i != x and i != y :
if v [ i ] != arglists [ i ] [ indexes [ i ] ] :
t = None
break
if t :
stests . append ( pair )
tbl = table ( metrix_table [ options . metric ] [ 0 ] + " for \n " + getTestWideName ( sname , indexes , arglists , x , y ) )
tbl . newColumn ( " x " , " X \ Y " )
for col in arglists [ y ] :
tbl . newColumn ( col , col , align = " center " )
for row in arglists [ x ] :
tbl . newRow ( )
tbl . newCell ( " x " , row )
for col in arglists [ y ] :
case = getTest ( stests , x , y , row , col )
if case :
status = case . get ( " status " )
if status != " run " :
tbl . newCell ( col , status , color = " red " )
else :
val = getter ( case , None , options . units )
if isinstance ( val , float ) :
tbl . newCell ( col , " %.2f %s " % ( val , options . units ) , val )
else :
tbl . newCell ( col , val , val )
else :
tbl . newCell ( col , " - " )
2012-10-17 07:18:30 +08:00
2011-09-06 23:30:28 +08:00
if options . generateHtml :
2011-09-09 20:15:09 +08:00
tbl . htmlPrintTable ( sys . stdout , options . format == " moinwiki " )
2011-09-06 23:30:28 +08:00
else :
tbl . consolePrintTable ( sys . stdout )
if not nextPermutation ( indexes , arglists , x , y ) :
break
2012-10-17 07:18:30 +08:00
2011-09-09 20:15:09 +08:00
if options . generateHtml and options . format != " moinwiki " :
2011-11-22 21:57:44 +08:00
htmlPrintFooter ( sys . stdout )