File size: 3,118 Bytes
f216956
 
 
 
 
 
 
 
 
 
 
 
e83848d
 
 
 
 
 
 
f216956
e83848d
f216956
e83848d
f216956
e83848d
f216956
e83848d
f216956
e83848d
f216956
 
 
 
 
 
 
 
 
 
e83848d
 
f216956
 
e83848d
f216956
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e83848d
f216956
 
 
 
 
 
e83848d
f216956
e83848d
f216956
 
e83848d
f216956
e83848d
f216956
e83848d
f216956
 
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
import argparse
import ast
import pickle
import os
import threading
import time

import gradio as gr
import numpy as np
import pandas as pd
from serve.model import model_config

def amend_model_name(config):
    if config.page_link:
        return '[' + config.model_name + '](' + config.page_link + ')'
    elif config.code_link:
        return '[' + config.model_name + '](' + config.page_link + ')'
    else:
        return config.model_name

def amend_rank(rank):
    if rank==1:
        return "πŸ₯‡"
    elif rank==2:
        return "πŸ₯ˆ"
    elif rank==3:
        return 'πŸ₯‰'
    else:
        return rank

def get_leaderboard_values(leaderboard_df):
    leaderboard_vals = []
    for i, row in leaderboard_df.iterrows():
        rank = i+1
        model_name = row["Method"]
        task = row["Task"]
        if model_name not in model_config.keys() or model_config[model_name].task != task:
            continue
        
        cfg = model_config[model_name]
        values = [amend_rank(rank), amend_model_name(cfg), task]
        values = values + [row.get(dim, np.NaN) for dim in leaderboard_df.columns[2:]]
        # values.append(round(np.sum([v for v in values[3:] if pd.notna(v)]), 4))
        values.append(cfg.organization if cfg.organization else "N/A")
        
        leaderboard_vals.append(values)
    return leaderboard_vals

def get_topk_ranks(df, k=3):
    ranks = {}
    for col_idx, col in enumerate(df.columns[2:]):  # skip "Model" β€œTask"
        topk = df[col].nlargest(k)
        for rank, idx in enumerate(topk.index):
            if idx not in ranks:
                ranks[idx] = {}
            ranks[idx][col_idx] = rank + 1  # 1-based rank
    for i in range(k): ranks[i][5] = i + 1
    return ranks  # dict: row -> {col: rank}

def build_leaderboard_tab(leaderboard_file: str, task: str = ""):
    if not isinstance(leaderboard_file, str):
        leaderboard_file = leaderboard_file.value
    if not isinstance(task, str):
        task = task.value

    df = pd.read_csv(leaderboard_file)
    if task in ["Text-to-3D only", "Image-to-3D only"]:
        df = df[df["Task"] == task.split()[0]]
        # df = df.drop(df[df["Task"]!=task.split()[0]].index)
    leaderboard_df = df.drop(df[df["Method"].isnull()].index)
    leaderboard_df = leaderboard_df.reset_index(drop=True)
    leaderboard_df = leaderboard_df.sort_values(by="Overall", ascending=False).reset_index(drop=True)

    leaderboard_vals = get_leaderboard_values(leaderboard_df)
    leaderboard = gr.Dataframe(
        headers = ['Rank', "πŸ€– Model", "πŸͺ§ Task" ] 
            + [f"{dim}" for dim in leaderboard_df.keys()[2:-1]] 
            + ["⭐ Overall", "πŸ›οΈ Orgnization"],     # "πŸ”— Links",
        datatype = ["number", "markdown", "markdown"] 
            + ["number"] * (len(leaderboard_df.columns) - 3) 
            + ["number", "markdown"],
        value = leaderboard_vals,
        height = 680,
        column_widths = [60, 120, 100] 
            + [120] * (len(leaderboard_df.columns) - 3) 
            + [120, 180],
        wrap = True,
        type="pandas",
    )
    return leaderboard