File size: 9,356 Bytes
7ddc8cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f1ae266
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
import pandas as pd
import plotly.graph_objects as go

from src.analytics import (
    BENCHMARK_CATALOG,
    benchmark_category,
    benchmarks_for_category,
    cross_benchmark_ranking_df,
    enrich_analysis_df,
    filter_category,
    matrix_df,
    ranking_df,
)
from src.charts import create_coverage_matrix_plot, create_matrix_plot, create_tradeoff_plot


def frame():
    return pd.DataFrame(
        [
            {
                "Benchmark": "SWE-Bench Verified", "Model": "a", "Harness": "h", "Run Label": "a / h",
                "Category": "FOSS", "Score": .8, "Score (%)": 80, "Tasks": 10, "Errors": 1,
                "Input Tokens Per Task": 50, "Cache Tokens Per Task": 10, "Output Tokens Per Task": 20,
                "Total Tokens Per Task": 80, "Tokens Per Solved Task": 100, "Cost Per Task": .2,
                "Total Time Per Task": 10, "Agent Time Per Task": 8, "Token Data Available": True,
            },
            {
                "Benchmark": "SWE-Bench Verified", "Model": "b", "Harness": "h", "Run Label": "b / h",
                "Category": "FOSS", "Score": .4, "Score (%)": 40, "Tasks": 10, "Errors": 2,
                "Input Tokens Per Task": 90, "Cache Tokens Per Task": None, "Output Tokens Per Task": 30,
                "Total Tokens Per Task": 120, "Tokens Per Solved Task": 300, "Cost Per Task": .1,
                "Total Time Per Task": 20, "Agent Time Per Task": 15, "Token Data Available": True,
            },
            {
                "Benchmark": "Terminal Bench 2.0", "Model": "a", "Harness": "h", "Run Label": "a / h",
                "Category": "FOSS", "Score": .2, "Score (%)": 20, "Tasks": 10, "Errors": 0,
                "Input Tokens Per Task": 30, "Cache Tokens Per Task": 5, "Output Tokens Per Task": 10,
                "Total Tokens Per Task": 45, "Tokens Per Solved Task": 225, "Cost Per Task": .3,
                "Total Time Per Task": 30, "Agent Time Per Task": 25, "Token Data Available": True,
            },
            {
                "Benchmark": "Terminal Bench 2.0", "Model": "c", "Harness": "h", "Run Label": "c / h",
                "Category": "FOSS", "Score": .9, "Score (%)": 90, "Tasks": 10, "Errors": None,
                "Input Tokens Per Task": None, "Cache Tokens Per Task": None, "Output Tokens Per Task": None,
                "Total Tokens Per Task": None, "Tokens Per Solved Task": None, "Cost Per Task": None,
                "Total Time Per Task": None, "Agent Time Per Task": None, "Token Data Available": False,
            },
            {
                "Benchmark": "New Benchmark", "Model": "z", "Harness": "h", "Run Label": "z / h",
                "Category": "FOSS", "Score": .5, "Score (%)": 50, "Tasks": 10, "Errors": 0,
                "Input Tokens Per Task": 1, "Cache Tokens Per Task": 1, "Output Tokens Per Task": 1,
                "Total Tokens Per Task": 3, "Tokens Per Solved Task": 6, "Cost Per Task": .01,
                "Total Time Per Task": 1, "Agent Time Per Task": 1, "Token Data Available": True,
            },
        ]
    )


def test_benchmark_catalog_and_unknown_fallback():
    assert benchmark_category("SWE-Bench Verified") == "Coding"
    assert benchmark_category("Terminal Bench 2.0") == "Generalist"
    assert benchmark_category("Shellbench") == "Generalist"
    assert benchmark_category("New Benchmark") == "Other"
    assert "SWE-Bench Pro -- Ansible" in BENCHMARK_CATALOG


def test_category_filtering_keeps_unknown_visible_as_other():
    df = frame()
    assert set(benchmarks_for_category(df, "Coding")) == {"SWE-Bench Verified"}
    assert set(filter_category(df, "Generalist")["Benchmark"]) == {"Terminal Bench 2.0"}
    assert set(filter_category(df, "Other")["Benchmark"]) == {"New Benchmark"}


def test_derived_reliability_and_per_success_metrics():
    df = enrich_analysis_df(frame())
    first = df.iloc[0]
    assert first["Execution Error Rate (%)"] == 10
    assert first["Tokens Per Successful Task"] == 100
    assert first["Cost Per Successful Task"] == .25
    assert first["Time Per Successful Task"] == 12.5
    assert pd.isna(df.loc[df["Model"].eq("c"), "Execution Error Rate (%)"]).all()


def test_within_benchmark_percentile_and_rank():
    df = enrich_analysis_df(frame())
    coding = df[df["Benchmark"] == "SWE-Bench Verified"].set_index("Model")
    assert coding.loc["a", "Within-Benchmark Rank"] == 1
    assert coding.loc["b", "Within-Benchmark Rank"] == 2
    assert coding.loc["a", "Within-Benchmark Percentile"] == 100
    assert coding.loc["b", "Within-Benchmark Percentile"] == 0


def test_cross_benchmark_ordering_uses_normalization_and_coverage_threshold():
    df = frame()
    ranked = cross_benchmark_ranking_df(df, minimum_coverage=0.5)
    a = ranked[ranked["Model"] == "a"].iloc[0]
    assert a["Benchmarks Covered"] == 2
    assert a["Eligible Benchmarks"] == 3
    assert a["Normalized Performance"] == 50
    strict = cross_benchmark_ranking_df(df, minimum_coverage=1.0)
    assert strict.empty


def test_token_ranking_excludes_missing_and_orders_lower_first():
    ranked = ranking_df(frame(), "Total tokens", benchmark="Terminal Bench 2.0")
    assert ranked["Model"].tolist() == ["a"]


def test_score_rank_and_metric_matrices_preserve_missing_cells():
    df = frame()
    score = matrix_df(df, "Score")
    rank = matrix_df(df, "Within-benchmark rank")
    cost = matrix_df(df, "Cost")
    assert pd.isna(score.loc["b / h", "Terminal Bench 2.0"])
    assert rank.loc["a / h", "SWE-Bench Verified"] == 1
    assert pd.isna(cost.loc["c / h", "Terminal Bench 2.0"])


def test_coverage_matrix_uses_missing_not_zero_score():
    matrix = matrix_df(frame(), "Coverage")
    assert matrix.loc["a / h", "SWE-Bench Verified"] == 1
    assert pd.isna(matrix.loc["b / h", "Terminal Bench 2.0"])
    figure = create_coverage_matrix_plot(matrix)
    assert isinstance(figure, go.Figure)
    assert "Available" in figure.data[0].text[0] or "Missing" in figure.data[0].text[0]


def test_generic_tradeoff_and_matrix_charts_construct():
    df = enrich_analysis_df(frame())
    figure = create_tradeoff_plot(
        df[df["Benchmark"] == "SWE-Bench Verified"],
        "Total Tokens Per Task", "Score (%)",
        "Total tokens per task", "Score (%)",
        show_pareto_frontier=True,
    )
    matrix_figure = create_matrix_plot(matrix_df(df, "Score"), "Score matrix", "Score (%)")
    assert isinstance(figure, go.Figure)
    assert isinstance(matrix_figure, go.Figure)
    assert any(trace.name == "Pareto frontier" for trace in figure.data)


def test_tradeoff_pareto_supports_lower_is_better_on_both_axes():
    df = pd.DataFrame(
        {
            "Model": ["a", "b", "c"],
            "Harness": ["h", "h", "h"],
            "Benchmark": ["bench", "bench", "bench"],
            "Total Tokens Per Task": [100, 200, 300],
            "Cost Per Task": [0.3, 0.2, 0.4],
        }
    )
    figure = create_tradeoff_plot(
        df,
        "Total Tokens Per Task",
        "Cost Per Task",
        "Tokens",
        "Cost",
        show_pareto_frontier=True,
        lower_x_is_better=True,
        higher_y_is_better=False,
    )
    frontier = next(trace for trace in figure.data if trace.name == "Pareto frontier")
    assert list(frontier.x) == [100, 200]
    assert list(frontier.y) == [0.3, 0.2]


def test_matrix_can_color_by_percentile_but_display_raw_values():
    color_matrix = pd.DataFrame([[100.0, 0.0]], index=["a / h"], columns=["b1", "b2"] )
    raw_matrix = pd.DataFrame([[82.5, 41.25]], index=["a / h"], columns=["b1", "b2"] )
    figure = create_matrix_plot(
        color_matrix,
        "Score matrix",
        "Within-benchmark percentile",
        display_matrix=raw_matrix,
        display_metric_label="Benchmark score (%)",
    )
    assert list(figure.data[0].z[0]) == [100.0, 0.0]
    assert list(figure.data[0].text[0]) == ["82.5", "41.25"]
    assert "Benchmark score (%)" in figure.data[0].hovertemplate


def test_ranking_plot_order_can_be_value_or_alphabetical():
    from src.charts import create_ranking_plot

    df = pd.DataFrame(
        {
            "Model": ["b", "a", "c"],
            "Harness": ["h", "h", "h"],
            "Benchmark": ["bench", "bench", "bench"],
            "Score (%)": [20, 10, 30],
        }
    )
    largest = create_ranking_plot(
        df, "Score (%)", "Score", True, sort_order="Largest value first"
    )
    lowest = create_ranking_plot(
        df, "Score (%)", "Score", True, sort_order="Lowest value first"
    )
    alpha = create_ranking_plot(
        df, "Score (%)", "Score", True, sort_order="Alphabetical (A–Z)"
    )

    assert list(largest.layout.yaxis.categoryarray) == ["c / h", "b / h", "a / h"]
    assert list(lowest.layout.yaxis.categoryarray) == ["a / h", "b / h", "c / h"]
    assert list(alpha.layout.yaxis.categoryarray) == ["a / h", "b / h", "c / h"]


def test_matrix_height_scales_with_rows_and_keeps_all_y_labels():
    rows = 18
    matrix = pd.DataFrame(
        {"bench-a": range(rows), "bench-b": range(rows)},
        index=[f"model-{i} / harness" for i in range(rows)],
    )

    figure = create_matrix_plot(matrix, "Dense matrix", "Score (%)")

    assert figure.layout.height >= 900
    assert figure.layout.yaxis.tickmode == "array"
    assert len(figure.layout.yaxis.tickvals) == rows
    assert len(figure.layout.yaxis.ticktext) == rows