scripts/analyze_vision_probe.py
"""Summarize a completed exploratory probe using sequences as sampling units."""
from __future__ import annotations
import argparse
import json
from collections import Counter, defaultdict
from pathlib import Path
import numpy as np
def mean(values):
return float(np.mean(values)) if values else None
def paired_interval(values, seed=20260921):
if not values:
return {"mean": None, "lower95": None, "upper95": None, "n_sequences": 0}
x = np.asarray(values, dtype=np.float64)
rng = np.random.default_rng(seed)
boot = x[rng.integers(0, len(x), size=(10000, len(x)))].mean(axis=1)
return {
"mean": float(x.mean()),
"lower95": float(np.quantile(boot, 0.025)),
"upper95": float(np.quantile(boot, 0.975)),
"n_sequences": len(x),
}
def sequence_mean(rows, field):
grouped = defaultdict(list)
for row in rows:
value = row.get(field)
if value is not None:
grouped[row["sequence"]].append(float(value))
return {key: mean(values) for key, values in grouped.items()}
def paired_delta(rows, reference):
grouped = defaultdict(list)
deltas = []
for row in rows:
key = (row["sequence"], row["target_slot"])
base = reference[key]
if row.get("mean_iou") is None or base.get("mean_iou") is None:
continue
delta = row["mean_iou"] - base["mean_iou"]
grouped[row["sequence"]].append(delta)
deltas.append(delta)
out = paired_interval([mean(values) for values in grouped.values()])
out.update(
{
"pair_wins": sum(d > 1e-8 for d in deltas),
"pair_losses": sum(d < -1e-8 for d in deltas),
"pair_ties": sum(abs(d) <= 1e-8 for d in deltas),
"per_sequence": {key: mean(values) for key, values in grouped.items()},
}
)
return out
def analyze(directory: Path):
summary = json.loads((directory / "summary.json").read_text(encoding="utf-8"))
if summary["status"] != "complete":
raise ValueError("Only completed runs may be analyzed")
rows = [json.loads(line) for line in (directory / "raw.jsonl").read_text().splitlines()]
selected_eta = summary["discovery_selection"]["eta"]
output = {
"schema": "mcss.vision_probe.analysis.v1",
"status": "complete",
"official_benchmark": False,
"scope": (
"Frozen DINO features, observed RGB feedback, per-image private writes; "
"not full inverse JEPA or streaming TTT"
),
"interval_note": (
"Descriptive paired percentile bootstrap, 10000 draws over sequences; "
"no multiplicity correction"
),
"selected_eta": selected_eta,
"splits": {},
}
for split in ("discovery", "validation"):
selected = [r for r in rows if r["split"] == split and r["eta"] == selected_eta]
by_method = defaultdict(list)
for row in selected:
by_method[row["method"]].append(row)
baseline = {(r["sequence"], r["target_slot"]): r for r in by_method["OFFOFF"]}
methods = {}
for method, records in by_method.items():
if method == "trajectory":
continue
methods[method] = {
"n_pairs": len(records),
"mean_object_iou": mean(list(sequence_mean(records, "mean_iou").values())),
"foreground_iou": mean(list(sequence_mean(records, "foreground_iou").values())),
"rgb_mse": mean(list(sequence_mean(records, "mse").values())),
"delta_iou_vs_off": paired_delta(records, baseline),
"action_pairs": dict(Counter("/".join(r["action_pair"]) for r in records)),
"mean_final_a_norm": mean([r["state_a_norm"] for r in records]),
"mean_final_b_norm": mean([r["state_b_norm"] for r in records]),
"mean_committed_write_events": mean(
[
sum(2 if a == "ALL" else 0 if a == "OFF" else 1 for a in r["action_pair"])
for r in records
]
),
"mean_candidate_readouts": mean(
[
sum(step.get("candidate_evaluations", 0) for step in r["candidate_ledger"])
for r in records
]
),
}
constants = {
(r["sequence"], r["target_slot"]): r for r in by_method["oracle_bestconstantperpair"]
}
opportunity = paired_delta(by_method["oracle_bestsequenceperpair"], constants)
delta_rgb, delta_iou = [], []
for row in by_method["trajectory"]:
if row["action_pair"] == ["OFF", "OFF"] or row.get("mean_iou") is None:
continue
base = baseline[(row["sequence"], row["target_slot"])]
if base.get("mean_iou") is None:
continue
delta_rgb.append(base["mse"] - row["mse"])
delta_iou.append(row["mean_iou"] - base["mean_iou"])
correlation = None
if len(delta_rgb) > 2 and np.std(delta_rgb) > 1e-12 and np.std(delta_iou) > 1e-12:
correlation = float(np.corrcoef(delta_rgb, delta_iou)[0, 1])
output["splits"][split] = {
"methods": methods,
"oracle_trajectory_minus_oracle_constant": opportunity,
"pooled_rgb_improvement_iou_delta_correlation_descriptive_only": correlation,
"correlation_note": (
"Actions and target frames are dependent; "
"this correlation has no inferential p-value"
),
}
(directory / "analysis.json").write_text(json.dumps(output, indent=2) + "\n", encoding="utf-8")
return output
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("output", type=Path)
args = parser.parse_args()
result = analyze(args.output)
for split, values in result["splits"].items():
print(split)
for method, metrics in values["methods"].items():
delta = metrics["delta_iou_vs_off"]
print(
method,
"IoU",
metrics["mean_object_iou"],
"RGB",
metrics["rgb_mse"],
"delta",
delta["mean"],
"CI",
delta["lower95"],
delta["upper95"],
)