1*f8a1b7d9SAlexander Kabaev#!/usr/bin/python 2*f8a1b7d9SAlexander Kabaev 3*f8a1b7d9SAlexander Kabaevimport string 4*f8a1b7d9SAlexander Kabaevimport sys 5*f8a1b7d9SAlexander Kabaevimport re 6*f8a1b7d9SAlexander Kabaevimport os 7*f8a1b7d9SAlexander Kabaevimport platform 8*f8a1b7d9SAlexander Kabaevimport commands 9*f8a1b7d9SAlexander Kabaevfrom Numeric import * 10*f8a1b7d9SAlexander Kabaevfrom pychart import * 11*f8a1b7d9SAlexander Kabaevfrom xml.dom import minidom 12*f8a1b7d9SAlexander Kabaev 13*f8a1b7d9SAlexander Kabaevclass exception: 14*f8a1b7d9SAlexander Kabaev pass 15*f8a1b7d9SAlexander Kabaev 16*f8a1b7d9SAlexander Kabaev 17*f8a1b7d9SAlexander Kabaevdef comp_platform_info(compiler): 18*f8a1b7d9SAlexander Kabaev ret = '<ul>\n' 19*f8a1b7d9SAlexander Kabaev so = commands.getstatusoutput('cat /proc/cpuinfo | grep \'cpu MHz\'') 20*f8a1b7d9SAlexander Kabaev if so[0] == 0: 21*f8a1b7d9SAlexander Kabaev ret += '<li>CPU speed - %s</li>\n' % so[1] 22*f8a1b7d9SAlexander Kabaev so = commands.getstatusoutput('cat /proc/meminfo | grep \'MemTotal\'') 23*f8a1b7d9SAlexander Kabaev if so[0] == 0: 24*f8a1b7d9SAlexander Kabaev ret += '<li>Memory - %s</li>\n' % so[1] 25*f8a1b7d9SAlexander Kabaev ret += '<li>Platform - %s</li>\n' % platform.platform() 26*f8a1b7d9SAlexander Kabaev so = commands.getstatusoutput(compiler + ' --version') 27*f8a1b7d9SAlexander Kabaev if so[0] == 0: 28*f8a1b7d9SAlexander Kabaev ret += '<li>Compiler - %s</li>\n' % so[1] 29*f8a1b7d9SAlexander Kabaev ret += '</ul>\n' 30*f8a1b7d9SAlexander Kabaev return ret 31*f8a1b7d9SAlexander Kabaev 32*f8a1b7d9SAlexander Kabaev 33*f8a1b7d9SAlexander Kabaevclass res: 34*f8a1b7d9SAlexander Kabaev """ 35*f8a1b7d9SAlexander Kabaev A 'structure' representing the results of a test. 36*f8a1b7d9SAlexander Kabaev """ 37*f8a1b7d9SAlexander Kabaev def __init__(self, x_label, y_label, cntnr_list, cntnr_descs, res_sets): 38*f8a1b7d9SAlexander Kabaev self.x_label = x_label 39*f8a1b7d9SAlexander Kabaev self.y_label = y_label 40*f8a1b7d9SAlexander Kabaev self.cntnr_list = cntnr_list 41*f8a1b7d9SAlexander Kabaev self.cntnr_descs = cntnr_descs 42*f8a1b7d9SAlexander Kabaev self.res_sets = res_sets 43*f8a1b7d9SAlexander Kabaev 44*f8a1b7d9SAlexander Kabaev 45*f8a1b7d9SAlexander Kabaevclass res_getter: 46*f8a1b7d9SAlexander Kabaev """ 47*f8a1b7d9SAlexander Kabaev This class returns a res object for some test. 48*f8a1b7d9SAlexander Kabaev """ 49*f8a1b7d9SAlexander Kabaev class __sorter: 50*f8a1b7d9SAlexander Kabaev def __accum(self, results): 51*f8a1b7d9SAlexander Kabaev total = 0 52*f8a1b7d9SAlexander Kabaev for result in results: 53*f8a1b7d9SAlexander Kabaev total = total + result[1] 54*f8a1b7d9SAlexander Kabaev return total 55*f8a1b7d9SAlexander Kabaev 56*f8a1b7d9SAlexander Kabaev def sort(self, cntnr_list, res_sets): 57*f8a1b7d9SAlexander Kabaev cntnrs_and_totals = [] 58*f8a1b7d9SAlexander Kabaev for cntnr in cntnr_list: 59*f8a1b7d9SAlexander Kabaev results = res_sets[cntnr] 60*f8a1b7d9SAlexander Kabaev total = self.__accum(results) 61*f8a1b7d9SAlexander Kabaev cntnrs_and_totals.append((cntnr, total)) 62*f8a1b7d9SAlexander Kabaev by_total = lambda x,y: x[1] > y[1] and -1 or 1 63*f8a1b7d9SAlexander Kabaev cntnrs_and_totals.sort(by_total) 64*f8a1b7d9SAlexander Kabaev ret = [] 65*f8a1b7d9SAlexander Kabaev for cntnr_and_total in cntnrs_and_totals: 66*f8a1b7d9SAlexander Kabaev cntnr = cntnr_and_total[0] 67*f8a1b7d9SAlexander Kabaev ret.append(cntnr) 68*f8a1b7d9SAlexander Kabaev return ret 69*f8a1b7d9SAlexander Kabaev 70*f8a1b7d9SAlexander Kabaev def __init__(self, test_infos_f_name): 71*f8a1b7d9SAlexander Kabaev self.__test_to_container_res_sets = {} 72*f8a1b7d9SAlexander Kabaev self.__test_to_f_names = {} 73*f8a1b7d9SAlexander Kabaev tests_dat = minidom.parse(test_infos_f_name) 74*f8a1b7d9SAlexander Kabaev for test in tests_dat.getElementsByTagName('test'): 75*f8a1b7d9SAlexander Kabaev test_name = test.attributes['name'].value 76*f8a1b7d9SAlexander Kabaev self.__test_to_f_names[test_name] = test.getElementsByTagName('file')[0].attributes['name'].value 77*f8a1b7d9SAlexander Kabaev cntnr_list = [] 78*f8a1b7d9SAlexander Kabaev for cntnr in test.getElementsByTagName('cntnr'): 79*f8a1b7d9SAlexander Kabaev cntnr_list.append(cntnr.attributes['name'].value) 80*f8a1b7d9SAlexander Kabaev self.__test_to_container_res_sets[test_name] = cntnr_list 81*f8a1b7d9SAlexander Kabaev 82*f8a1b7d9SAlexander Kabaev def __get_label(self, tst_dat, label_name): 83*f8a1b7d9SAlexander Kabaev label = tst_dat.getElementsByTagName(label_name)[0].firstChild.data 84*f8a1b7d9SAlexander Kabaev label = string.strip(label, '\n') 85*f8a1b7d9SAlexander Kabaev label = string.strip(label) 86*f8a1b7d9SAlexander Kabaev return label 87*f8a1b7d9SAlexander Kabaev 88*f8a1b7d9SAlexander Kabaev def __parse_res_sets(self, f_name, cntnr_list): 89*f8a1b7d9SAlexander Kabaev tst_dat = minidom.parse(f_name) 90*f8a1b7d9SAlexander Kabaev x_label = self.__get_label(tst_dat, 'x_name') 91*f8a1b7d9SAlexander Kabaev y_label = self.__get_label(tst_dat, 'y_name') 92*f8a1b7d9SAlexander Kabaev parsed_container_list = tst_dat.getElementsByTagName('cntnr') 93*f8a1b7d9SAlexander Kabaev res_sets = {} 94*f8a1b7d9SAlexander Kabaev cntnr_descs = {} 95*f8a1b7d9SAlexander Kabaev for cntnr in parsed_container_list: 96*f8a1b7d9SAlexander Kabaev cntnr_name = cntnr.attributes["name"].value 97*f8a1b7d9SAlexander Kabaev res_sets[cntnr_name] = [] 98*f8a1b7d9SAlexander Kabaev for cntnr in parsed_container_list: 99*f8a1b7d9SAlexander Kabaev cntnr_name = cntnr.attributes["name"].value 100*f8a1b7d9SAlexander Kabaev cntnr_desc = cntnr.getElementsByTagName('desc') 101*f8a1b7d9SAlexander Kabaev if res_sets.has_key(cntnr_name): 102*f8a1b7d9SAlexander Kabaev res_set = [] 103*f8a1b7d9SAlexander Kabaev result_list = cntnr.getElementsByTagName('result') 104*f8a1b7d9SAlexander Kabaev for result in result_list: 105*f8a1b7d9SAlexander Kabaev x = string.atol(result.attributes["x"].value) 106*f8a1b7d9SAlexander Kabaev y = string.atof(result.attributes["y"].value) 107*f8a1b7d9SAlexander Kabaev res_set.append((x, y)) 108*f8a1b7d9SAlexander Kabaev res_sets[cntnr_name] = res_set 109*f8a1b7d9SAlexander Kabaev cntnr_descs[cntnr_name] = cntnr_desc[0] 110*f8a1b7d9SAlexander Kabaev return (x_label, y_label, cntnr_descs, res_sets) 111*f8a1b7d9SAlexander Kabaev 112*f8a1b7d9SAlexander Kabaev def get(self, res_dir, test_name): 113*f8a1b7d9SAlexander Kabaev cntnr_list = self.__test_to_container_res_sets[test_name] 114*f8a1b7d9SAlexander Kabaev f_name = res_dir + '/' + self.__test_to_f_names[test_name] 115*f8a1b7d9SAlexander Kabaev parsed = self.__parse_res_sets(f_name, cntnr_list) 116*f8a1b7d9SAlexander Kabaev x_label = parsed[0] 117*f8a1b7d9SAlexander Kabaev y_label = parsed[1] 118*f8a1b7d9SAlexander Kabaev cntnr_descs = parsed[2] 119*f8a1b7d9SAlexander Kabaev res_sets = parsed[3] 120*f8a1b7d9SAlexander Kabaev cntnr_list = self.__sorter().sort(cntnr_list, res_sets) 121*f8a1b7d9SAlexander Kabaev return res(x_label, y_label, cntnr_list, cntnr_descs, res_sets) 122*f8a1b7d9SAlexander Kabaev 123*f8a1b7d9SAlexander Kabaev 124*f8a1b7d9SAlexander Kabaevclass png_maker: 125*f8a1b7d9SAlexander Kabaev """ 126*f8a1b7d9SAlexander Kabaev This class creates a png file from a result set. 127*f8a1b7d9SAlexander Kabaev """ 128*f8a1b7d9SAlexander Kabaev class __style_chooser: 129*f8a1b7d9SAlexander Kabaev def __init__(self): 130*f8a1b7d9SAlexander Kabaev self.native_re = re.compile(r'n_(?:.*?)') 131*f8a1b7d9SAlexander Kabaev 132*f8a1b7d9SAlexander Kabaev self.native_tick_mark_0 = tick_mark.Circle(size = 4) 133*f8a1b7d9SAlexander Kabaev self.native_tick_mark_1 = tick_mark.Square(size = 4) 134*f8a1b7d9SAlexander Kabaev self.native_line_style_0 = line_style.T(color = color.black, width=2) 135*f8a1b7d9SAlexander Kabaev self.native_line_style_1 = line_style.T(color = color.black, width=2) 136*f8a1b7d9SAlexander Kabaev 137*f8a1b7d9SAlexander Kabaev self.mask_re = re.compile(r'mask(?:.*?)') 138*f8a1b7d9SAlexander Kabaev self.mod_re = re.compile(r'mod(?:.*?)') 139*f8a1b7d9SAlexander Kabaev 140*f8a1b7d9SAlexander Kabaev self.rb_tree_mmap_rb_tree_set_re = re.compile(r'rb_tree_mmap_rb_tree_set(?:.*?)') 141*f8a1b7d9SAlexander Kabaev self.rb_tree_mmap_lu_mtf_set_re = re.compile(r'rb_tree_mmap_lu_mtf_set(?:.*?)') 142*f8a1b7d9SAlexander Kabaev 143*f8a1b7d9SAlexander Kabaev self.splay_re = re.compile(r'splay(?:.*?)') 144*f8a1b7d9SAlexander Kabaev self.rb_tree_re = re.compile(r'rb_tree(?:.*?)') 145*f8a1b7d9SAlexander Kabaev self.ov_tree_re = re.compile(r'ov_tree(?:.*?)') 146*f8a1b7d9SAlexander Kabaev self.splay_tree_re = re.compile(r'splay_tree(?:.*?)') 147*f8a1b7d9SAlexander Kabaev 148*f8a1b7d9SAlexander Kabaev self.pat_trie_re = re.compile(r'pat_trie(?:.*?)') 149*f8a1b7d9SAlexander Kabaev 150*f8a1b7d9SAlexander Kabaev self.lc_1div8_1div2_re = re.compile(r'lc_1div8_1div2(?:.*?)') 151*f8a1b7d9SAlexander Kabaev self.lc_1div8_1div1_re = re.compile(r'lc_1div8_1div1(?:.*?)') 152*f8a1b7d9SAlexander Kabaev self.mcolc_1div2_re = re.compile(r'mcolc_1div2(?:.*?)') 153*f8a1b7d9SAlexander Kabaev 154*f8a1b7d9SAlexander Kabaev def choose(self, cntnr): 155*f8a1b7d9SAlexander Kabaev if self.native_re.search(cntnr): 156*f8a1b7d9SAlexander Kabaev if cntnr == 'n_pq_vector': 157*f8a1b7d9SAlexander Kabaev return (self.native_tick_mark_1, self.native_line_style_1) 158*f8a1b7d9SAlexander Kabaev 159*f8a1b7d9SAlexander Kabaev return (self.native_tick_mark_0, self.native_line_style_0) 160*f8a1b7d9SAlexander Kabaev 161*f8a1b7d9SAlexander Kabaev # tick_mark predefined 162*f8a1b7d9SAlexander Kabaev # square, circle3, dia, tri, dtri, star, plus5, x5, gray70dia, blackdtri, blackdia 163*f8a1b7d9SAlexander Kabaev if self.mask_re.search(cntnr): 164*f8a1b7d9SAlexander Kabaev clr = color.navy 165*f8a1b7d9SAlexander Kabaev elif self.mod_re.search(cntnr): 166*f8a1b7d9SAlexander Kabaev clr = color.green4 167*f8a1b7d9SAlexander Kabaev elif self.rb_tree_mmap_rb_tree_set_re.search(cntnr): 168*f8a1b7d9SAlexander Kabaev clr = color.mediumblue 169*f8a1b7d9SAlexander Kabaev tm = tick_mark.square 170*f8a1b7d9SAlexander Kabaev elif self.rb_tree_mmap_lu_mtf_set_re.search(cntnr) or cntnr == 'rc_binomial_heap': 171*f8a1b7d9SAlexander Kabaev clr = color.gray50 172*f8a1b7d9SAlexander Kabaev tm = tick_mark.dia 173*f8a1b7d9SAlexander Kabaev elif self.splay_tree_re.search(cntnr) or cntnr == 'binomial_heap': 174*f8a1b7d9SAlexander Kabaev clr = color.gray58 175*f8a1b7d9SAlexander Kabaev tm = tick_mark.tri 176*f8a1b7d9SAlexander Kabaev elif self.rb_tree_re.search(cntnr) or cntnr == 'binary_heap': 177*f8a1b7d9SAlexander Kabaev clr = color.red3 178*f8a1b7d9SAlexander Kabaev tm = tick_mark.dtri 179*f8a1b7d9SAlexander Kabaev elif self.ov_tree_re.search(cntnr) or cntnr == 'thin_heap': 180*f8a1b7d9SAlexander Kabaev clr = color.orangered1 181*f8a1b7d9SAlexander Kabaev tm = tick_mark.star 182*f8a1b7d9SAlexander Kabaev elif self.pat_trie_re.search(cntnr) or cntnr == 'pairing_heap': 183*f8a1b7d9SAlexander Kabaev clr = color.blueviolet 184*f8a1b7d9SAlexander Kabaev tm = tick_mark.plus5 185*f8a1b7d9SAlexander Kabaev else: 186*f8a1b7d9SAlexander Kabaev sys.stderr.write(cntnr + '\n') 187*f8a1b7d9SAlexander Kabaev raise exception 188*f8a1b7d9SAlexander Kabaev 189*f8a1b7d9SAlexander Kabaev # mask / mod 190*f8a1b7d9SAlexander Kabaev if cntnr.find('lc_1div8_1div') <> -1: 191*f8a1b7d9SAlexander Kabaev if cntnr.find('mask') <> -1: 192*f8a1b7d9SAlexander Kabaev # mask 193*f8a1b7d9SAlexander Kabaev if self.lc_1div8_1div2_re.search(cntnr): 194*f8a1b7d9SAlexander Kabaev if cntnr.find('nsth') <> -1: 195*f8a1b7d9SAlexander Kabaev tm = tick_mark.x5 196*f8a1b7d9SAlexander Kabaev else: 197*f8a1b7d9SAlexander Kabaev tm = tick_mark.gray70dia 198*f8a1b7d9SAlexander Kabaev if self.lc_1div8_1div1_re.search(cntnr): 199*f8a1b7d9SAlexander Kabaev if cntnr.find('nsth') <> -1: 200*f8a1b7d9SAlexander Kabaev tm = tick_mark.dia 201*f8a1b7d9SAlexander Kabaev else: 202*f8a1b7d9SAlexander Kabaev tm = tick_mark.circle3 203*f8a1b7d9SAlexander Kabaev else: 204*f8a1b7d9SAlexander Kabaev # mod 205*f8a1b7d9SAlexander Kabaev if self.lc_1div8_1div2_re.search(cntnr): 206*f8a1b7d9SAlexander Kabaev if cntnr.find('nsth') <> -1: 207*f8a1b7d9SAlexander Kabaev tm = tick_mark.tri 208*f8a1b7d9SAlexander Kabaev else: 209*f8a1b7d9SAlexander Kabaev tm = tick_mark.square 210*f8a1b7d9SAlexander Kabaev if self.lc_1div8_1div1_re.search(cntnr): 211*f8a1b7d9SAlexander Kabaev if cntnr.find('nsth') <> -1: 212*f8a1b7d9SAlexander Kabaev tm = tick_mark.dtri 213*f8a1b7d9SAlexander Kabaev else: 214*f8a1b7d9SAlexander Kabaev tm = tick_mark.star 215*f8a1b7d9SAlexander Kabaev 216*f8a1b7d9SAlexander Kabaev if self.mcolc_1div2_re.search(cntnr): 217*f8a1b7d9SAlexander Kabaev tm = tick_mark.circle3 218*f8a1b7d9SAlexander Kabaev 219*f8a1b7d9SAlexander Kabaev return (tm, line_style.T(color = clr, width = 2)) 220*f8a1b7d9SAlexander Kabaev 221*f8a1b7d9SAlexander Kabaev 222*f8a1b7d9SAlexander Kabaev def __init__(self): 223*f8a1b7d9SAlexander Kabaev self.__sc = self.__style_chooser() 224*f8a1b7d9SAlexander Kabaev self.__mmap_re = re.compile('mmap_') 225*f8a1b7d9SAlexander Kabaev 226*f8a1b7d9SAlexander Kabaev def __container_label_name(self, cntnr): 227*f8a1b7d9SAlexander Kabaev return self.__mmap_re.sub('\nmmap_\n', cntnr) 228*f8a1b7d9SAlexander Kabaev 229*f8a1b7d9SAlexander Kabaev def make(self, res, of_name): 230*f8a1b7d9SAlexander Kabaev theme.output_format = 'png' 231*f8a1b7d9SAlexander Kabaev theme.output_file = of_name 232*f8a1b7d9SAlexander Kabaev theme.scale_factor = 2 233*f8a1b7d9SAlexander Kabaev# theme.default_font_size = 5 234*f8a1b7d9SAlexander Kabaev theme.use_color = 1 235*f8a1b7d9SAlexander Kabaev theme.reinitialize() 236*f8a1b7d9SAlexander Kabaev y_tick_interval = self.__get_y_tics(res) 237*f8a1b7d9SAlexander Kabaev xaxis = axis.X(format = '/a90/hL%d', 238*f8a1b7d9SAlexander Kabaev tic_interval = 200, 239*f8a1b7d9SAlexander Kabaev label = res.x_label) 240*f8a1b7d9SAlexander Kabaev yaxis = axis.Y(format = '%.2e', 241*f8a1b7d9SAlexander Kabaev tic_interval = y_tick_interval, 242*f8a1b7d9SAlexander Kabaev label = res.y_label) 243*f8a1b7d9SAlexander Kabaev legend_lines = len(res.cntnr_list) 244*f8a1b7d9SAlexander Kabaev legend_vloc = 50 + (legend_lines * 10) 245*f8a1b7d9SAlexander Kabaev ar = area.T(x_axis = xaxis, y_axis = yaxis, 246*f8a1b7d9SAlexander Kabaev legend = legend.T(loc=(0,-legend_vloc), 247*f8a1b7d9SAlexander Kabaev frame_line_style=None, 248*f8a1b7d9SAlexander Kabaev inter_row_sep=2), 249*f8a1b7d9SAlexander Kabaev size=(240,110)) 250*f8a1b7d9SAlexander Kabaev plot_list = [] 251*f8a1b7d9SAlexander Kabaev for cntnr in res.cntnr_list: 252*f8a1b7d9SAlexander Kabaev style = self.__sc.choose(cntnr) 253*f8a1b7d9SAlexander Kabaev print cntnr 254*f8a1b7d9SAlexander Kabaev pl = line_plot.T(label = self.__container_label_name(cntnr), 255*f8a1b7d9SAlexander Kabaev data = res.res_sets[cntnr], 256*f8a1b7d9SAlexander Kabaev tick_mark = style[0], 257*f8a1b7d9SAlexander Kabaev line_style = style[1]) 258*f8a1b7d9SAlexander Kabaev plot_list.append(pl) 259*f8a1b7d9SAlexander Kabaev for plot in plot_list: 260*f8a1b7d9SAlexander Kabaev ar.add_plot(plot) 261*f8a1b7d9SAlexander Kabaev ar.draw() 262*f8a1b7d9SAlexander Kabaev 263*f8a1b7d9SAlexander Kabaev 264*f8a1b7d9SAlexander Kabaev def __get_y_tics(self, res): 265*f8a1b7d9SAlexander Kabaev mx = 0 266*f8a1b7d9SAlexander Kabaev for cntnr in res.cntnr_list: 267*f8a1b7d9SAlexander Kabaev m = max(d[1] for d in res.res_sets[cntnr]) 268*f8a1b7d9SAlexander Kabaev mx = max(m, mx) 269*f8a1b7d9SAlexander Kabaev return mx / 5 270*f8a1b7d9SAlexander Kabaev 271*f8a1b7d9SAlexander Kabaev 272*f8a1b7d9SAlexander Kabaev 273*f8a1b7d9SAlexander Kabaevdef make_tt(s): 274*f8a1b7d9SAlexander Kabaev return '<tt>' + s + '</tt>' 275*f8a1b7d9SAlexander Kabaev 276*f8a1b7d9SAlexander Kabaevdef make_b(s): 277*f8a1b7d9SAlexander Kabaev return '<b>' + s + '</b>' 278*f8a1b7d9SAlexander Kabaev 279*f8a1b7d9SAlexander Kabaevdef make_ttb(s): 280*f8a1b7d9SAlexander Kabaev return '<tt><b>' + s + '</b></tt>' 281*f8a1b7d9SAlexander Kabaev 282*f8a1b7d9SAlexander Kabaevdef make_i(s): 283*f8a1b7d9SAlexander Kabaev return '<i>' + s + '</i>' 284*f8a1b7d9SAlexander Kabaev 285*f8a1b7d9SAlexander Kabaevdef make_pb_ds_class_href(c_name): 286*f8a1b7d9SAlexander Kabaev return '<a href = "' + c_name + '.html">' + make_tt(c_name) + '</a>\n' 287*f8a1b7d9SAlexander Kabaev 288*f8a1b7d9SAlexander Kabaevdef build_value_to_pb_ds_class_href(s_desc): 289*f8a1b7d9SAlexander Kabaev value = s_desc.attributes['value'].value 290*f8a1b7d9SAlexander Kabaev ret = make_pb_ds_class_href(value) 291*f8a1b7d9SAlexander Kabaev return ret 292*f8a1b7d9SAlexander Kabaev 293*f8a1b7d9SAlexander Kabaevclass hash_desc_to_html_builder: 294*f8a1b7d9SAlexander Kabaev def build_specific_comb_hash_fn(self, s_desc): 295*f8a1b7d9SAlexander Kabaev comb_hash_fn_desc = s_desc.getElementsByTagName('Comb_Hash_Fn')[0] 296*f8a1b7d9SAlexander Kabaev ret = make_tt('Comb_Hash_Fn') 297*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' 298*f8a1b7d9SAlexander Kabaev ret = ret + build_value_to_pb_ds_class_href(comb_hash_fn_desc) 299*f8a1b7d9SAlexander Kabaev return ret 300*f8a1b7d9SAlexander Kabaev 301*f8a1b7d9SAlexander Kabaev def __build_nom_denom(self, s_desc): 302*f8a1b7d9SAlexander Kabaev nom_denom = s_desc.attributes['nom'].value + '/' + s_desc.attributes['denom'].value 303*f8a1b7d9SAlexander Kabaev return make_i(nom_denom) 304*f8a1b7d9SAlexander Kabaev 305*f8a1b7d9SAlexander Kabaev def __build_lc_trigger_desc(self, s_desc): 306*f8a1b7d9SAlexander Kabaev ret = build_value_to_pb_ds_class_href(s_desc) 307*f8a1b7d9SAlexander Kabaev ret = ret + ' with ' + make_i('α<sub>min</sub>') 308*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' + self.__build_nom_denom(s_desc.getElementsByTagName('alpha_min')[0]) 309*f8a1b7d9SAlexander Kabaev ret = ret + ' and ' + make_i('α<sub>max</sub>') 310*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' + self.__build_nom_denom(s_desc.getElementsByTagName('alpha_max')[0]) 311*f8a1b7d9SAlexander Kabaev return ret 312*f8a1b7d9SAlexander Kabaev 313*f8a1b7d9SAlexander Kabaev def build_specific_resize_policy(self, s_desc): 314*f8a1b7d9SAlexander Kabaev ret = make_tt('Resize_Policy') 315*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' 316*f8a1b7d9SAlexander Kabaev resize_policy_desc = s_desc.getElementsByTagName('Resize_Policy')[0] 317*f8a1b7d9SAlexander Kabaev ret = ret + build_value_to_pb_ds_class_href(resize_policy_desc) 318*f8a1b7d9SAlexander Kabaev ret = ret + ' with ' + make_tt('Size_Policy') 319*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' 320*f8a1b7d9SAlexander Kabaev size_policy_desc = resize_policy_desc.getElementsByTagName('Size_Policy')[0] 321*f8a1b7d9SAlexander Kabaev ret = ret + build_value_to_pb_ds_class_href(size_policy_desc) 322*f8a1b7d9SAlexander Kabaev ret = ret + ', and ' + make_tt('Trigger_Policy') 323*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' 324*f8a1b7d9SAlexander Kabaev trigger_policy_desc = resize_policy_desc.getElementsByTagName('Trigger_Policy')[0] 325*f8a1b7d9SAlexander Kabaev if trigger_policy_desc.attributes['value'].value == 'hash_load_check_resize_trigger': 326*f8a1b7d9SAlexander Kabaev ret = ret + self.__build_lc_trigger_desc(trigger_policy_desc) 327*f8a1b7d9SAlexander Kabaev else: 328*f8a1b7d9SAlexander Kabaev raise exception 329*f8a1b7d9SAlexander Kabaev return ret 330*f8a1b7d9SAlexander Kabaev 331*f8a1b7d9SAlexander Kabaev 332*f8a1b7d9SAlexander Kabaevclass cc_hash_desc_to_html_builder: 333*f8a1b7d9SAlexander Kabaev def __init__(self): 334*f8a1b7d9SAlexander Kabaev self.__hash_builder = hash_desc_to_html_builder() 335*f8a1b7d9SAlexander Kabaev 336*f8a1b7d9SAlexander Kabaev def build(self, s_desc): 337*f8a1b7d9SAlexander Kabaev ret = build_value_to_pb_ds_class_href(s_desc) 338*f8a1b7d9SAlexander Kabaev ret = ret + 'with ' + self.__hash_builder.build_specific_comb_hash_fn(s_desc) 339*f8a1b7d9SAlexander Kabaev ret = ret + ', and ' + self.__hash_builder.build_specific_resize_policy(s_desc) 340*f8a1b7d9SAlexander Kabaev return ret 341*f8a1b7d9SAlexander Kabaev 342*f8a1b7d9SAlexander Kabaev 343*f8a1b7d9SAlexander Kabaevclass gp_hash_desc_to_html_builder: 344*f8a1b7d9SAlexander Kabaev def __init__(self): 345*f8a1b7d9SAlexander Kabaev self.__hash_builder = hash_desc_to_html_builder() 346*f8a1b7d9SAlexander Kabaev 347*f8a1b7d9SAlexander Kabaev def build(self, s_desc): 348*f8a1b7d9SAlexander Kabaev ret = build_value_to_pb_ds_class_href(s_desc) 349*f8a1b7d9SAlexander Kabaev ret = ret + ' with ' + self.__hash_builder.build_specific_comb_hash_fn(s_desc) 350*f8a1b7d9SAlexander Kabaev ret = ret + ', ' + self.__hash_builder.build_specific_resize_policy(s_desc) 351*f8a1b7d9SAlexander Kabaev ret = ret + ', and ' + make_tt('Probe_Fn') 352*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' 353*f8a1b7d9SAlexander Kabaev probe_fn = s_desc.getElementsByTagName('Probe_Fn')[0].attributes['value'].value 354*f8a1b7d9SAlexander Kabaev ret = ret + make_pb_ds_class_href(probe_fn) 355*f8a1b7d9SAlexander Kabaev return ret 356*f8a1b7d9SAlexander Kabaev 357*f8a1b7d9SAlexander Kabaev 358*f8a1b7d9SAlexander Kabaevclass basic_tree_like_desc_to_html_builder: 359*f8a1b7d9SAlexander Kabaev def build_tag(self, s_desc): 360*f8a1b7d9SAlexander Kabaev ret = make_tt('Tag') 361*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' 362*f8a1b7d9SAlexander Kabaev tag_desc = s_desc.getElementsByTagName('Tag')[0] 363*f8a1b7d9SAlexander Kabaev ret = ret + build_value_to_pb_ds_class_href(tag_desc) 364*f8a1b7d9SAlexander Kabaev return ret 365*f8a1b7d9SAlexander Kabaev 366*f8a1b7d9SAlexander Kabaev def build_node_update(self, s_desc): 367*f8a1b7d9SAlexander Kabaev ret = make_tt('Node_Update') 368*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' 369*f8a1b7d9SAlexander Kabaev node_update_desc = s_desc.getElementsByTagName('Node_Update')[0] 370*f8a1b7d9SAlexander Kabaev ret = ret + build_value_to_pb_ds_class_href(node_update_desc) 371*f8a1b7d9SAlexander Kabaev return ret 372*f8a1b7d9SAlexander Kabaev 373*f8a1b7d9SAlexander Kabaev 374*f8a1b7d9SAlexander Kabaevclass basic_tree_desc_to_html_builder: 375*f8a1b7d9SAlexander Kabaev def __init__(self): 376*f8a1b7d9SAlexander Kabaev self.__tree_like_builder = basic_tree_like_desc_to_html_builder() 377*f8a1b7d9SAlexander Kabaev 378*f8a1b7d9SAlexander Kabaev def build(self, s_desc): 379*f8a1b7d9SAlexander Kabaev ret = build_value_to_pb_ds_class_href(s_desc) 380*f8a1b7d9SAlexander Kabaev ret = ret + ' with ' + self.__tree_like_builder.build_tag(s_desc) 381*f8a1b7d9SAlexander Kabaev ret = ret + ', and ' + self.__tree_like_builder.build_node_update(s_desc) 382*f8a1b7d9SAlexander Kabaev return ret 383*f8a1b7d9SAlexander Kabaev 384*f8a1b7d9SAlexander Kabaev 385*f8a1b7d9SAlexander Kabaevclass basic_trie_desc_to_html_builder: 386*f8a1b7d9SAlexander Kabaev def __init__(self): 387*f8a1b7d9SAlexander Kabaev self.__tree_like_builder = basic_tree_like_desc_to_html_builder() 388*f8a1b7d9SAlexander Kabaev 389*f8a1b7d9SAlexander Kabaev def build(self, s_desc): 390*f8a1b7d9SAlexander Kabaev ret = build_value_to_pb_ds_class_href(s_desc) 391*f8a1b7d9SAlexander Kabaev ret = ret + ' with ' + self.__tree_like_builder.build_tag(s_desc) 392*f8a1b7d9SAlexander Kabaev ret = ret + ', and ' + self.__tree_like_builder.build_node_update(s_desc) 393*f8a1b7d9SAlexander Kabaev return ret 394*f8a1b7d9SAlexander Kabaev 395*f8a1b7d9SAlexander Kabaevclass lu_desc_to_html_builder: 396*f8a1b7d9SAlexander Kabaev def build(self, s_desc): 397*f8a1b7d9SAlexander Kabaev ret = build_value_to_pb_ds_class_href(s_desc) 398*f8a1b7d9SAlexander Kabaev ret = ret + ' with ' + make_tt('Update_Policy') 399*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' 400*f8a1b7d9SAlexander Kabaev update_policy_desc = s_desc.getElementsByTagName('Update_Policy')[0] 401*f8a1b7d9SAlexander Kabaev ret = ret + build_value_to_pb_ds_class_href(update_policy_desc) 402*f8a1b7d9SAlexander Kabaev return ret 403*f8a1b7d9SAlexander Kabaev 404*f8a1b7d9SAlexander Kabaev 405*f8a1b7d9SAlexander Kabaevclass std_desc_to_html_builder: 406*f8a1b7d9SAlexander Kabaev def build(self, s_desc): 407*f8a1b7d9SAlexander Kabaev value = s_desc.attributes['value'].value 408*f8a1b7d9SAlexander Kabaev return make_tt(value.replace('std_', 'std::')) 409*f8a1b7d9SAlexander Kabaev 410*f8a1b7d9SAlexander Kabaev 411*f8a1b7d9SAlexander Kabaevclass std_tr1_desc_to_html_builder: 412*f8a1b7d9SAlexander Kabaev def build(self, s_desc): 413*f8a1b7d9SAlexander Kabaev value = s_desc.attributes['value'].value 414*f8a1b7d9SAlexander Kabaev ret = make_tt(value.replace('std_tr1_', 'std::tr1::')) 415*f8a1b7d9SAlexander Kabaev ret = ret + ' with ' + make_tt('cache_hash_code') 416*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' 417*f8a1b7d9SAlexander Kabaev cache_hash_code = s_desc.getElementsByTagName('cache_hash_code')[0].attributes['value'].value 418*f8a1b7d9SAlexander Kabaev ret = ret + make_ttb(cache_hash_code) 419*f8a1b7d9SAlexander Kabaev return ret 420*f8a1b7d9SAlexander Kabaev 421*f8a1b7d9SAlexander Kabaevclass gnucxx_desc_to_html_builder: 422*f8a1b7d9SAlexander Kabaev def build(self, s_desc): 423*f8a1b7d9SAlexander Kabaev value = s_desc.attributes['value'].value 424*f8a1b7d9SAlexander Kabaev return make_tt(value.replace('__gnucxx_', '__gnucxx::')) 425*f8a1b7d9SAlexander Kabaev 426*f8a1b7d9SAlexander Kabaevclass stdext_desc_to_html_builder: 427*f8a1b7d9SAlexander Kabaev def build(self, s_desc): 428*f8a1b7d9SAlexander Kabaev value = s_desc.attributes['value'].value 429*f8a1b7d9SAlexander Kabaev return make_tt(value.replace('stdext_', 'stdext::')) 430*f8a1b7d9SAlexander Kabaev 431*f8a1b7d9SAlexander Kabaevclass npq_desc_to_html_builder: 432*f8a1b7d9SAlexander Kabaev def build(self, vector): 433*f8a1b7d9SAlexander Kabaev if vector: 434*f8a1b7d9SAlexander Kabaev under = make_tt('std::vector') 435*f8a1b7d9SAlexander Kabaev else: 436*f8a1b7d9SAlexander Kabaev under = make_tt('std::deque') 437*f8a1b7d9SAlexander Kabaev 438*f8a1b7d9SAlexander Kabaev return make_tt('std::priority_queue') + ' adapting ' + under 439*f8a1b7d9SAlexander Kabaev 440*f8a1b7d9SAlexander Kabaevclass binary_heap_desc_to_html_builder: 441*f8a1b7d9SAlexander Kabaev def build(self, s_desc): 442*f8a1b7d9SAlexander Kabaev ret = make_pb_ds_class_href('priority_queue') 443*f8a1b7d9SAlexander Kabaev ret = ret + ' with ' + make_tt('Tag') 444*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' + make_pb_ds_class_href('binary_heap_tag') 445*f8a1b7d9SAlexander Kabaev return ret 446*f8a1b7d9SAlexander Kabaev 447*f8a1b7d9SAlexander Kabaevclass thin_heap_desc_to_html_builder: 448*f8a1b7d9SAlexander Kabaev def build(self, s_desc): 449*f8a1b7d9SAlexander Kabaev ret = make_pb_ds_class_href('priority_queue') 450*f8a1b7d9SAlexander Kabaev ret = ret + ' with ' + make_tt('Tag') 451*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' + make_pb_ds_class_href('thin_heap_tag') 452*f8a1b7d9SAlexander Kabaev return ret 453*f8a1b7d9SAlexander Kabaev 454*f8a1b7d9SAlexander Kabaevclass binomial_heap_desc_to_html_builder: 455*f8a1b7d9SAlexander Kabaev def build(self, s_desc): 456*f8a1b7d9SAlexander Kabaev ret = make_pb_ds_class_href('priority_queue') 457*f8a1b7d9SAlexander Kabaev ret = ret + ' with ' + make_tt('Tag') 458*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' + make_pb_ds_class_href('binomial_heap_tag') 459*f8a1b7d9SAlexander Kabaev return ret 460*f8a1b7d9SAlexander Kabaev 461*f8a1b7d9SAlexander Kabaevclass rc_binomial_heap_desc_to_html_builder: 462*f8a1b7d9SAlexander Kabaev def build(self, s_desc): 463*f8a1b7d9SAlexander Kabaev ret = make_pb_ds_class_href('priority_queue') 464*f8a1b7d9SAlexander Kabaev ret = ret + ' with ' + make_tt('Tag') 465*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' + make_pb_ds_class_href('rc_binomial_heap_tag') 466*f8a1b7d9SAlexander Kabaev return ret 467*f8a1b7d9SAlexander Kabaev 468*f8a1b7d9SAlexander Kabaevclass pairing_heap_desc_to_html_builder: 469*f8a1b7d9SAlexander Kabaev def build(self, s_desc): 470*f8a1b7d9SAlexander Kabaev ret = make_pb_ds_class_href('priority_queue') 471*f8a1b7d9SAlexander Kabaev ret = ret + ' with ' + make_tt('Tag') 472*f8a1b7d9SAlexander Kabaev ret = ret + ' = ' + make_pb_ds_class_href('pairing_heap_tag') 473*f8a1b7d9SAlexander Kabaev return ret 474*f8a1b7d9SAlexander Kabaev 475*f8a1b7d9SAlexander Kabaevclass legend_desc_builder: 476*f8a1b7d9SAlexander Kabaev """ 477*f8a1b7d9SAlexander Kabaev Returns a string corresponding to a specific container type. 478*f8a1b7d9SAlexander Kabaev """ 479*f8a1b7d9SAlexander Kabaev def __init__(self): 480*f8a1b7d9SAlexander Kabaev self.__cc_hash_builder = cc_hash_desc_to_html_builder() 481*f8a1b7d9SAlexander Kabaev self.__gp_hash_builder = gp_hash_desc_to_html_builder() 482*f8a1b7d9SAlexander Kabaev self.__basic_tree_builder = basic_tree_desc_to_html_builder() 483*f8a1b7d9SAlexander Kabaev self.__basic_trie_builder = basic_trie_desc_to_html_builder() 484*f8a1b7d9SAlexander Kabaev self.__lu_builder = lu_desc_to_html_builder() 485*f8a1b7d9SAlexander Kabaev self.__std_builder = std_desc_to_html_builder() 486*f8a1b7d9SAlexander Kabaev self.__std_tr1_builder = std_tr1_desc_to_html_builder() 487*f8a1b7d9SAlexander Kabaev self.__gnucxx_builder = gnucxx_desc_to_html_builder() 488*f8a1b7d9SAlexander Kabaev self.__stdext_builder = stdext_desc_to_html_builder() 489*f8a1b7d9SAlexander Kabaev self.__npq_builder = npq_desc_to_html_builder() 490*f8a1b7d9SAlexander Kabaev self.__thin_heap_builder = thin_heap_desc_to_html_builder() 491*f8a1b7d9SAlexander Kabaev self.__thin_heap_builder = thin_heap_desc_to_html_builder() 492*f8a1b7d9SAlexander Kabaev self.__binary_heap_builder = binary_heap_desc_to_html_builder() 493*f8a1b7d9SAlexander Kabaev self.__binomial_heap_builder = binomial_heap_desc_to_html_builder() 494*f8a1b7d9SAlexander Kabaev self.__rc_binomial_heap_builder = rc_binomial_heap_desc_to_html_builder() 495*f8a1b7d9SAlexander Kabaev self.__pairing_heap_builder = pairing_heap_desc_to_html_builder() 496*f8a1b7d9SAlexander Kabaev 497*f8a1b7d9SAlexander Kabaev def __build_specific(self, s_desc): 498*f8a1b7d9SAlexander Kabaev type = s_desc.attributes['value'].value 499*f8a1b7d9SAlexander Kabaev 500*f8a1b7d9SAlexander Kabaev if type == 'thin_heap': 501*f8a1b7d9SAlexander Kabaev return self.__thin_heap_builder.build(s_desc) 502*f8a1b7d9SAlexander Kabaev if type == 'binary_heap': 503*f8a1b7d9SAlexander Kabaev return self.__binary_heap_builder.build(s_desc) 504*f8a1b7d9SAlexander Kabaev if type == 'binomial_heap': 505*f8a1b7d9SAlexander Kabaev return self.__binomial_heap_builder.build(s_desc) 506*f8a1b7d9SAlexander Kabaev if type == 'rc_binomial_heap': 507*f8a1b7d9SAlexander Kabaev return self.__rc_binomial_heap_builder.build(s_desc) 508*f8a1b7d9SAlexander Kabaev if type == 'pairing_heap': 509*f8a1b7d9SAlexander Kabaev return self.__pairing_heap_builder.build(s_desc) 510*f8a1b7d9SAlexander Kabaev if type == 'cc_hash_table': 511*f8a1b7d9SAlexander Kabaev ret = self.__cc_hash_builder.build(s_desc) 512*f8a1b7d9SAlexander Kabaev elif type == 'gp_hash_table': 513*f8a1b7d9SAlexander Kabaev ret = self.__gp_hash_builder.build(s_desc) 514*f8a1b7d9SAlexander Kabaev elif type == 'tree': 515*f8a1b7d9SAlexander Kabaev ret = self.__basic_tree_builder.build(s_desc) 516*f8a1b7d9SAlexander Kabaev elif type == 'trie': 517*f8a1b7d9SAlexander Kabaev ret = self.__basic_trie_builder.build(s_desc) 518*f8a1b7d9SAlexander Kabaev elif type == 'list_update': 519*f8a1b7d9SAlexander Kabaev ret = self.__lu_builder.build(s_desc) 520*f8a1b7d9SAlexander Kabaev elif type == 'std::priority_queue_vector': 521*f8a1b7d9SAlexander Kabaev return self.__npq_builder.build(True) 522*f8a1b7d9SAlexander Kabaev elif type == 'std::priority_queue_deque': 523*f8a1b7d9SAlexander Kabaev return self.__npq_builder.build(False) 524*f8a1b7d9SAlexander Kabaev elif type == 'std_set' or type == 'std_map' or type == 'std_multimap': 525*f8a1b7d9SAlexander Kabaev return self.__std_builder.build(s_desc) 526*f8a1b7d9SAlexander Kabaev elif type == 'std_tr1_unordered_set' or type == 'std_tr1_unordered_map': 527*f8a1b7d9SAlexander Kabaev return self.__std_tr1_builder.build(s_desc) 528*f8a1b7d9SAlexander Kabaev elif type == 'stdext_hash_set' or type == 'stdext_hash_map' or type == 'stdext_hash_multimap': 529*f8a1b7d9SAlexander Kabaev return self.__stdext_builder.build(s_desc) 530*f8a1b7d9SAlexander Kabaev elif type == '__gnucxx_hash_set' or type == '__gnucxx_hash_map' or type == '__gnucxx_hash_multimap': 531*f8a1b7d9SAlexander Kabaev return self.__gnucxx_builder.build(s_desc) 532*f8a1b7d9SAlexander Kabaev else: 533*f8a1b7d9SAlexander Kabaev sys.stderr.write('cannot recognize %s\n' % type) 534*f8a1b7d9SAlexander Kabaev raise exception 535*f8a1b7d9SAlexander Kabaev return ret 536*f8a1b7d9SAlexander Kabaev 537*f8a1b7d9SAlexander Kabaev 538*f8a1b7d9SAlexander Kabaev def build(self, desc): 539*f8a1b7d9SAlexander Kabaev s_descs = desc.getElementsByTagName('type') 540*f8a1b7d9SAlexander Kabaev if s_descs.length == 0: 541*f8a1b7d9SAlexander Kabaev print desc.toxml() 542*f8a1b7d9SAlexander Kabaev raise exception 543*f8a1b7d9SAlexander Kabaev ret = '' 544*f8a1b7d9SAlexander Kabaev count = 0 545*f8a1b7d9SAlexander Kabaev for s_desc in s_descs: 546*f8a1b7d9SAlexander Kabaev if count > 0: 547*f8a1b7d9SAlexander Kabaev ret = ret + ', mapping each key to ' 548*f8a1b7d9SAlexander Kabaev ret = ret + self.__build_specific(s_desc) 549*f8a1b7d9SAlexander Kabaev count = count + 1 550*f8a1b7d9SAlexander Kabaev return ret 551*f8a1b7d9SAlexander Kabaev 552*f8a1b7d9SAlexander Kabaev 553*f8a1b7d9SAlexander Kabaevdef main(doc_dir, res_dir, test_infos_f_name, test_name, build_name): 554*f8a1b7d9SAlexander Kabaev res_gtr = res_getter(test_infos_f_name) 555*f8a1b7d9SAlexander Kabaev res = res_gtr.get(res_dir, test_name) 556*f8a1b7d9SAlexander Kabaev png_mkr = png_maker() 557*f8a1b7d9SAlexander Kabaev png_of_name = doc_dir + '/' + test_name + '_' + build_name + '.png' 558*f8a1b7d9SAlexander Kabaev print png_of_name 559*f8a1b7d9SAlexander Kabaev png_mkr.make(res, png_of_name) 560*f8a1b7d9SAlexander Kabaev 561*f8a1b7d9SAlexander Kabaev 562*f8a1b7d9SAlexander Kabaevif __name__ == "__main__": 563*f8a1b7d9SAlexander Kabaev """ 564*f8a1b7d9SAlexander Kabaev This module takes 6 parameters from the command line: 565*f8a1b7d9SAlexander Kabaev Docs directory 566*f8a1b7d9SAlexander Kabaev Results directory 567*f8a1b7d9SAlexander Kabaev Tests info XML file name 568*f8a1b7d9SAlexander Kabaev Test name 569*f8a1b7d9SAlexander Kabaev Build name 570*f8a1b7d9SAlexander Kabaev Compiler name 571*f8a1b7d9SAlexander Kabaev """ 572*f8a1b7d9SAlexander Kabaev usg = "make_graph.py <doc_dir> <res_dir> <test_info_file> <test_name> <build_name>\n" 573*f8a1b7d9SAlexander Kabaev if len(sys.argv) != 6: 574*f8a1b7d9SAlexander Kabaev sys.stderr.write(usg) 575*f8a1b7d9SAlexander Kabaev raise exception 576*f8a1b7d9SAlexander Kabaev main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5]) 577