File size: 3,361 Bytes
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
91
92
93
94
95
96
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 hyperlink(name, link):
    return f'<a target="_blank" href="{link}" style="color: var(--link-text-color); \
    text-decoration: underline;text-decoration-style: dotted;">{name}</a>'

def amend_model_name(name, rank):
    model_name = model_config[name].model_name
    if rank==1:
        return "πŸ₯‡ " + model_name
    elif rank==2:
        return "πŸ₯ˆ " + model_name
    elif rank==3:
        return 'πŸ₯‰ ' + model_name
    else:
        return model_name

def get_cfg_info(name):
    config = model_config[name]
    links = []
    if config.page_link:
        links.append(hyperlink("Page", config.page_link))
    if config.code_link:
        links.append(hyperlink("Code", config.code_link))
    return ", ".join(links) if links else "N/A", config.organization if config.organization else "N/A"

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
        
        values = [rank, amend_model_name(model_name, rank), 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))

        links, organization = get_cfg_info(model_name)
        # values.append(links)
        values.append(organization)
        
        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_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", "str", "str"] 
            + ["number"] * (len(leaderboard_df.columns) - 3) 
            + ["number", "str"],
        value = leaderboard_vals,
        height = 680,
        column_widths = [60, 140, 100] 
            + [120] * (len(leaderboard_df.columns) - 3) 
            + [120, 160],
        wrap = True,
    )
    return leaderboard