File size: 7,296 Bytes
1873be0
 
 
815b0dc
 
1873be0
d812604
815b0dc
 
2ca97e8
 
 
 
 
 
 
815b0dc
 
1873be0
 
 
bca2446
1873be0
 
 
815b0dc
1873be0
 
 
 
 
 
 
 
815b0dc
02532c0
2ca97e8
 
 
 
 
 
 
 
 
 
02532c0
 
 
bca2446
 
 
 
f6ae029
bca2446
f6ae029
bca2446
 
 
f6ae029
 
 
bca2446
 
 
 
f6ae029
 
bca2446
02532c0
 
f6ae029
 
 
2ca97e8
f6ae029
 
 
 
d812604
 
 
 
 
 
 
 
 
f6ae029
 
 
4be0753
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
815b0dc
 
 
 
 
 
 
1873be0
4be0753
 
 
 
376cfc2
4be0753
 
 
 
815b0dc
3ea1b9b
97e5503
2ca97e8
97e5503
1873be0
 
 
 
2ca97e8
1873be0
 
 
815b0dc
3ea1b9b
97e5503
2ca97e8
97e5503
1873be0
 
f6ae029
 
 
 
 
 
 
1873be0
 
02532c0
1873be0
f6ae029
 
 
 
 
 
1873be0
8b9e4a8
4be0753
 
 
 
 
 
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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
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() as demo:
    with gr.Tabs() as tab_container:
        with gr.TabItem("Overview", id="overview"):
            gr.Markdown(f"# Welcome to {competition_info.competition_name}! 👋")
            gr.Markdown(f"{competition_info.competition_description}")
            gr.Markdown("## Dataset")
            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", 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", 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]
        )