X-Git-Url: http://rtime.felk.cvut.cz/gitweb/can-benchmark.git/blobdiff_plain/d152c417dc3872185bdab7cccf00982831d87e9b..606fa78f2b870a5a55e2763d398d70298d2f7d21:/gw-tests/genhtml/genhtml.py diff --git a/gw-tests/genhtml/genhtml.py b/gw-tests/genhtml/genhtml.py index 3bc059c..76eee7b 100755 --- a/gw-tests/genhtml/genhtml.py +++ b/gw-tests/genhtml/genhtml.py @@ -9,18 +9,31 @@ class DimValue: def __init__(self, dim, value): self.dim = dim self.value = value + self.dim.addValue(self) def __str__(self): - return str(self.value) + return self.dim.val2str(self.value) def __repr__(self): - return repr(self.value) - def htmlLabel(self): - return self.dim.htmlLabel(self.value) + return "DimValue(%s, %s)" % (repr(self.dim), repr(self.value)) + def htmlTableHeading(self): + return self.dim.htmlTableHeading(self.value) class DimValues(list): def replace(self, val): for i in xrange(len(self)): if self[i].dim == val.dim: self[i] = val + def __add__(self, val): + ret = DimValues(self) + ret.append(val) + return ret + def __sub__(self, dim): + result = DimValues(self) + for v in self: + if v.dim == dim: + result.remove(v) + return result + def key(self): + return tuple([v.value for v in self]) class Dimension(dict): def __init__(self, atype, name=None): @@ -29,28 +42,37 @@ class Dimension(dict): self.name = name else: self.name = atype + self.sortedKeys = [] def __iter__(self): - keys = self.keys() - keys.sort() - for k in keys: - yield self[k] + for i in xrange(len(self)): + yield self.getValue(i) + def getValue(self, index): + return self[self.sortedKeys[index]] def addValue(self, *values): for value in values: if value not in self: - self[value] = DimValue(self, value) - def htmlLabel(self, v): - return v + if isinstance(value, DimValue): + self[value.value] = value + else: + raise Exception("Unsupported usage of addValue") + #self[value] = DimValue(self, value) + self.sortedKeys = self.keys() + self.sortedKeys.sort() + def val2str(self, v): + return str(v) + def htmlTableHeading(self, v): + return self.val2str(v) def __str__(self): return self.name def __repr__(self): - return self.type + return "Dimension(%s)"%self.type class DimensionKern(Dimension): def __init__(self): Dimension.__init__(self, 'gwkern', 'GW kernel') - def htmlLabel(self, v): + def htmlTableHeading(self, v): i=v.find(":") if i>0: kver=v[:i] else: kver=v @@ -65,10 +87,12 @@ class DimensionKern(Dimension): class DimensionHostKern(Dimension): def __init__(self): Dimension.__init__(self, 'hostkern', 'Host kernel') - def htmlLabel(self, v): + def val2str(self, v): if v.find("host-") == 0: v = v[5:] - # TODO: remove host- prefix + return v + def htmlTableHeading(self, v): + v = self.val2str(v) i = v.find(":") if i>0: kver = v[:i] else: kver = v @@ -83,15 +107,21 @@ class DimensionHostKern(Dimension): class DimensionTest(Dimension): def __init__(self): Dimension.__init__(self, 'test', 'Test') - def htmlLabel(self, v): + def htmlTableHeading(self, v): return v+"
source"%(urllib.quote(v)) class DimensionTraffic(Dimension): def __init__(self): Dimension.__init__(self, 'traf', 'Traffic') - def htmlLabel(self, v): - return v - + def val2str(self, v): + if v == "50": + return "50%" + elif v == "oneatatime": + return "one message at a time" + else: + return v + def htmlTableHeading(self, v): + return self.val2str(v) class Test: @classmethod def isOnPath(cls, path): @@ -99,51 +129,73 @@ class Test: return os.path.isfile(f) def __init__(self, path): self.path = path + self.name = os.path.basename(path) def printThumbLink(self, file): thumb = self.path+'/thumb' - for img in dircache.listdir(thumb): + try: + imgs = [img for img in dircache.listdir(thumb)] + except OSError: + imgs = [ self.name + ".png" ] + for img in imgs: print >>file, "" % \ (urllib.quote(self.path), img, urllib.quote(self.path), img) -def iterDimValues(dimensions): - idx = [0 for i in xrange(len(dimensions))] - done=False - while not done: - values=DimValues() - for i in xrange(len(dimensions)): - values.append(dimensions[i].values()[idx[i]]) - yield values - done=True - for i in xrange(len(dimensions)): - idx[i] += 1 - if idx[i] < len(dimensions[i]): - done=False - break - idx[i] = 0 +class Space(list): + """List of Dimensions()s (order matters)""" + def __init__(self, *dimensions): + self.extend(list(dimensions)) + def iterValues(self): + idx = [0 for i in xrange(len(self))] + done=False + while not done: + values=DimValues() + for i in xrange(len(self)): + values.append(self[i].values()[idx[i]]) + yield values + done=True + for i in xrange(len(self)): + idx[i] += 1 + if idx[i] < len(self[i]): + done=False + break + idx[i] = 0 + def reorder(self, dimValues): + reordered = DimValues() + for d in self: + for v in dimValues: + if v.dim == d: + reordered.append(v) + return reordered + def iterDimensionPairs(self): + for i in xrange(len(self)): + for j in xrange(i+1, len(self)): + yield (self[i], self[j]) + yield (self[j], self[i]) + def iterRemainingDimensions(self, dimensionPair): + for d in self: + if d not in dimensionPair: + yield d + class Tests(dict): """Represents all tests organized along several dimensions""" - def __init__(self, rootpath, *dimensions): + def __init__(self, rootpath, space): dict.__init__(self) - self.dimensions = dimensions + self.space = space if (rootpath): self.populate(rootpath) def getTest(self, key): - realkey=[] - for d in self.dimensions: - for i in key: - if i.dim == d: - realkey.append(i.value) - if len(realkey) != len(self.dimensions): - raise KeyError("The coordinates in key do not match dimensions") - return self[tuple(realkey)] + if len(key) != len(self.space): + raise KeyError("The coordinates in key do not match the dimension of the space") + realkey = self.space.reorder(key) + return self[realkey.key()] def addTest(self, test, coordinates): - if len(coordinates) != len(self.dimensions): + if len(coordinates) != len(self.space): raise KeyError("The number coordinates do not match the number of dimensions: " + str(coordinates)) self[tuple(coordinates)] = test for i in xrange(len(coordinates)): - self.dimensions[i].addValue(coordinates[i]) + DimValue(self.space[i], coordinates[i]) def populate(self, rootpath): for root, dirs, files in os.walk(rootpath): @@ -153,20 +205,11 @@ class Tests(dict): coordinates = rootpath if Test.isOnPath(root): self.addTest(Test(root), coordinates.split("/")) - def iterDimensionPairs(self): - for i in xrange(len(self.dimensions)): - for j in xrange(i+1, len(self.dimensions)): - yield (self.dimensions[i], self.dimensions[j]) - yield (self.dimensions[j], self.dimensions[i]) - def iterRemainingDimensions(self, dimensionPair): - for d in self.dimensions: - if d not in dimensionPair: - yield d def generateHtml(self): - for pair in self.iterDimensionPairs(): - remDims = [d for d in self.iterRemainingDimensions(pair)] - for vals in iterDimValues(remDims): - page = Page(pair, remDims, vals, self) + for pair in self.space.iterDimensionPairs(): + remDims = Space(*tuple([d for d in self.space.iterRemainingDimensions(pair)])) + for vals in remDims.iterValues(): + page = Page(pair, vals, self) page.generate() try: os.remove("index.html") @@ -176,15 +219,14 @@ class Tests(dict): #os.system("source-highlight -d --output-dir=. ../*.sh") class Page: - def __init__(self, dimPair, dimOther, valsOther, tests): + def __init__(self, dimPair, valsOther, tests): self.dimy, self.dimx = dimPair - self.dimOther = dimOther - self.valsOther = valsOther + self.dimOther = [v.dim for v in valsOther] + self.valsOther = tests.space.reorder(valsOther) self.tests = tests - def getName(self, dimy=None, dimx=None, valsOther=None): - return "%s-vs-%s-for-%s.html"%(dimx or self.dimy.type, - dimy or self.dimx.type, - "-".join([v.value for v in valsOther or self.valsOther])) + def getName(self): + return "%s-vs-%s-for-%s.html"%(self.dimy.type, self.dimx.type, + "-".join([v.value for v in self.valsOther])) def generate(self): html = open(self.getName(), "w") title = "CAN gateway timing analysis" @@ -201,8 +243,14 @@ th, td { border: 1px solid lightgray; padding: 4px;}

%s

""" % (title, title) + params = ["%s %s" % (v.dim, v) for v in self.valsOther] + print >>html, "Results for:", ", ".join(params), "
" for d in self.dimOther: print >>html, "%s: " % d + print >>html, "X axis, " % \ + Page((self.dimy, d), self.valsOther - d + self.dimx.getValue(0), self.tests).getName() + print >>html, "Y axis;  " % \ + Page((d, self.dimx), self.valsOther - d + self.dimy.getValue(0), self.tests).getName() links = [] for v in d.values(): if v in self.valsOther: @@ -210,7 +258,7 @@ th, td { border: 1px solid lightgray; padding: 4px;} else: vv = DimValues(self.valsOther) vv.replace(v) - links.append("%s"%(urllib.quote(self.getName(valsOther=vv)), str(v))) + links.append("%s"%(urllib.quote(Page((self.dimy, self.dimx), vv, self.tests).getName()), str(v))) print >>html, " | ".join(links) print >>html, "
" try: @@ -218,12 +266,12 @@ th, td { border: 1px solid lightgray; padding: 4px;} except Exception: pass - print >>html, "" + print >>html, "
" % (self.dimx.name, self.dimy.name) for x in self.dimx: - print >>html, "" % x.htmlLabel() + print >>html, "" % x.htmlTableHeading() print >>html, "" for y in self.dimy: - print >>html, "" % y.htmlLabel() + print >>html, "" % y.htmlTableHeading() for x in self.dimx: print >>html, "" @@ -249,6 +294,6 @@ th, td { border: 1px solid lightgray; padding: 4px;} if __name__ == "__main__": os.chdir(sys.argv[1]) os.system("rm *.html") - tests = Tests("./", DimensionHostKern(), DimensionKern(), DimensionTraffic(), DimensionTest()) + tests = Tests("./", Space(DimensionHostKern(), DimensionKern(), DimensionTraffic(), DimensionTest())) tests.generateHtml() sys.exit(0)
%s →
%s ↓
%s%s
%s
%s" @@ -231,10 +279,7 @@ th, td { border: 1px solid lightgray; padding: 4px;} idx.extend(self.valsOther) try: test = tests.getTest(idx) - try: - test.printThumbLink(html) - except OSError: - print >>html, "No thumbnail :-(" + test.printThumbLink(html) except KeyError: print >>html, "N/A" print >>html, "