12185Sbinkertn@umich.edu# Copyright (c) 2005-2006 The Regents of The University of Michigan 21881Sbinkertn@umich.edu# All rights reserved. 31881Sbinkertn@umich.edu# 41881Sbinkertn@umich.edu# Redistribution and use in source and binary forms, with or without 51881Sbinkertn@umich.edu# modification, are permitted provided that the following conditions are 61881Sbinkertn@umich.edu# met: redistributions of source code must retain the above copyright 71881Sbinkertn@umich.edu# notice, this list of conditions and the following disclaimer; 81881Sbinkertn@umich.edu# redistributions in binary form must reproduce the above copyright 91881Sbinkertn@umich.edu# notice, this list of conditions and the following disclaimer in the 101881Sbinkertn@umich.edu# documentation and/or other materials provided with the distribution; 111881Sbinkertn@umich.edu# neither the name of the copyright holders nor the names of its 121881Sbinkertn@umich.edu# contributors may be used to endorse or promote products derived from 131881Sbinkertn@umich.edu# this software without specific prior written permission. 141881Sbinkertn@umich.edu# 151881Sbinkertn@umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 161881Sbinkertn@umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 171881Sbinkertn@umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 181881Sbinkertn@umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 191881Sbinkertn@umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 201881Sbinkertn@umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 211881Sbinkertn@umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 221881Sbinkertn@umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 231881Sbinkertn@umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 241881Sbinkertn@umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 251881Sbinkertn@umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 261881Sbinkertn@umich.edu# 271881Sbinkertn@umich.edu# Authors: Nathan Binkert 281881Sbinkertn@umich.edu 292006Sbinkertn@umich.edufrom chart import ChartOptions 302006Sbinkertn@umich.edu 312006Sbinkertn@umich.educlass StatOutput(ChartOptions): 322343Sbinkertn@umich.edu def __init__(self, jobfile, info, stat=None): 332006Sbinkertn@umich.edu super(StatOutput, self).__init__() 341881Sbinkertn@umich.edu self.jobfile = jobfile 351881Sbinkertn@umich.edu self.stat = stat 361881Sbinkertn@umich.edu self.invert = False 371881Sbinkertn@umich.edu self.info = info 381881Sbinkertn@umich.edu 392343Sbinkertn@umich.edu def display(self, name, printmode = 'G'): 401881Sbinkertn@umich.edu import info 411881Sbinkertn@umich.edu 421881Sbinkertn@umich.edu if printmode == 'G': 431881Sbinkertn@umich.edu valformat = '%g' 441881Sbinkertn@umich.edu elif printmode != 'F' and value > 1e6: 451881Sbinkertn@umich.edu valformat = '%0.5e' 461881Sbinkertn@umich.edu else: 471881Sbinkertn@umich.edu valformat = '%f' 481881Sbinkertn@umich.edu 491881Sbinkertn@umich.edu for job in self.jobfile.jobs(): 501881Sbinkertn@umich.edu value = self.info.get(job, self.stat) 511881Sbinkertn@umich.edu if value is None: 521881Sbinkertn@umich.edu return 531881Sbinkertn@umich.edu 541881Sbinkertn@umich.edu if not isinstance(value, list): 551881Sbinkertn@umich.edu value = [ value ] 561881Sbinkertn@umich.edu 571881Sbinkertn@umich.edu if self.invert: 581881Sbinkertn@umich.edu for i,val in enumerate(value): 591881Sbinkertn@umich.edu if val != 0.0: 601881Sbinkertn@umich.edu value[i] = 1 / val 611881Sbinkertn@umich.edu 621881Sbinkertn@umich.edu valstring = ', '.join([ valformat % val for val in value ]) 631881Sbinkertn@umich.edu print '%-50s %s' % (job.name + ':', valstring) 641881Sbinkertn@umich.edu 652006Sbinkertn@umich.edu def graph(self, name, graphdir, proxy=None): 661915Sbinkertn@umich.edu from os.path import expanduser, isdir, join as joinpath 671881Sbinkertn@umich.edu from barchart import BarChart 681915Sbinkertn@umich.edu from matplotlib.numerix import Float, array, zeros 692006Sbinkertn@umich.edu import os, re, urllib 702006Sbinkertn@umich.edu from jobfile import crossproduct 711881Sbinkertn@umich.edu 721881Sbinkertn@umich.edu confgroups = self.jobfile.groups() 731881Sbinkertn@umich.edu ngroups = len(confgroups) 741881Sbinkertn@umich.edu skiplist = [ False ] * ngroups 752006Sbinkertn@umich.edu groupopts = [] 762006Sbinkertn@umich.edu baropts = [] 771881Sbinkertn@umich.edu groups = [] 781881Sbinkertn@umich.edu for i,group in enumerate(confgroups): 791881Sbinkertn@umich.edu if group.flags.graph_group: 802006Sbinkertn@umich.edu groupopts.append(group.subopts()) 811881Sbinkertn@umich.edu skiplist[i] = True 821881Sbinkertn@umich.edu elif group.flags.graph_bars: 832006Sbinkertn@umich.edu baropts.append(group.subopts()) 841881Sbinkertn@umich.edu skiplist[i] = True 851881Sbinkertn@umich.edu else: 861881Sbinkertn@umich.edu groups.append(group) 871881Sbinkertn@umich.edu 882185Sbinkertn@umich.edu has_group = bool(groupopts) 892185Sbinkertn@umich.edu if has_group: 902185Sbinkertn@umich.edu groupopts = [ group for group in crossproduct(groupopts) ] 912185Sbinkertn@umich.edu else: 922185Sbinkertn@umich.edu groupopts = [ None ] 931881Sbinkertn@umich.edu 942185Sbinkertn@umich.edu if baropts: 952185Sbinkertn@umich.edu baropts = [ bar for bar in crossproduct(baropts) ] 962185Sbinkertn@umich.edu else: 971881Sbinkertn@umich.edu raise AttributeError, 'No group selected for graph bars' 981881Sbinkertn@umich.edu 991881Sbinkertn@umich.edu directory = expanduser(graphdir) 1001915Sbinkertn@umich.edu if not isdir(directory): 1011915Sbinkertn@umich.edu os.mkdir(directory) 1022006Sbinkertn@umich.edu html = file(joinpath(directory, '%s.html' % name), 'w') 1031881Sbinkertn@umich.edu print >>html, '<html>' 1042006Sbinkertn@umich.edu print >>html, '<title>Graphs for %s</title>' % name 1051881Sbinkertn@umich.edu print >>html, '<body>' 1062006Sbinkertn@umich.edu html.flush() 1071881Sbinkertn@umich.edu 1081881Sbinkertn@umich.edu for options in self.jobfile.options(groups): 1092006Sbinkertn@umich.edu chart = BarChart(self) 1102006Sbinkertn@umich.edu 1111881Sbinkertn@umich.edu data = [ [ None ] * len(baropts) for i in xrange(len(groupopts)) ] 1121881Sbinkertn@umich.edu enabled = False 1131929Sbinkertn@umich.edu stacked = 0 1141881Sbinkertn@umich.edu for g,gopt in enumerate(groupopts): 1151881Sbinkertn@umich.edu for b,bopt in enumerate(baropts): 1162185Sbinkertn@umich.edu if gopt is None: 1172185Sbinkertn@umich.edu gopt = [] 1182006Sbinkertn@umich.edu job = self.jobfile.job(options + gopt + bopt) 1191915Sbinkertn@umich.edu if not job: 1201915Sbinkertn@umich.edu continue 1211881Sbinkertn@umich.edu 1222006Sbinkertn@umich.edu if proxy: 1232006Sbinkertn@umich.edu import db 1242006Sbinkertn@umich.edu proxy.dict['system'] = self.info[job.system] 1251881Sbinkertn@umich.edu val = self.info.get(job, self.stat) 1262006Sbinkertn@umich.edu if val is None: 1272006Sbinkertn@umich.edu print 'stat "%s" for job "%s" not found' % \ 1282006Sbinkertn@umich.edu (self.stat, job) 1292006Sbinkertn@umich.edu 1301929Sbinkertn@umich.edu if isinstance(val, (list, tuple)): 1311929Sbinkertn@umich.edu if len(val) == 1: 1321929Sbinkertn@umich.edu val = val[0] 1331929Sbinkertn@umich.edu else: 1341929Sbinkertn@umich.edu stacked = len(val) 1351881Sbinkertn@umich.edu 1361881Sbinkertn@umich.edu data[g][b] = val 1371881Sbinkertn@umich.edu 1381929Sbinkertn@umich.edu if stacked == 0: 1391929Sbinkertn@umich.edu for i in xrange(len(groupopts)): 1401929Sbinkertn@umich.edu for j in xrange(len(baropts)): 1411929Sbinkertn@umich.edu if data[i][j] is None: 1421929Sbinkertn@umich.edu data[i][j] = 0.0 1431929Sbinkertn@umich.edu else: 1441929Sbinkertn@umich.edu for i in xrange(len(groupopts)): 1451929Sbinkertn@umich.edu for j in xrange(len(baropts)): 1461929Sbinkertn@umich.edu val = data[i][j] 1471929Sbinkertn@umich.edu if val is None: 1482006Sbinkertn@umich.edu data[i][j] = [ 0.0 ] * stacked 1491929Sbinkertn@umich.edu elif len(val) != stacked: 1501929Sbinkertn@umich.edu raise ValueError, "some stats stacked, some not" 1511929Sbinkertn@umich.edu 1521915Sbinkertn@umich.edu data = array(data) 1531915Sbinkertn@umich.edu if data.sum() == 0: 1541915Sbinkertn@umich.edu continue 1551915Sbinkertn@umich.edu 1562185Sbinkertn@umich.edu dim = len(data.shape) 1572006Sbinkertn@umich.edu x = data.shape[0] 1582185Sbinkertn@umich.edu xkeep = [ i for i in xrange(x) if data[i].sum() != 0 ] 1592006Sbinkertn@umich.edu y = data.shape[1] 1602006Sbinkertn@umich.edu ykeep = [ i for i in xrange(y) if data[:,i].sum() != 0 ] 1612006Sbinkertn@umich.edu data = data.take(xkeep, axis=0) 1622006Sbinkertn@umich.edu data = data.take(ykeep, axis=1) 1632185Sbinkertn@umich.edu if not has_group: 1642185Sbinkertn@umich.edu data = data.take([ 0 ], axis=0) 1652006Sbinkertn@umich.edu chart.data = data 1661881Sbinkertn@umich.edu 1672185Sbinkertn@umich.edu 1682006Sbinkertn@umich.edu bopts = [ baropts[i] for i in ykeep ] 1692185Sbinkertn@umich.edu bdescs = [ ' '.join([o.desc for o in opt]) for opt in bopts] 1702006Sbinkertn@umich.edu 1712185Sbinkertn@umich.edu if has_group: 1722185Sbinkertn@umich.edu gopts = [ groupopts[i] for i in xkeep ] 1732185Sbinkertn@umich.edu gdescs = [ ' '.join([o.desc for o in opt]) for opt in gopts] 1742006Sbinkertn@umich.edu 1752006Sbinkertn@umich.edu if chart.legend is None: 1762006Sbinkertn@umich.edu if stacked: 1772006Sbinkertn@umich.edu try: 1782006Sbinkertn@umich.edu chart.legend = self.info.rcategories 1792006Sbinkertn@umich.edu except: 1802006Sbinkertn@umich.edu chart.legend = [ str(i) for i in xrange(stacked) ] 1812006Sbinkertn@umich.edu else: 1822006Sbinkertn@umich.edu chart.legend = bdescs 1832006Sbinkertn@umich.edu 1842006Sbinkertn@umich.edu if chart.xticks is None: 1852185Sbinkertn@umich.edu if has_group: 1862185Sbinkertn@umich.edu chart.xticks = gdescs 1872185Sbinkertn@umich.edu else: 1882185Sbinkertn@umich.edu chart.xticks = [] 1891881Sbinkertn@umich.edu chart.graph() 1901881Sbinkertn@umich.edu 1911881Sbinkertn@umich.edu names = [ opt.name for opt in options ] 1921881Sbinkertn@umich.edu descs = [ opt.desc for opt in options ] 1931881Sbinkertn@umich.edu 1942006Sbinkertn@umich.edu if names[0] == 'run': 1952006Sbinkertn@umich.edu names = names[1:] 1962006Sbinkertn@umich.edu descs = descs[1:] 1972006Sbinkertn@umich.edu 1982006Sbinkertn@umich.edu basename = '%s-%s' % (name, ':'.join(names)) 1991881Sbinkertn@umich.edu desc = ' '.join(descs) 2002006Sbinkertn@umich.edu 2012006Sbinkertn@umich.edu pngname = '%s.png' % basename 2022006Sbinkertn@umich.edu psname = '%s.eps' % re.sub(':', '-', basename) 2032006Sbinkertn@umich.edu epsname = '%s.ps' % re.sub(':', '-', basename) 2042006Sbinkertn@umich.edu chart.savefig(joinpath(directory, pngname)) 2052006Sbinkertn@umich.edu chart.savefig(joinpath(directory, epsname)) 2062006Sbinkertn@umich.edu chart.savefig(joinpath(directory, psname)) 2072006Sbinkertn@umich.edu html_name = urllib.quote(pngname) 2082006Sbinkertn@umich.edu print >>html, '''%s<br><img src="%s"><br>''' % (desc, html_name) 2092006Sbinkertn@umich.edu html.flush() 2101881Sbinkertn@umich.edu 2111881Sbinkertn@umich.edu print >>html, '</body>' 2121881Sbinkertn@umich.edu print >>html, '</html>' 2131881Sbinkertn@umich.edu html.close() 214