File size: 4,551 Bytes
d35349d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import json
import pandas as pd
from pathlib import Path


def load_leaderboard_from_json(json_path="leaderboard_data.json"):
    """Load leaderboard data from JSON file"""
    try:
        with open(json_path, 'r', encoding='utf-8') as f:
            data = json.load(f)
        return data['leaderboard']
    except FileNotFoundError:
        print(f"JSON file {json_path} not found")
        return []
    except json.JSONDecodeError:
        print(f"Error decoding JSON file {json_path}")
        return []


def create_leaderboard_df(json_path="leaderboard_data.json"):
    """Create a pandas DataFrame from JSON leaderboard data"""
    leaderboard_data = load_leaderboard_from_json(json_path)
    
    if not leaderboard_data:
        return pd.DataFrame()
    
    # Convert to DataFrame
    df = pd.DataFrame(leaderboard_data)
    
    # Sort by ACC score (descending)
    df = df.sort_values('Overall', ascending=False).reset_index(drop=True)
    
    # Add ranking icons and make model names clickable links to papers
    def add_ranking_icon_and_link(index, model_name, paper_link):
        if index == 0:
            return f'🥇 <a href="{paper_link}" target="_blank">{model_name}</a>'
        elif index == 1:
            return f'🥈 <a href="{paper_link}" target="_blank">{model_name}</a>'
        elif index == 2:
            return f'🥉 <a href="{paper_link}" target="_blank">{model_name}</a>'
        else:
            return f'<a href="{paper_link}" target="_blank">{model_name}</a>'
    
    # Format the DataFrame for display
    display_df = pd.DataFrame({
    'Model': [add_ranking_icon_and_link(i, model, link) for i, (model, link) in enumerate(zip(df['model'], df['link']))],
    'Release Date': df['release_date'],
    'HF Model': df['hf'].apply(lambda x: f'<a href="{x}" target="_blank">🤗</a>' if x != "-" else "-"),
    'Open Source': df['open_source'].apply(lambda x: '✓' if x else '✗'),

    'Overall': df['Overall'].apply(lambda x: f"{x:.2f}"),

    'Style': df['Style'].apply(lambda x: f"{x:.2f}"),

    'World Knowledge': df['World Knowledge'].apply(lambda x: f"{x:.2f}"),
    'Logical Reasoning': df['Logical Reasoning'].apply(lambda x: f"{x:.2f}"),


    'Text': df['Text'].apply(lambda x: f"{x:.2f}"),



    'Attribute-Overall': df['Attribute-Overall'].apply(lambda x: f"{x:.2f}"),
    'Quantity': df['Quantity'].apply(lambda x: f"{x:.2f}"),
    'Expression': df['Expression'].apply(lambda x: f"{x:.2f}"),
    'Material': df['Material'].apply(lambda x: f"{x:.2f}"),
    'Size': df['Size'].apply(lambda x: f"{x:.2f}"),
    'Shape': df['Shape'].apply(lambda x: f"{x:.2f}"),
    'Color': df['Color'].apply(lambda x: f"{x:.2f}"),

    'Action-Overall': df['Action-Overall'].apply(lambda x: f"{x:.2f}"),
    'Hand': df['Hand'].apply(lambda x: f"{x:.2f}"),
    'Full body': df['Full body'].apply(lambda x: f"{x:.2f}"),
    'Animal': df['Animal'].apply(lambda x: f"{x:.2f}"),
    'Non Contact': df['Non Contact'].apply(lambda x: f"{x:.2f}"),
    'Contact': df['Contact'].apply(lambda x: f"{x:.2f}"),
    'State': df['State'].apply(lambda x: f"{x:.2f}"),
        
    'Relationship-Overall': df['Relationship-Overall'].apply(lambda x: f"{x:.2f}"),
    'Composition': df['Composition'].apply(lambda x: f"{x:.2f}"),
    'Similarity': df['Similarity'].apply(lambda x: f"{x:.2f}"),
    'Inclusion': df['Inclusion'].apply(lambda x: f"{x:.2f}"),
    'Comparison': df['Comparison'].apply(lambda x: f"{x:.2f}"),


    'Compound-Overall': df['Compound-Overall'].apply(lambda x: f"{x:.2f}"),
    'Imagination': df['Imagination'].apply(lambda x: f"{x:.2f}"),
    'Feature matching': df['Feature matching'].apply(lambda x: f"{x:.2f}"),


    'Grammar-Overall': df['Grammar-Overall'].apply(lambda x: f"{x:.2f}"),
    'Pronoun Reference': df['Pronoun Reference'].apply(lambda x: f"{x:.2f}"),
    'Consistency': df['Consistency'].apply(lambda x: f"{x:.2f}"),
    'Negation': df['Negation'].apply(lambda x: f"{x:.2f}"),


    'Layout-Overall': df['Layout-Overall'].apply(lambda x: f"{x:.2f}"),
    '2D': df['2D'].apply(lambda x: f"{x:.2f}"),
    '3D': df['3D'].apply(lambda x: f"{x:.2f}"),


})
    
    return display_df


def get_leaderboard_stats(json_path="leaderboard_data.json"):
    """Get statistics about the leaderboard"""
    leaderboard_data = load_leaderboard_from_json(json_path)
    
    if not leaderboard_data:
        return {}
    
    df = pd.DataFrame(leaderboard_data)
    
    stats = {
        'total_models': len(df),
        'open_source_models': df['open_source'].sum(),
    }
    
    return stats