Spaces:
Running
Running
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()
|