1effccb7dSTang Haojinimport os.path as osp 2effccb7dSTang Haojinimport numpy as np 3effccb7dSTang Haojinimport matplotlib.pyplot as plt 4effccb7dSTang Haojinimport pandas as pd 5effccb7dSTang Haojinimport configs as cf 6effccb7dSTang Haojin 7effccb7dSTang Haojin 8effccb7dSTang Haojindef draw(): 9effccb7dSTang Haojin results = { 10effccb7dSTang Haojin 'XS': (cf.OUT_CSV, 'XS'), 11effccb7dSTang Haojin } 12effccb7dSTang Haojin 13effccb7dSTang Haojin configs = list(results.keys()) 14effccb7dSTang Haojin 15effccb7dSTang Haojin color_types = 10 16effccb7dSTang Haojin cmap = plt.get_cmap('tab10') 17effccb7dSTang Haojin color_index = np.arange(0, 1, 1.0 / color_types) 18effccb7dSTang Haojin colors = [cmap(c) for c in color_index] * 3 19effccb7dSTang Haojin hatches = [None] * color_types + ['//'] * color_types + ['|'] * color_types 20effccb7dSTang Haojin 21effccb7dSTang Haojin n_conf = len(configs) 22effccb7dSTang Haojin # Draw stacked bar chart for each simulator 23effccb7dSTang Haojin width = 0.8 / n_conf 24effccb7dSTang Haojin # set figure size: 25effccb7dSTang Haojin 26effccb7dSTang Haojin fig, ax = plt.subplots() 27effccb7dSTang Haojin fig.set_size_inches(8.0, 5.0) 28effccb7dSTang Haojin 29effccb7dSTang Haojin x = None 30effccb7dSTang Haojin have_set_label = False 31effccb7dSTang Haojin 32effccb7dSTang Haojin dfs = [pd.read_csv(result[0], index_col=0) 33effccb7dSTang Haojin for _, result in results.items()] 34effccb7dSTang Haojin common_bmk = list(set.intersection(*[set(df.index) for df in dfs])) 35effccb7dSTang Haojin dfs = [df.loc[common_bmk] for df in dfs] 36effccb7dSTang Haojin 37effccb7dSTang Haojin rename = True 38effccb7dSTang Haojin fine_grain_rename = False 39effccb7dSTang Haojin renamed_dfs = [] 40effccb7dSTang Haojin for df in dfs: 41effccb7dSTang Haojin to_drops = [] 42effccb7dSTang Haojin sorted_cols = [] 43effccb7dSTang Haojin 44effccb7dSTang Haojin def rename_with_map(df, rename_map): 45effccb7dSTang Haojin for k in rename_map: 46effccb7dSTang Haojin if rename_map[k] is not None: 47effccb7dSTang Haojin if rename_map[k].startswith('Merge'): 48effccb7dSTang Haojin merged = rename_map[k][5:] 49effccb7dSTang Haojin if merged not in df.columns: 50effccb7dSTang Haojin df[merged] = df[k] 51effccb7dSTang Haojin sorted_cols.append(merged) 52effccb7dSTang Haojin else: 53effccb7dSTang Haojin df[merged] += df[k] 54effccb7dSTang Haojin else: 55effccb7dSTang Haojin df[rename_map[k]] = df[k] 56effccb7dSTang Haojin sorted_cols.append(rename_map[k]) 57effccb7dSTang Haojin 58effccb7dSTang Haojin to_drops.append(k) 59effccb7dSTang Haojin else: 60effccb7dSTang Haojin sorted_cols.append(k) 61effccb7dSTang Haojin df.drop(columns=to_drops, inplace=True) 62effccb7dSTang Haojin 63effccb7dSTang Haojin # Merge df columns according to the rename map if value starting with 'Merge' 64effccb7dSTang Haojin if rename: 65effccb7dSTang Haojin if fine_grain_rename: 66effccb7dSTang Haojin rename_with_map(df, cf.xs_fine_grain_rename_map) 67effccb7dSTang Haojin else: 68effccb7dSTang Haojin rename_with_map(df, cf.xs_coarse_rename_map) 69effccb7dSTang Haojin 70effccb7dSTang Haojin icount = 20 * 10 ** 6 71effccb7dSTang Haojin if 'BadSpecInst' in df.columns: 72effccb7dSTang Haojin df['BadSpecInst'] += df['Base'] - icount 73effccb7dSTang Haojin else: 74effccb7dSTang Haojin df['BadSpecInst'] = df['Base'] - icount 75effccb7dSTang Haojin df['Base'] = icount 76effccb7dSTang Haojin 77effccb7dSTang Haojin df = df.astype(float) 78effccb7dSTang Haojin renamed_dfs.append(df) 79effccb7dSTang Haojin 80effccb7dSTang Haojin common_col = list(set.intersection( 81effccb7dSTang Haojin *[set(df.columns) for df in renamed_dfs])) 82effccb7dSTang Haojin unique_cols = set() 83effccb7dSTang Haojin for df in renamed_dfs: 84effccb7dSTang Haojin unique_col = set(df.columns) - set(common_col) 85effccb7dSTang Haojin for col in unique_col: 86effccb7dSTang Haojin unique_cols.add(col) 87effccb7dSTang Haojin for df in renamed_dfs: 88effccb7dSTang Haojin for col in unique_cols: 89effccb7dSTang Haojin if col not in df.columns: 90effccb7dSTang Haojin df[col] = 0.0 91effccb7dSTang Haojin df.sort_index(axis=1, inplace=True) 92effccb7dSTang Haojin 93effccb7dSTang Haojin put_to_front = ['Base', 'BadSpec'] 94effccb7dSTang Haojin 95effccb7dSTang Haojin tmp_df = renamed_dfs[0].sort_values(by='cpi', ascending=False) 96effccb7dSTang Haojin bmk_sort = tmp_df.index.tolist() 97effccb7dSTang Haojin 98effccb7dSTang Haojin for df in renamed_dfs: 99effccb7dSTang Haojin df = df.loc[bmk_sort] 100effccb7dSTang Haojin df = df[put_to_front + 101effccb7dSTang Haojin [col for col in df.columns if col not in put_to_front]] 102effccb7dSTang Haojin df = df.drop(columns=['cpi']) 103effccb7dSTang Haojin for to_drop in ['ipc', 'cpi', 'Cycles', 'Insts', 'coverage']: 104effccb7dSTang Haojin if to_drop in df.columns: 105effccb7dSTang Haojin df = df.drop(columns=[to_drop]) 106effccb7dSTang Haojin 107effccb7dSTang Haojin # draw stacked bar chart 108effccb7dSTang Haojin bottom = np.zeros(len(df)) 109effccb7dSTang Haojin highest = 0.0 110effccb7dSTang Haojin if x is None: 111effccb7dSTang Haojin x = np.arange(len(df), dtype=float) 112effccb7dSTang Haojin for component, color, hatch in zip(df.columns, colors[:len(df.columns)], hatches[:len(df.columns)]): 113effccb7dSTang Haojin if have_set_label: 114effccb7dSTang Haojin label = None 115effccb7dSTang Haojin else: 116effccb7dSTang Haojin label = component 117effccb7dSTang Haojin ax.bar(x, df[component], bottom=bottom, 118effccb7dSTang Haojin width=width, color=color, label=label, edgecolor='black', hatch=hatch) 119effccb7dSTang Haojin highest = max((bottom + df[component]).max(), highest) 120effccb7dSTang Haojin bottom += df[component] 121effccb7dSTang Haojin x += width 122effccb7dSTang Haojin have_set_label = True 123effccb7dSTang Haojin # replace x tick labels with df.index with rotation 124effccb7dSTang Haojin ax.set_xticks(x - width * len(results) / n_conf - 0.25) 125effccb7dSTang Haojin ax.set_xticklabels(bmk_sort, rotation=90) 126effccb7dSTang Haojin ax.tick_params(left=False, bottom=False) 127effccb7dSTang Haojin ax.set_ylabel('Slots') 128effccb7dSTang Haojin ax.set_xlabel('SPECCPU 2006 Benchmarks') 129effccb7dSTang Haojin 130effccb7dSTang Haojin handles, labels = plt.gca().get_legend_handles_labels() 131*03a1a638SZakilim ax.legend(list(reversed(handles)), list(reversed(labels)), fancybox=True, 132effccb7dSTang Haojin framealpha=0.3, 133effccb7dSTang Haojin loc='best', 134effccb7dSTang Haojin ncol=3, 135effccb7dSTang Haojin ) 136effccb7dSTang Haojin if n_conf == 2: 137effccb7dSTang Haojin ax.set_title(f'{configs[0]} <-- VS. --> {configs[1]}') 138effccb7dSTang Haojin 139effccb7dSTang Haojin fig.savefig(osp.join('results', 'result.png'), 140effccb7dSTang Haojin bbox_inches='tight', pad_inches=0.05, dpi=200) 141