File size: 3,410 Bytes
881357e
 
96c29e4
 
9be823f
54bda52
 
d187930
30b8f34
c7a8a09
 
6d68931
881357e
 
c7a8a09
 
 
54bda52
881357e
c7a8a09
 
881357e
 
 
54bda52
881357e
 
30b8f34
9be823f
 
 
c35b4eb
 
9be823f
c7a8a09
 
54bda52
9be823f
c7a8a09
 
 
9be823f
 
 
c7a8a09
 
9be823f
 
c7a8a09
952f09b
c7a8a09
9be823f
 
c7a8a09
 
9be823f
c7a8a09
54bda52
9be823f
54bda52
c35b4eb
 
54bda52
9be823f
 
30b8f34
 
9be823f
 
30b8f34
 
96c29e4
 
30b8f34
96c29e4
30b8f34
96c29e4
 
 
30b8f34
c7a8a09
 
 
e6a31da
30b8f34
c7a8a09
 
 
30b8f34
6d68931
 
30b8f34
 
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
import pandas as pd

import gradio as gr

from src.about import Tasks
from src.display.columns import localize_dataset_leaderboard_df, localize_main_leaderboard_df
from src.display.formatting import has_no_nan_values, make_clickable_model
from src.display.dataset_readmes import get_dataset_readme_markdown
from src.display.i18n import t
from src.display.utils import AutoEvalColumn, get_dataset_metric_cols
from src.leaderboard.read_evals import get_dataset_metrics_for_row, get_stored_eval_rows
from src.leaderboard.sync import sync_results_from_hub


def get_leaderboard_df(cols: list, benchmark_cols: list) -> pd.DataFrame:
    rows = get_stored_eval_rows()
    if not rows:
        return localize_main_leaderboard_df(pd.DataFrame(columns=cols))

    display_rows = [{k: v for k, v in row.items() if not k.startswith("_")} for row in rows]
    df = pd.DataFrame.from_records(display_rows)
    df = df.sort_values(by=[AutoEvalColumn.average.name], ascending=False)
    df = df[cols].round(decimals=2)
    df = df[has_no_nan_values(df, benchmark_cols)]
    return localize_main_leaderboard_df(df)


def get_dataset_leaderboard_df(task_name: str) -> pd.DataFrame:
    task = Tasks[task_name]
    task_val = task.value
    metric_cols = get_dataset_metric_cols(task)
    columns = ["model", "team"] + metric_cols
    sort_col = metric_cols[0] if metric_cols else None

    rows = get_stored_eval_rows()
    if not rows:
        return localize_dataset_leaderboard_df(pd.DataFrame(columns=columns))

    dataset_rows = []
    for row in rows:
        dataset_score = row.get("_results", {}).get(task_val.benchmark)
        if dataset_score is None:
            continue

        metrics = get_dataset_metrics_for_row(row, task)
        if not any(v is not None for v in metrics.values()):
            continue

        dataset_row = {
            "model": make_clickable_model(row["_model"]),
            "team": row[AutoEvalColumn.team.name],
        }
        for col_name, value in metrics.items():
            dataset_row[col_name] = round(value, 2) if value is not None else None
        dataset_rows.append(dataset_row)

    if not dataset_rows:
        return localize_dataset_leaderboard_df(pd.DataFrame(columns=columns))

    df = pd.DataFrame.from_records(dataset_rows, columns=columns)
    if sort_col:
        df = df.sort_values(by=sort_col, ascending=False)
    return localize_dataset_leaderboard_df(df.reset_index(drop=True))


def get_dataset_info_markdown(task_name: str) -> str:
    return get_dataset_readme_markdown(task_name)


def get_empty_leaderboard_notice() -> str:
    return t("empty_leaderboard")


def get_empty_leaderboard_notice_update(main_df: pd.DataFrame):
    if main_df.empty:
        return gr.update(value=get_empty_leaderboard_notice(), visible=True)
    return gr.update(value="", visible=False)


def get_all_leaderboard_outputs():
    """Reload main and per-dataset tables from results/."""
    from src.display.utils import BENCHMARK_COLS, COLS

    main_df = get_leaderboard_df(COLS, BENCHMARK_COLS)
    dataset_dfs = [get_dataset_leaderboard_df(task.name) for task in Tasks]
    return (main_df, *dataset_dfs)


def reload_leaderboard_tables():
    """Reload all tables, syncing persisted results on HF Spaces first."""
    sync_results_from_hub()
    outputs = get_all_leaderboard_outputs()
    return (*outputs, get_empty_leaderboard_notice_update(outputs[0]))