File size: 5,098 Bytes
281711d
1c33a6b
281711d
 
 
2982a51
281711d
 
8efd41a
b20af37
b8be656
281711d
 
51aaefc
281711d
63bdadc
 
281711d
b20af37
 
 
 
 
 
 
 
956b725
 
 
2982a51
30bf457
 
b41b751
30bf457
2982a51
956b725
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1c33a6b
 
 
 
 
 
 
 
 
e8b7916
1e4ed96
 
6736504
956b725
63bdadc
2a5d0b4
 
1ff7bc3
2982a51
 
 
b8be656
2982a51
82c5741
 
 
281711d
 
20a6e65
 
 
63bdadc
20a6e65
 
 
1ff7bc3
63bdadc
1e4ed96
63bdadc
20a6e65
d6d49d1
6736504
 
d6d49d1
6736504
d6d49d1
20a6e65
b8be656
 
20a6e65
b8be656
 
 
e8b7916
1c33a6b
 
e8b7916
1e4ed96
e8b7916
 
1e4ed96
b8be656
82c5741
b8be656
 
 
1c33a6b
b8be656
 
 
e8b7916
1c33a6b
82c5741
 
1c33a6b
 
6736504
 
1c33a6b
 
 
 
 
d6d49d1
 
 
6736504
d6d49d1
281711d
 
 
 
 
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
import pathlib
from pathlib import Path
import tempfile
from typing import BinaryIO, Literal
import json
import pandas as pd

import gradio as gr
from datasets import load_dataset, Dataset
from huggingface_hub import upload_file, hf_hub_download
from gradio_leaderboard import ColumnFilter, Leaderboard, SelectColumns
from evaluation import evaluate_problem
from datetime import datetime
import os

from submit import submit_boundary
from about import PROBLEM_TYPES, TOKEN, CACHE_PATH, API, submissions_repo, results_repo

def read_boundary(filename):
    local_path = hf_hub_download(
        repo_id=submissions_repo,
        repo_type="dataset",
        filename=filename,
    )
    return local_path

def write_results(record, result):
    record.update(result)
    record['result_filename'] = record['submission_filename'].strip('.json') + '_results.json'
    record['evaluated'] = True
    if 'objectives' in record.keys():
        record['objective'] = record.pop('objectives')
        record['minimize_objective'] = True


    with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False) as tmp:
        json.dump(record, tmp, indent=2)
        tmp.flush()
        tmp_name = tmp.name
    
    API.upload_file(
            path_or_fileobj=tmp_name, 
            path_in_repo=record['result_filename'],
            repo_id=results_repo,
            repo_type="dataset",
            commit_message=f"Add result data for {record['result_filename']}"
        )
    
    pathlib.Path(tmp_name).unlink()
    return

def evaluate_boundary(filename):
    local_path = read_boundary(filename)
    with Path(local_path).open("r") as f:
        raw = f.read()
        data_dict = json.loads(raw)
    result = evaluate_problem(data_dict['problem_type'], local_path)
    write_results(data_dict, result)
    return

def get_user(profile: gr.OAuthProfile | None) -> str:
    if profile is None:
        return "Please login to submit a boundary for evaluation."
    return profile.username

def get_leaderboard():
    ds = load_dataset(results_repo, split='train')
    df = pd.DataFrame(ds)
    
    score_field = "score" if "score" in df.columns else "objective"  # fallback

    df = df.sort_values(by=score_field, ascending=True)
    return df

def show_output_box(message):
    return gr.Textbox.update(value=message, visible=True)

def gradio_interface() -> gr.Blocks:
    with gr.Blocks() as demo:
        with gr.Tabs(elem_classes="tab-buttons"):
            with gr.TabItem("Leaderboard", elem_id="boundary-benchmark-tab-table"):                
                gr.Markdown("# Boundary Design Leaderboard")
                leaderboard_df = get_leaderboard()

                Leaderboard(
                    value=leaderboard_df,
                    select_columns=["submission_time", "feasibility", "score", "objective", "user"],
                    search_columns=["submission_time", "score", "user"],
                    hide_columns=["result_filename", "submission_filename", "minimize_objective", "boundary_json", "evaluated"],
                    filter_columns=["problem_type", "submission_time"],
                )

                # def update_leaderboard(problem_type):
                #     return get_leaderboard(problem_type)
                
                # leaderboard_type.change(fn=update_leaderboard, inputs=leaderboard_type, outputs=leaderboard_df)

            with gr.TabItem("Submit", elem_id="boundary-benchmark-tab-table"):
                gr.Markdown(
                    """
                # Plasma Boundary Evaluation Submission
                Upload your plasma boundary JSON and select the problem type to get your score.
                """
                )
                user_state = gr.State(value=None) 
                filename = gr.State(value=None) 
                eval_state = gr.State(value=None) 

                gr.LoginButton()

                demo.load(get_user, inputs=None, outputs=user_state)

                with gr.Row():
                    problem_type = gr.Dropdown(PROBLEM_TYPES, label="Problem Type")
                    boundary_file = gr.File(label="Boundary JSON File (.json)")

                boundary_file
                message = gr.Textbox(label="Evaluation Result", lines=10, visible=False)
                submit_btn = gr.Button("Evaluate")
                submit_btn.click(
                    submit_boundary,
                    inputs=[problem_type, boundary_file, user_state],
                    outputs=[message, filename],
                ).then(
                    fn=show_output_box,
                    inputs=[message],
                    outputs=[message],
                )
                '''.then(
                    fn=evaluate_boundary,
                    inputs=[filename],
                    outputs=[eval_state]
                )
                .then(
                    fn=update_leaderboard,
                    inputs=[problem_type],
                    outputs=[leaderboard_df]
                )'''
 
    return demo


if __name__ == "__main__":
    gradio_interface().launch()