Spaces:
Sleeping
Sleeping
| import matplotlib.pyplot as plt | |
| import pandas as pd | |
| def create_summary_page(df: pd.DataFrame, available_models: list[str]) -> plt.Figure: | |
| """Create a summary page with model names and both AMD/NVIDIA test stats bars.""" | |
| if df.empty: | |
| fig, ax = plt.subplots(figsize=(16, 8), facecolor='#000000') | |
| ax.set_facecolor('#000000') | |
| ax.text(0.5, 0.5, 'No data available', | |
| horizontalalignment='center', verticalalignment='center', | |
| transform=ax.transAxes, fontsize=20, color='#888888', | |
| fontfamily='monospace', weight='normal') | |
| ax.axis('off') | |
| return fig | |
| fig, ax = plt.subplots(figsize=(16, len(available_models) * 2.5 + 2), facecolor='#000000') | |
| ax.set_facecolor('#000000') | |
| colors = { | |
| 'passed': '#4CAF50', | |
| 'failed': '#E53E3E', | |
| 'skipped': '#FFD54F', | |
| 'error': '#8B0000', | |
| 'empty': "#5B5B5B" | |
| } | |
| visible_model_count = 0 | |
| max_y = 0 | |
| for i, model_name in enumerate(available_models): | |
| if model_name not in df.index: | |
| continue | |
| row = df.loc[model_name] | |
| # Get values directly from dataframe | |
| success_amd = int(row.get('success_amd', 0)) if pd.notna(row.get('success_amd', 0)) else 0 | |
| success_nvidia = int(row.get('success_nvidia', 0)) if pd.notna(row.get('success_nvidia', 0)) else 0 | |
| failed_multi_amd = int(row.get('failed_multi_no_amd', 0)) if pd.notna(row.get('failed_multi_no_amd', 0)) else 0 | |
| failed_multi_nvidia = int(row.get('failed_multi_no_nvidia', 0)) if pd.notna(row.get('failed_multi_no_nvidia', 0)) else 0 | |
| failed_single_amd = int(row.get('failed_single_no_amd', 0)) if pd.notna(row.get('failed_single_no_amd', 0)) else 0 | |
| failed_single_nvidia = int(row.get('failed_single_no_nvidia', 0)) if pd.notna(row.get('failed_single_no_nvidia', 0)) else 0 | |
| # Calculate stats | |
| amd_stats = { | |
| 'passed': success_amd, | |
| 'failed': failed_multi_amd + failed_single_amd, | |
| 'skipped': 0, | |
| 'error': 0 | |
| } | |
| nvidia_stats = { | |
| 'passed': success_nvidia, | |
| 'failed': failed_multi_nvidia + failed_single_nvidia, | |
| 'skipped': 0, | |
| 'error': 0 | |
| } | |
| amd_total = sum(amd_stats.values()) | |
| nvidia_total = sum(nvidia_stats.values()) | |
| if amd_total == 0 and nvidia_total == 0: | |
| continue | |
| # Position for this model - use visible model count for spacing | |
| y_base = (2.2 + visible_model_count) * 1.8 | |
| y_model_name = y_base # Model name above AMD bar | |
| y_amd_bar = y_base + 0.45 # AMD bar | |
| y_nvidia_bar = y_base + 0.97 # NVIDIA bar | |
| max_y = max(max_y, y_nvidia_bar + 0.5) | |
| # Model name centered above the AMD bar | |
| left_0 = 8 | |
| bar_length = 92 | |
| ax.text(bar_length / 2 + left_0, y_model_name, f"{i} - {y_model_name} - {model_name.lower()}", | |
| ha='center', va='center', color='#FFFFFF', | |
| fontsize=20, fontfamily='monospace', fontweight='bold') | |
| # AMD label and bar on the same level | |
| ax.text(left_0 - 2, y_amd_bar, "amd", ha='right', va='center', color='#CCCCCC', fontsize=18, fontfamily='monospace', fontweight='normal') | |
| if amd_total > 0: | |
| # AMD bar starts after labels | |
| left = left_0 | |
| for category in ['passed', 'failed', 'skipped', 'error']: | |
| if amd_stats[category] > 0: | |
| width = amd_stats[category] / amd_total * bar_length | |
| ax.barh(y_amd_bar, width, left=left, height=0.405, | |
| color=colors[category], alpha=0.9) | |
| if width > 4: | |
| ax.text(left + width/2, y_amd_bar, str(amd_stats[category]), | |
| ha='center', va='center', color='black', | |
| fontweight='bold', fontsize=12, fontfamily='monospace') | |
| left += width | |
| else: | |
| ax.barh(y_amd_bar, bar_length, left=left_0, height=0.405, color=colors['empty'], alpha=0.9) | |
| ax.text(left_0 + bar_length/2, y_amd_bar, "No data", ha='center', va='center', color='black', fontweight='bold', fontsize=12, fontfamily='monospace') | |
| # NVIDIA label and bar on the same level | |
| ax.text(left_0 - 2, y_nvidia_bar, "nvidia", ha='right', va='center', color='#CCCCCC', fontsize=18, fontfamily='monospace', fontweight='normal') | |
| if nvidia_total > 0: | |
| # NVIDIA bar starts after labels | |
| left = left_0 | |
| for category in ['passed', 'failed', 'skipped', 'error']: | |
| if nvidia_stats[category] > 0: | |
| width = nvidia_stats[category] / nvidia_total * bar_length | |
| ax.barh(y_nvidia_bar, width, left=left, height=0.405, | |
| color=colors[category], alpha=0.9) | |
| if width > 4: | |
| ax.text(left + width/2, y_nvidia_bar, str(nvidia_stats[category]), | |
| ha='center', va='center', color='black', | |
| fontweight='bold', fontsize=12, fontfamily='monospace') | |
| left += width | |
| else: | |
| ax.barh(y_nvidia_bar, bar_length, left=left_0, height=0.405, color=colors['empty'], alpha=0.9) | |
| ax.text(left_0 + bar_length/2, y_nvidia_bar, "No data", ha='center', va='center', color='black', fontweight='bold', fontsize=12, fontfamily='monospace') | |
| # Increment counter for next visible model | |
| visible_model_count += 1 | |
| # Style the axes to be completely invisible and span full width | |
| ax.set_xlim(0, 100) | |
| ax.set_ylim(0, max_y) | |
| ax.set_xlabel('') | |
| ax.set_ylabel('') | |
| ax.spines['bottom'].set_visible(False) | |
| ax.spines['left'].set_visible(False) | |
| ax.spines['top'].set_visible(False) | |
| ax.spines['right'].set_visible(False) | |
| ax.set_xticks([]) | |
| ax.set_yticks([]) | |
| ax.yaxis.set_inverted(True) | |
| # Remove all margins to make bars span full width | |
| plt.tight_layout() | |
| plt.subplots_adjust(left=0.02, right=0.98, top=0.98, bottom=0.02) | |
| return fig | |