feat: report_builder uses weighted means; ReportData gains weighted_score_mean
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -64,6 +64,27 @@ def _read_metrics_from_snapshot(run_dir: Path) -> list[str]:
|
||||
return []
|
||||
|
||||
|
||||
def _read_weights_from_snapshot(run_dir: Path) -> tuple[dict[str, float], dict[str, float]]:
|
||||
"""Read metric_weights and doc_weights from a scenario snapshot if present.
|
||||
|
||||
Returns a (metric_weights, doc_weights) tuple of plain dicts.
|
||||
Both default to empty dicts when the snapshot is absent or lacks the fields.
|
||||
"""
|
||||
snapshot = run_dir / "scenario.snapshot.yaml"
|
||||
if not snapshot.is_file():
|
||||
return {}, {}
|
||||
try:
|
||||
payload = yaml.safe_load(snapshot.read_text(encoding="utf-8")) or {}
|
||||
except (OSError, yaml.YAMLError):
|
||||
return {}, {}
|
||||
mw = payload.get("metric_weights") or {}
|
||||
dw = payload.get("doc_weights") or {}
|
||||
return (
|
||||
{str(k): float(v) for k, v in mw.items() if isinstance(v, (int, float))},
|
||||
{str(k): float(v) for k, v in dw.items() if isinstance(v, (int, float))},
|
||||
)
|
||||
|
||||
|
||||
def discover_run_dirs(extra_roots: list[Path] | None = None) -> list[Path]:
|
||||
"""Find every run directory (one that contains metadata.json) under the roots."""
|
||||
run_dirs: list[Path] = []
|
||||
@@ -159,6 +180,8 @@ NON_METRIC_COLUMNS = {
|
||||
"source_chunk_ids",
|
||||
"review_status",
|
||||
"review_notes",
|
||||
"weighted_score",
|
||||
"sample_weight",
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user