File size: 6,344 Bytes
64fcb68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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