61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
"""TableBench benchmark processor."""
|
|
|
|
from .base import BenchmarkProcessor
|
|
|
|
|
|
class TableBenchProcessor(BenchmarkProcessor):
|
|
"""TableBench: Table QA with different subtasks."""
|
|
|
|
CORE_METRICS = {
|
|
"fact": "accuracy",
|
|
"numerical": "accuracy",
|
|
"analysis": "accuracy",
|
|
"visualization": "Pass@1", # TableBench visualization uses Pass@1 as core metric
|
|
}
|
|
|
|
# TableBench-specific metrics where higher is better
|
|
HIGHER_IS_BETTER = BenchmarkProcessor.HIGHER_IS_BETTER | {
|
|
"Pass@1",
|
|
"ECR@1",
|
|
"Parse@1",
|
|
}
|
|
|
|
@classmethod
|
|
def match(cls, benchmark_name: str) -> bool:
|
|
return "tablebench" in benchmark_name.lower()
|
|
|
|
@classmethod
|
|
def get_core_metric(cls, accuracy_summary: dict) -> tuple[str, float, bool] | None:
|
|
scores = []
|
|
metrics_used = []
|
|
|
|
for ds, metrics in accuracy_summary.items():
|
|
if not isinstance(metrics, dict):
|
|
continue
|
|
ds_lower = ds.lower()
|
|
# Find matching core metric
|
|
core_metric = "accuracy" # fallback
|
|
for pattern, metric in cls.CORE_METRICS.items():
|
|
if pattern in ds_lower:
|
|
core_metric = metric
|
|
break
|
|
|
|
if core_metric in metrics:
|
|
scores.append(float(metrics[core_metric]))
|
|
metrics_used.append(core_metric)
|
|
|
|
if not scores:
|
|
return None
|
|
|
|
avg = sum(scores) / len(scores)
|
|
unique = list(set(metrics_used))
|
|
|
|
if len(scores) == 1:
|
|
metric_name = unique[0]
|
|
elif len(unique) == 1:
|
|
metric_name = f"{unique[0]} (average)"
|
|
else:
|
|
metric_name = "mixed (average)"
|
|
|
|
return (metric_name, avg, cls.is_higher_better(metric_name))
|