File size: 5,683 Bytes
0893185
d35349d
 
 
 
 
 
 
 
 
 
 
 
 
 
38ee4b2
d35349d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0893185
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d35349d
 
 
 
 
 
 
 
 
 
0893185
d35349d
 
 
 
 
 
 
 
 
 
 
 
 
 
0893185
d35349d
0893185
 
 
d35349d
 
 
 
0893185
 
d35349d
 
 
0893185
d35349d
 
 
 
 
 
 
 
 
 
 
 
 
 
b026a94
d35349d
 
 
 
0893185
d35349d
 
 
 
 
 
 
 
0893185
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151

import gradio as gr
import pandas as pd
from pathlib import Path

from src.json_leaderboard import create_leaderboard_df
from src.about import (
    CITATION_BUTTON_TEXT,
    INTRODUCTION_TEXT,
    LINKS_AND_INFO,
    TITLE,
)
from src.display.css_html_js import custom_css

# 固定列,永远在前面
FIXED_COLUMNS = ["Model Name (clickable)", "Release Date", "HF Model", "Open Source"]  

def get_json_df():
    """Load the leaderboard DataFrame"""
    json_path = Path(__file__).parent / "leaderboard_data.json"
    df = create_leaderboard_df(str(json_path))
    return df

# 提取大类及其子类
def extract_categories_and_subs(df):
    """
    返回 {大类: {"overall": 大类列, "subs": [子类列]}}
    大类列以 '-Overall' 结尾,紧跟其后的列为子类
    """
    category_dict = {}
    all_cols = list(df.columns)
    skip_cols = set(FIXED_COLUMNS + ["Overall"])

    i = 0
    while i < len(all_cols):
        col = all_cols[i]
        if col.endswith("-Overall") and col not in skip_cols:
            cat_name = col.replace("-Overall", "")
            subs = []
            j = i + 1
            while j < len(all_cols):
                next_col = all_cols[j]
                if next_col.endswith("-Overall") or next_col in skip_cols:
                    break
                subs.append(next_col)
                j += 1
            category_dict[cat_name] = {"overall": col, "subs": subs}
        i += 1
    return category_dict

def build_overall_tab_cols(df, categories):
    # Overall 页面希望把 Real/Game 的 '-Overall' 放在子项之后
    real = categories.get("Real-World", {"overall": None, "subs": []})
    game = categories.get("Game-World", {"overall": None, "subs": []})

    base = FIXED_COLUMNS.copy()
    rest = [c for c in df.columns if c not in base]

    ordered = base + ["Overall"]
    # real: 子项 -> overall
    ordered += [c for c in real.get("subs", []) if c in df.columns]
    if real.get("overall") in df.columns:
        ordered += [real["overall"]]
    # game: 子项 -> overall
    ordered += [c for c in game.get("subs", []) if c in df.columns]
    if game.get("overall") in df.columns:
        ordered += [game["overall"]]
    # 其它剩余列
    ordered += [c for c in rest if c not in ordered]
    return ordered

# 初始化
df = get_json_df()
ALL_COLUMNS_ORDERED = list(df.columns)
categories = extract_categories_and_subs(df)

# 可选列 = 全部列 - 固定列
optional_columns = [col for col in df.columns if col not in FIXED_COLUMNS]

# Gradio interface
demo = gr.Blocks(css=custom_css, title="UniREditBench Leaderboard")

with demo:
    gr.HTML(TITLE)
    gr.HTML(LINKS_AND_INFO)
    gr.Markdown(INTRODUCTION_TEXT, elem_classes="markdown-text")

    with gr.Tabs(elem_classes="tab-buttons") as tabs:
        # Overall leaderboard
        with gr.TabItem("🏅 Overall Leaderboard", elem_id="tab-overall"):
            selected_columns_overall = gr.CheckboxGroup(
                choices=optional_columns,
                label="Select additional columns to display",
                value=optional_columns
            )
            overall_cols = build_overall_tab_cols(df, categories)
            leaderboard_table = gr.Dataframe(
                value=df[overall_cols],
                headers=list(df[overall_cols].columns),
                datatype=["html" if col in ["Model Name (clickable)","HF Model"] else "str" for col in df[overall_cols].columns],
                interactive=False,
                wrap=False
            )
            selected_columns_overall.change(
                fn=lambda selected, d: d[[*FIXED_COLUMNS, *[c for c in d.columns if c in selected and c not in FIXED_COLUMNS]]],
                inputs=[selected_columns_overall, gr.State(value=df[overall_cols])],
                outputs=leaderboard_table
            )

        # 每个大类 leaderboard(保持 overall 在前,便于分组)
        for cat_name, info in categories.items():
            with gr.TabItem(f"🏆 {cat_name}", elem_id=f"tab-{cat_name}"):
                cat_cols = [info["overall"]] + info["subs"]
                cat_df = df[FIXED_COLUMNS + cat_cols]

                optional_columns_cat = [col for col in cat_cols if col not in FIXED_COLUMNS]
                selected_columns_cat = gr.CheckboxGroup(
                    choices=optional_columns_cat,
                    label=f"Select additional columns for {cat_name}",
                    value=optional_columns_cat
                )
                leaderboard_table_cat = gr.Dataframe(
                    value=cat_df,
                    headers=list(cat_df.columns),
                    datatype=["html" if col in ["Model Name (clickable)","HF Model"] else "str" for col in cat_df.columns],
                    interactive=False,
                    wrap=False
                )
                selected_columns_cat.change(
                    fn=lambda selected, d: d[[*FIXED_COLUMNS, *[c for c in d.columns if c in selected and c not in FIXED_COLUMNS]]],
                    inputs=[selected_columns_cat, gr.State(value=cat_df)],
                    outputs=leaderboard_table_cat
                )

    # Citation
    with gr.Row():
        with gr.Column():
            gr.Markdown("## 📙 Citation")
            gr.Markdown("If you use UniREditBench in your research, please cite our work:")
            citation_textbox = gr.Textbox(
                value=CITATION_BUTTON_TEXT,
                elem_id="citation-textbox",
                show_label=False,
                interactive=False,
                lines=8,
                show_copy_button=True
            )

if __name__ == "__main__":
    demo.launch()