| from datetime import datetime |
| from functools import partial |
|
|
| import gradio as gr |
|
|
| from . import AUTOTRAIN_BACKEND_API, AUTOTRAIN_TOKEN, AUTOTRAIN_USERNAME, COMPETITION_ID, competition_info |
| from .errors import PastDeadlineError, SubmissionError, SubmissionLimitError |
| from .leaderboard import Leaderboard |
| from .submissions import Submissions |
| from .text import ( |
| NO_SUBMISSIONS, |
| SUBMISSION_LIMIT_REACHED, |
| SUBMISSION_SELECTION_TEXT, |
| SUBMISSION_SUCCESS, |
| SUBMISSION_TEXT, |
| ) |
|
|
|
|
| leaderboard = Leaderboard( |
| end_date=competition_info.end_date, |
| eval_higher_is_better=competition_info.eval_higher_is_better, |
| max_selected_submissions=competition_info.selection_limit, |
| competition_id=COMPETITION_ID, |
| autotrain_token=AUTOTRAIN_TOKEN, |
| ) |
|
|
| submissions = Submissions( |
| competition_id=competition_info.competition_id, |
| submission_limit=competition_info.submission_limit, |
| end_date=competition_info.end_date, |
| autotrain_username=AUTOTRAIN_USERNAME, |
| autotrain_token=AUTOTRAIN_TOKEN, |
| autotrain_backend_api=AUTOTRAIN_BACKEND_API, |
| ) |
|
|
|
|
| def _new_submission(user_token, submission_file): |
| try: |
| remaining_subs = submissions.new_submission(user_token, submission_file) |
| return SUBMISSION_SUCCESS.format(remaining_subs) |
| except SubmissionLimitError: |
| return SUBMISSION_LIMIT_REACHED |
| except SubmissionError: |
| return "Something went wrong. Please try again later." |
|
|
|
|
| def _my_submissions(user_token): |
| df = submissions.my_submissions(user_token) |
| if len(df) == 0: |
| return [ |
| gr.Markdown.update(visible=True, value=NO_SUBMISSIONS), |
| gr.DataFrame.update(visible=False), |
| gr.TextArea.update(visible=False), |
| gr.Button.update(visible=False), |
| ] |
| selected_submission_ids = df[df["selected"] == True]["submission_id"].values.tolist() |
| if len(selected_submission_ids) > 0: |
| return [ |
| gr.Markdown.update(visible=True), |
| gr.DataFrame.update(visible=True, value=df), |
| gr.TextArea.update(visible=True, value="\n".join(selected_submission_ids), interactive=True), |
| gr.Button.update(visible=True), |
| ] |
| return [ |
| gr.Markdown.update(visible=False), |
| gr.DataFrame.update(visible=True, value=df), |
| gr.TextArea.update(visible=True, interactive=True), |
| gr.Button.update(visible=True), |
| ] |
|
|
|
|
| def _update_selected_submissions(user_token, submission_ids): |
| submission_ids = submission_ids.split("\n") |
| submission_ids = [sid.strip() for sid in submission_ids] |
| submission_ids = [sid for sid in submission_ids if len(sid) > 0] |
| if len(submission_ids) > competition_info.selection_limit: |
| raise ValueError( |
| f"You can select only {competition_info.selection_limit} submissions. You selected {len(submission_ids)} submissions." |
| ) |
| try: |
| submissions.update_selected_submissions(user_token, submission_ids) |
| except PastDeadlineError: |
| return [ |
| gr.Markdown.update(visible=True, value="You can no longer select submissions after the deadline."), |
| gr.DataFrame.update(visible=False), |
| gr.TextArea.update(visible=False), |
| gr.Button.update(visible=False), |
| ] |
| return _my_submissions(user_token) |
|
|
|
|
| def _fetch_leaderboard(private): |
| if private: |
| current_date_time = datetime.now() |
| if current_date_time < competition_info.end_date: |
| return [ |
| gr.DataFrame.update(visible=False), |
| gr.Markdown.update( |
| visible=True, value="Private Leaderboard will be available after the competition ends" |
| ), |
| ] |
| df = leaderboard.fetch(private=private) |
| |
| num_teams = len(df) |
| return [ |
| gr.DataFrame.update(visible=True, value=df), |
| gr.Markdown.update(visible=True, value=f"Number of teams: {num_teams}"), |
| ] |
|
|
|
|
| with gr.Blocks(css=".tabitem {padding: 25px}") as demo: |
| with gr.Tabs() as tab_container: |
| with gr.TabItem("Overview", id="overview"): |
| gr.Markdown(f"{competition_info.competition_description}") |
| with gr.TabItem("Dataset", id="dataset_tab") as dataset_tab: |
| gr.Markdown(f"{competition_info.dataset_description}") |
| with gr.TabItem("Public Leaderboard", id="public_leaderboard") as public_leaderboard: |
| output_text_public = gr.Markdown() |
| output_df_public = gr.DataFrame( |
| row_count=(50, "dynamic"), overflow_row_behaviour="paginate", visible=False |
| ) |
| with gr.TabItem("Private Leaderboard", id="private_leaderboard") as private_leaderboard: |
| output_text_private = gr.Markdown() |
| output_df_private = gr.DataFrame( |
| row_count=(50, "dynamic"), overflow_row_behaviour="paginate", visible=False |
| ) |
| with gr.TabItem("New Submission", id="new_submission"): |
| gr.Markdown(SUBMISSION_TEXT.format(competition_info.submission_limit)) |
| user_token = gr.Textbox( |
| max_lines=1, value="", label="Please enter your Hugging Face token (read only)", type="password" |
| ) |
| uploaded_file = gr.File() |
| output_text = gr.Markdown(visible=True, show_label=False) |
| new_sub_button = gr.Button("Upload Submission") |
| new_sub_button.click( |
| fn=_new_submission, |
| inputs=[user_token, uploaded_file], |
| outputs=[output_text], |
| ) |
| with gr.TabItem("My Submissions", id="my_submissions"): |
| gr.Markdown(SUBMISSION_SELECTION_TEXT.format(competition_info.selection_limit)) |
| user_token = gr.Textbox( |
| max_lines=1, value="", label="Please enter your Hugging Face token (read only)", type="password" |
| ) |
| output_text = gr.Markdown(visible=True, show_label=False) |
| output_df = gr.DataFrame(visible=False) |
| selected_submissions = gr.TextArea( |
| visible=False, |
| label="Selected Submissions (one submission id per line)", |
| max_lines=competition_info.selection_limit, |
| lines=competition_info.selection_limit, |
| ) |
| update_selected_submissions = gr.Button("Update Selected Submissions", visible=False) |
| my_subs_button = gr.Button("Fetch Submissions") |
| my_subs_button.click( |
| fn=_my_submissions, |
| inputs=[user_token], |
| outputs=[output_text, output_df, selected_submissions, update_selected_submissions], |
| ) |
| update_selected_submissions.click( |
| fn=_update_selected_submissions, |
| inputs=[user_token, selected_submissions], |
| outputs=[output_text, output_df, selected_submissions, update_selected_submissions], |
| ) |
|
|
| fetch_lb_partial = partial(_fetch_leaderboard, private=False) |
| public_leaderboard.select(fetch_lb_partial, inputs=[], outputs=[output_df_public, output_text_public]) |
| fetch_lb_partial_private = partial(_fetch_leaderboard, private=True) |
| private_leaderboard.select( |
| fetch_lb_partial_private, inputs=[], outputs=[output_df_private, output_text_private] |
| ) |
|
|