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