File size: 8,447 Bytes
1873be0
 
 
815b0dc
 
1873be0
d812604
815b0dc
 
2ca97e8
 
 
 
 
 
 
815b0dc
 
1873be0
 
 
bca2446
1873be0
 
 
815b0dc
1873be0
 
 
 
 
 
 
 
815b0dc
02532c0
2ca97e8
 
 
 
 
 
 
 
 
 
02532c0
ac74837
02532c0
bca2446
 
 
ac74837
 
 
bca2446
f6ae029
bca2446
f6ae029
ac74837
 
bca2446
 
 
f6ae029
ac74837
 
 
f6ae029
 
bca2446
 
 
 
ac74837
 
 
f6ae029
 
bca2446
02532c0
 
f6ae029
 
 
2ca97e8
f6ae029
 
 
 
d812604
 
 
 
 
 
ac74837
d812604
 
 
f6ae029
 
 
4be0753
 
 
 
 
 
 
df36232
4be0753
 
 
adfae75
74236d8
4be0753
 
 
 
 
 
 
f39f071
815b0dc
 
 
f39f071
815b0dc
1873be0
4be0753
 
 
 
376cfc2
4be0753
 
 
 
815b0dc
53034cd
 
 
 
97e5503
af85c31
97e5503
1873be0
 
 
 
2ca97e8
1873be0
 
 
815b0dc
53034cd
97e5503
af85c31
97e5503
1873be0
ac74837
 
f6ae029
 
 
 
 
 
 
1873be0
 
02532c0
1873be0
ac74837
f6ae029
 
 
 
ac74837
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
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, failed_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.DataFrame.update(
                visible=True if len(failed_df) > 0 else False, value=failed_df if len(failed_df) > 0 else None
            ),
            gr.TextArea.update(visible=False),
            gr.Button.update(visible=False),
        ]
    selected_submission_ids = df[df["selected"] == True]["submission_id"].values.tolist()
    failed_selected_submission_ids = failed_df[failed_df["selected"] == True]["submission_id"].values.tolist()
    selected_submission_ids.extend(failed_selected_submission_ids)
    if len(selected_submission_ids) > 0:
        return [
            gr.Markdown.update(visible=True),
            gr.DataFrame.update(visible=True, value=df),
            gr.DataFrame.update(
                visible=True if len(failed_df) > 0 else False, value=failed_df if len(failed_df) > 0 else None
            ),
            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.DataFrame.update(
            visible=True if len(failed_df) > 0 else False, value=failed_df if len(failed_df) > 0 else None
        ),
        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.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=f"Private Leaderboard will be available on {competition_info.end_date} UTC."
                ),
            ]
    df = leaderboard.fetch(private=private)
    # df["name"] = df["name"].apply(make_clickable_user)
    # df.to_csv("public_leaderboard.csv" if not private else "private_leaderboard.csv", index=False)
    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"):
            if competition_info.submission_desc is None:
                gr.Markdown(SUBMISSION_TEXT.format(competition_info.submission_limit))
            else:
                gr.Markdown(f"{competition_info.submission_desc}")
            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, label="Succesful Submissions")
            failed_df = gr.DataFrame(visible=False, label="Failed Submissions")
            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, failed_df, selected_submissions, update_selected_submissions],
            )
            update_selected_submissions.click(
                fn=_update_selected_submissions,
                inputs=[user_token, selected_submissions],
                outputs=[output_text, output_df, failed_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]
        )