tcid / summary_page.py
ror's picture
ror HF Staff
Re-structuration
64fcb68
raw
history blame
6.34 kB
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