File size: 5,792 Bytes
71be8a5
 
 
 
 
 
03b0173
 
 
 
3bf2770
 
 
 
03b0173
3bf2770
 
54708e8
3bf2770
54708e8
3bf2770
 
 
71be8a5
b4d728d
54708e8
03b0173
3bf2770
03b0173
 
 
3bf2770
71be8a5
03b0173
 
54708e8
03b0173
 
 
54708e8
03b0173
 
 
b4d728d
 
 
 
 
 
 
 
54708e8
 
 
 
 
 
03b0173
 
54708e8
 
 
 
3bf2770
 
03b0173
 
 
 
 
3bf2770
 
 
 
03b0173
54708e8
03b0173
71be8a5
b4d728d
71be8a5
 
03b0173
 
 
 
54708e8
 
b4d728d
54708e8
 
b4d728d
 
 
 
 
 
03b0173
54708e8
03b0173
54708e8
 
3bf2770
b4d728d
54708e8
03b0173
b4d728d
03b0173
 
54708e8
 
b4d728d
54708e8
3bf2770
54708e8
 
 
b4d728d
 
54708e8
 
 
 
b4d728d
54708e8
 
 
 
 
 
 
03b0173
 
54708e8
 
 
 
 
 
3bf2770
 
03b0173
3bf2770
 
03b0173
3bf2770
 
 
 
03b0173
 
 
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
152
"""Frontend Space entry: form + leaderboard view + queue.

v0.6: state lives on shared `/data` POSIX volume; this process is read-only
against the queue / results, and only ever writes via the atomic enqueue in
``src.submission.frontend``.
"""
from __future__ import annotations

import logging

import gradio as gr
import pandas as pd

from src.about import (
    ABOUT_TEXT,
    CITATION_BUTTON_LABEL,
    CITATION_BUTTON_TEXT,
    DATASET_LAYOUT_TEXT,
    INTRODUCTION_TEXT,
    SUBMIT_INSTRUCTIONS,
    TITLE,
)
from src.display.css_html_js import custom_css
from src.envs import ensure_data_layout
from src.populate import get_history_df, get_leaderboard_df, get_queue_df
from src.submission.frontend import submit_task
from src.tasks import TASKS

logging.basicConfig(level=logging.INFO,
                    format="%(asctime)s [%(levelname)s] %(name)s: %(message)s")
logger = logging.getLogger(__name__)

ensure_data_layout()


def _safe_lb(task_name: str) -> pd.DataFrame:
    try:
        return get_leaderboard_df(task_name)
    except Exception as e:
        logger.warning("leaderboard load failed for %s: %s", task_name, e)
        return pd.DataFrame()


def _safe_history(task_name: str) -> pd.DataFrame:
    try:
        return get_history_df(task_name)
    except Exception as e:
        logger.warning("history load failed for %s: %s", task_name, e)
        return pd.DataFrame()


def _safe_queue() -> pd.DataFrame:
    try:
        return get_queue_df()
    except Exception as e:
        logger.warning("queue load failed: %s", e)
        return pd.DataFrame()


def _on_submit(display_name, task_name, user_dataset):
    res = submit_task(display_name=display_name, task_name=task_name,
                      user_dataset=user_dataset)
    return res["message"], _safe_queue()


task_keys = list(TASKS.keys())
task_choices = [(TASKS[k].display_name, k) for k in task_keys]


demo = gr.Blocks(css=custom_css, title="PhysInOne Benchmark")
with demo:
    gr.HTML(TITLE)
    gr.Markdown(INTRODUCTION_TEXT, elem_classes="markdown-text")

    with gr.Tabs(elem_classes="tab-buttons"):
        # -------------------- Leaderboard --------------------
        with gr.TabItem("πŸ… Leaderboard", id=0):
            gr.Markdown(
                "Leaderboard data is refreshed infrequently. Please use the \"πŸ”„ Refresh\" button under each task to pull the latest results.",
                elem_classes="markdown-text",
            )
            for tk in task_keys:
                spec = TASKS[tk]
                with gr.Accordion(f"🎯 {spec.display_name}", open=True):
                    gr.Markdown(spec.description, elem_classes="markdown-text")
                    gr.Markdown("**Expected scene layout:**\n" + spec.expected_scene_layout)
                    lb = gr.Dataframe(value=_safe_lb(tk), interactive=False, wrap=True)
                    gr.Button("πŸ”„ Refresh", size="sm").click(
                        fn=lambda k=tk: _safe_lb(k), outputs=lb
                    )
                    with gr.Accordion("πŸ“œ All submissions (history)", open=False):
                        hist = gr.Dataframe(value=_safe_history(tk),
                                            interactive=False, wrap=True)
                        gr.Button("πŸ”„ Refresh History", size="sm").click(
                            fn=lambda k=tk: _safe_history(k), outputs=hist
                        )

        # -------------------- Submit --------------------
        with gr.TabItem("πŸš€ Submit", id=1):
            gr.Markdown(SUBMIT_INSTRUCTIONS, elem_classes="markdown-text")
            gr.Markdown(DATASET_LAYOUT_TEXT, elem_classes="markdown-text")
            with gr.Row():
                display_input = gr.Textbox(label="Display Name",
                                           placeholder="Awesome Team")
                task_input = gr.Dropdown(
                    label="Task", choices=task_choices,
                    value=task_keys[0] if task_keys else None,
                )
            ds_input = gr.Textbox(label="User dataset (username/repo)",
                                  placeholder="userA/my-results")
            submit_btn = gr.Button("Submit", variant="primary")
            submit_msg = gr.Markdown()

        # -------------------- Queue --------------------
        with gr.TabItem("πŸ“‹ Queue", id=2):
            gr.Markdown(
                "Recent submissions and their statuses. Status flow: `pending β†’ running β†’ done / failed`."
                " The queue **auto-refreshes every 15 seconds**; leaderboard tables require manual refresh.",
                elem_classes="markdown-text",
            )
            queue_table = gr.Dataframe(value=_safe_queue(), interactive=False, wrap=True)
            with gr.Row():
                gr.Button("πŸ”„ Refresh Now").click(fn=_safe_queue, outputs=queue_table)
            try:
                gr.Timer(value=15.0).tick(fn=_safe_queue, outputs=queue_table)
            except AttributeError:
                logger.warning("gr.Timer unavailable; falling back to manual refresh.")

        # -------------------- About --------------------
        with gr.TabItem("πŸ“ About", id=3):
            gr.Markdown(ABOUT_TEXT, elem_classes="markdown-text")

    submit_btn.click(
        fn=_on_submit,
        inputs=[display_input, task_input, ds_input],
        outputs=[submit_msg, queue_table],
    )

    with gr.Row():
        with gr.Accordion("πŸ“™ Citation", open=False):
            gr.Textbox(
                value=CITATION_BUTTON_TEXT,
                label=CITATION_BUTTON_LABEL,
                lines=10,
                elem_id="citation-button",
                show_copy_button=True,
            )


if __name__ == "__main__":
    demo.queue(default_concurrency_limit=8).launch()