File size: 4,930 Bytes
d40e945
 
 
 
 
48445ab
 
 
1593f23
48445ab
1593f23
d40e945
 
2539abb
2e21b3e
2539abb
d40e945
 
2539abb
 
 
1593f23
2539abb
54bc519
 
2539abb
 
 
 
 
 
d40e945
 
2539abb
 
d40e945
 
 
c4f7417
2539abb
 
 
 
 
 
7128513
 
 
2539abb
 
 
c16154f
 
 
 
 
 
2539abb
c16154f
2539abb
 
48445ab
 
 
 
 
 
 
2e21b3e
 
 
 
2539abb
2e21b3e
 
 
 
 
 
48445ab
2539abb
2e21b3e
 
 
48445ab
2539abb
 
 
 
 
1593f23
2539abb
1593f23
2539abb
 
 
 
 
1593f23
 
 
 
 
 
 
2539abb
 
1593f23
 
2539abb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1593f23
2539abb
1593f23
 
 
5de65f5
1593f23
 
 
 
2539abb
 
4eba378
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
140
141
from .config import *
from .db import *
from .models import *

import pandas as pd

# for diff
leaderboard_df = {}
def get_leaderboard(reveal_prelim = False):
    global leaderboard_df

    conn = get_db()
    cursor = conn.cursor()
    sql = 'SELECT Name, Upvote, Downvote, name AS OrigName FROM model'
    prelim_votes = 300
    if not reveal_prelim: sql += ' WHERE (Upvote + Downvote) > '+ str(prelim_votes)
    cursor.execute(sql)
    data = cursor.fetchall()
    df = pd.DataFrame(data, columns=['Name', 'Upvote', 'Downvote', 'OrigName'])
    # df['License'] = df['Name'].map(model_license)
    df['Name'] = df['Name'].replace(model_names)
    for i in range(len(df)):
        df.loc[i, "Name"] = make_link_to_space(df['Name'][i], True)

    # Calculate total votes and win rate
    df['Votes'] = df['Upvote'] + df['Downvote']
    df['Win Rate'] = (df['Upvote'] / df['Votes'] * 100).round(1)
    # convert to string
    df['Win Rate'] = df['Win Rate'].astype(str) + '%'

    # df['Score'] = round((df['Upvote'] / df['Votes']) * 100, 2) # Percentage score

    ## ELO SCORE
    df['Elo'] = 1200
    df['Elo Diff'] = ""
    for i in range(len(df)):
        for j in range(len(df)):
            if i != j:
                try:
                    expected_a = 1 / (1 + 10 ** ((df['Elo'].iloc[j] - df['Elo'].iloc[i]) / 400))
                    expected_b = 1 / (1 + 10 ** ((df['Elo'].iloc[i] - df['Elo'].iloc[j]) / 400))
                    actual_a = df['Upvote'].iloc[i] / df['Votes'].iloc[i] if df['Votes'].iloc[i] > 0 else 0.5
                    actual_b = df['Upvote'].iloc[j] / df['Votes'].iloc[j] if df['Votes'].iloc[j] > 0 else 0.5
                    df.at[i, 'Elo'] += round(32 * (actual_a - expected_a))
                    df.at[j, 'Elo'] += round(32 * (actual_b - expected_b))
                except Exception as e:
                    print(f"Error in ELO calculation for rows {i} and {j}: {str(e)}")
                    continue

        # add link to vote dataset
        orig_name = df['OrigName'].iloc[i]
        if (
            DB_DATASET_ID != ''
            and '/' in orig_name
        ):
            style = 'text-decoration: underline;text-decoration-style: dotted; color: var(--link-text-color);'
            title = 'Rejections'
            # win rate dataset
            df.at[i, 'Win Rate'] = f'<a target="_blank" style="{style}" title="{title}" href="https://huggingface.co/datasets/{DB_DATASET_ID}/viewer/summary/rejections?f[rejected][value]=%27{orig_name}%27">' + df['Win Rate'].iloc[i] + '</a>'
    df['Elo'] = round(df['Elo'])
    df['Elo Diff'] = df['Elo']

    if (
        reveal_prelim == False
        and len(leaderboard_df) == 0
    ):
        leaderboard_df = df

    # Add ELO diff from startup
    try:
        if (reveal_prelim == False):
            for i in range(len(df)):
                elo_diff = (df['Elo'].iloc[i] - leaderboard_df['Elo'].iloc[i])
                if (elo_diff == 0):
                    continue
                if (elo_diff > 0):
                    plus = '<em style="color: green; font-family: monospace">+'
                else:
                    plus = '<em style="color: red; font-family: monospace">'

                df.at[i, 'Elo Diff'] = str(df['Elo'].iloc[i]) + plus + str(elo_diff) +'</em>'
    except:
        # FIXME: crashes when a TTS from premilinary results passes the vote threshold
        pass

    # Sort by ELO score and then by Vote count
    df = df.sort_values(by=['Elo', 'Votes'], ascending=[False, False])

    # last in model series from models.py
    last_series = []
    # medals
    def assign_medal(rank, model_series, last_series, assign):
        rank = str(rank + 1)
        if (
            assign
            # and last_series != ''
            # and model_series != last_series
        ):
            if rank == '1':
                rank += '🥇'
            elif rank == '2':
                rank += '🥈'
            elif rank == '3':
                rank += '🥉'

        if (model_series != last_series):
            last_series = model_series
        return '#'+ rank

    try:
        df['Order'] = [
            assign_medal(
                i,
                HF_SPACES[df['OrigName'].iloc[i]]['series'],
                last_series,
                not reveal_prelim and len(df) > 2
            ) for i in range(len(df))
        ]
    except:
        df['Order'] = [assign_medal(
            i,
            '',
            '',
            not reveal_prelim and len(df) > 2) for i in range(len(df))
        ]
        pass

    # fetch top_five
    for orig_name in df['OrigName']:
        if (
            reveal_prelim
            and len(top_five) < 5
            and orig_name not in top_five
            and orig_name in AVAILABLE_MODELS.keys()
        ):
            top_five.append(orig_name)

    df['Elo'] = df['Elo Diff']
    df = df[['Order', 'Name', 'Win Rate', 'Elo', 'Votes']]
    return df