Source: src/mcss/mechanism_pilot/observability_supervision_statistics.py · Plain text

src/mcss/mechanism_pilot/observability_supervision_statistics.py

"""Scene-level, raw-only observability and geometry-supervision attribution.

Empty masks remain explicit. Conditional estimands and additive overall-error
contributions are kept separate; query pixels never become bootstrap units.
"""

from collections import defaultdict

import numpy as np

from mcss.mechanism_pilot.direct_capacity_statistics import METRICS, describe, paired, scene_values

REGIONS = (
    "OVERALL",
    "OBS0",
    "OBS1",
    "OBS2PLUS",
    "OBS01",
    "ANGLE_0_5",
    "ANGLE_5_15",
    "ANGLE_15_30",
    "ANGLE_GT30",
    "OCCLUDED_ANY",
    "CONFLICT_ANY",
)
PARTITION = ("OBS0", "OBS1", "OBS2PLUS")
VARIANTS = ("S0", "S1", "S2", "S3")


def conditional_summary(values, *, draws=10000, seed=20260927, improvement=False):
    """All scenes are sampled; every draw recomputes its covered-scene denominator."""
    ids = sorted(values)
    if not ids:
        raise ValueError("A nonempty complete scene roster is required")
    finite = {s: float(values[s]) for s in ids if values[s] is not None}
    if not all(np.isfinite(v) for v in finite.values()):
        raise ValueError("Nonfinite values must not be silently removed")
    x = np.asarray([0.0 if values[s] is None else values[s] for s in ids], dtype=float)
    valid = np.asarray([values[s] is not None for s in ids], dtype=bool)
    indices = np.random.default_rng(seed).integers(0, len(ids), size=(draws, len(ids)))
    denominators = valid[indices].sum(1)
    defined = denominators > 0
    means = x[indices].sum(1)[defined] / denominators[defined]
    positive = np.maximum(np.asarray(list(finite.values())), 0)
    absolute = np.abs(np.asarray(list(finite.values())))

    def share(array, count):
        return float(np.sort(array)[-count:].sum() / array.sum()) if array.sum() else None

    loso = {}
    for i, scene in enumerate(ids):
        n = int(valid.sum() - valid[i])
        loso[scene] = float((x.sum() - x[i]) / n) if n else None
    observed = np.asarray(list(finite.values()), dtype=float)
    result = {
        "n_scenes": len(ids),
        "n_covered_scenes": len(finite),
        "scene_coverage": len(finite) / len(ids),
        "empty_mask_scene_count": len(ids) - len(finite),
        "per_scene": {s: values[s] for s in ids},
        "mean": float(observed.mean()) if len(observed) else None,
        "median": float(np.median(observed)) if len(observed) else None,
        "ci95": np.percentile(means, [2.5, 97.5]).tolist() if len(means) else None,
        "positive": int((observed > 1e-8).sum()),
        "tied": int((np.abs(observed) <= 1e-8).sum()),
        "negative": int((observed < -1e-8).sum()),
        "loso": loso,
        "positive_top1_contribution": share(positive, 1),
        "positive_top3_contribution": share(positive, 3),
        "absolute_top1_contribution": share(absolute, 1),
        "absolute_top3_contribution": share(absolute, 3),
        "bootstrap": {
            "unit": "all scenes with coverage denominator recomputed each draw",
            "draws": draws,
            "seed": seed,
            "undefined_empty_draws": int((~defined).sum()),
            "defined_draws": int(defined.sum()),
        },
        "estimand": "equal mean of defined scene-conditional values; all scene keys retained",
    }
    if improvement:
        result["improved_tied_worse"] = [result["positive"], result["tied"], result["negative"]]
    return result


def conditional_difference(left, right, *, draws=10000, seed=20260927):
    if set(left) != set(right):
        raise ValueError("Paired regional contrasts require the same complete scene roster")
    return conditional_summary(
        {s: None if left[s] is None or right[s] is None else left[s] - right[s] for s in left},
        draws=draws,
        seed=seed,
        improvement=True,
    )


def stable_gain(stats):
    return (
        stats["mean"] is not None
        and stats["mean"] >= 0.02
        and stats["ci95"][0] > 0
        and (stats["positive"] + stats["tied"]) / stats["n_scenes"] >= 0.75
    )


def negative(stats, *, draws=10000, seed=20260927):
    return conditional_summary(
        {s: None if v is None else -v for s, v in stats["per_scene"].items()},
        draws=draws,
        seed=seed,
        improvement=True,
    )


def geometry_status(comparisons):
    if stable_gain(comparisons["S3_minus_S0"]):
        return "HARMFUL"
    if all(stable_gain(comparisons[k]) for k in ("S0_minus_S3", "S1_minus_S3", "S2_minus_S3")):
        return "COMPLEMENTARY"
    free = stable_gain(comparisons["S0_minus_S1"])
    surface = stable_gain(comparisons["S0_minus_S2"])
    if free and not surface and stable_gain(comparisons["S2_minus_S1"]):
        return "FREE_SPACE_DOMINANT"
    if surface and not free and stable_gain(comparisons["S1_minus_S2"]):
        return "SURFACE_DOMINANT"
    if not any(stable_gain(comparisons[f"S0_minus_{v}"]) for v in ("S1", "S2", "S3")):
        return "NO_CLEAR_GAIN"
    return "INCONCLUSIVE"


def positive_low_support_share(contribution_gaps):
    positive = {
        region: sum(max(v, 0) for v in contribution_gaps[region].values()) for region in PARTITION
    }
    total = sum(positive.values())
    return {
        "share": (positive["OBS0"] + positive["OBS1"]) / total if total else None,
        "positive_contribution_by_region": positive,
        "definition": "positive scene-region additive contributions; not signed net-gap share",
    }


def observability_status(observed_gap, low_support_coverage, positive_share, rules):
    coverage = rules["region_rules"]["minimum_scene_coverage"]
    if observed_gap["scene_coverage"] < coverage or observed_gap["ci95"] is None:
        return "INCONCLUSIVE"
    decision = rules["observability_rules"]
    significant = (
        observed_gap["mean"] >= decision["observed_gap_min"] and observed_gap["ci95"][0] > 0
    )
    if significant:
        mixed = (
            low_support_coverage >= coverage
            and positive_share is not None
            and positive_share >= decision["mixed_low_support_positive_share_min"]
        )
        return "MIXED" if mixed else "OBSERVED_REGION_FAILURE"
    margin = decision["equivalence_margin"]
    near = -margin <= observed_gap["ci95"][0] and observed_gap["ci95"][1] <= margin
    if (
        near
        and low_support_coverage >= coverage
        and positive_share is not None
        and positive_share >= decision["unobserved_positive_share_min"]
    ):
        return "UNOBSERVED_REGION_DOMINANT"
    return "INCONCLUSIVE"


def gap_fraction(base, closed, *, draws=10000, seed=20260927):
    if not base or set(base) != set(closed):
        raise ValueError("Paired complete scene gaps required")
    ids = sorted(base)
    denominator = np.asarray([base[s] for s in ids], dtype=float)
    numerator = np.asarray([closed[s] for s in ids], dtype=float)
    index = np.random.default_rng(seed).integers(0, len(ids), (draws, len(ids)))
    b, c = denominator[index].mean(1), numerator[index].mean(1)
    valid = b > 0
    ratios = c[valid] / b[valid]
    return {
        "value": float(numerator.mean() / denominator.mean()) if denominator.mean() > 0 else None,
        "ci95": np.percentile(ratios, [2.5, 97.5]).tolist() if len(ratios) else None,
        "undefined_nonpositive_base_draws": int((~valid).sum()),
        "draws": draws,
        "seed": seed,
        "meaning": "ratio of scene-macro gap closure to base gap; not theoretical optimum recovery",
    }


def _identity(row):
    return row["scene_id"], row["role"], row["query_id"]


def validate_rows(query, context, regions, observability, manifest):
    records = {s["scene_id"]: s for s in manifest["scenes"]}
    ids = sorted(records)
    if (
        not ids
        or len(ids) != len(manifest["scenes"])
        or set(ids) & set(manifest["FINAL_HOLDOUT_PROHIBITED"])
    ):
        raise ValueError("Unique exposed roster without protected scenes required")
    identities = {
        (scene, role, q)
        for scene, record in records.items()
        for role in ("A", "B")
        for q in record["roles"]["primary_query"]
    }
    variants = set(VARIANTS) | {"ORACLE", "CARRIER", "ANCHOR"}
    if any(r["variant"] == "OLD_BASELINE" for r in query):
        variants.add("OLD_BASELINE")
    expected = {(variant, "direct", *identity) for variant in variants for identity in identities}
    expected |= {
        (variant, "wrong_scene", *identity) for variant in VARIANTS for identity in identities
    }
    expected |= {
        ("S3", method, *identity)
        for method in ("spatial_shuffle", "zero")
        for identity in identities
    }
    actual = {(r["variant"], r["method"], *_identity(r)) for r in query}
    if len(actual) != len(query) or actual != expected:
        raise ValueError(
            "Every registered variant/control must cover each locked scene/role/query once"
        )
    expected_context = {
        (v, "direct", scene, role, fid)
        for v in VARIANTS
        for scene, record in records.items()
        for role in ("A", "B")
        for fid in record["roles"]["context_a" if role == "A" else "context_b"]
    }
    actual_context = {
        (r["variant"], r["method"], r["scene_id"], r["role"], r["frame_id"]) for r in context
    }
    if len(actual_context) != len(context) or actual_context != expected_context:
        raise ValueError("Context results must cover all locked frames, roles and variants")
    expected_regions = {
        (v, region, *identity) for v in variants for region in REGIONS for identity in identities
    }
    region_lookup = {(r["variant"], r["region"], *_identity(r)): r for r in regions}
    if len(region_lookup) != len(regions) or set(region_lookup) != expected_regions:
        raise ValueError("Complete region matrix required, including explicit empty masks")
    if any(r["method"] != "direct" for r in regions):
        raise ValueError("Region rows are direct states only")
    actual_obs = {_identity(r) for r in observability}
    if len(actual_obs) != len(observability) or actual_obs != identities:
        raise ValueError("Observability summaries must cover all locked observations")
    query_lookup = {(r["variant"], *_identity(r)): r for r in query if r["method"] == "direct"}
    maximum_residual = 0.0
    for identity in identities:
        for region in REGIONS:
            masks = {
                (
                    region_lookup[v, region, *identity]["pixel_count"],
                    region_lookup[v, region, *identity]["total_valid"],
                )
                for v in variants
            }
            if len(masks) != 1:
                raise ValueError("Masks must be identical across variants")
        for variant in variants:
            rows = {region: region_lookup[variant, region, *identity] for region in REGIONS}
            for row in rows.values():
                count, total, error = row["pixel_count"], row["total_valid"], row["absrel_sum"]
                if not (
                    isinstance(count, int)
                    and isinstance(total, int)
                    and 0 <= count <= total
                    and total > 0
                ):
                    raise ValueError("Valid integer region counts and nonempty query GT required")
                if not np.isfinite(error) or error < 0:
                    raise ValueError("Finite nonnegative region error sums required")
                if count == 0:
                    if error != 0 or row["absrel_mean"] is not None:
                        raise ValueError("Empty region must have zero error sum and null mean")
                elif row["absrel_mean"] is None or not np.isclose(
                    row["absrel_mean"], error / count, rtol=1e-6, atol=1e-8
                ):
                    raise ValueError("Region mean disagrees with sum and pixel count")
            if len({r["total_valid"] for r in rows.values()}) != 1:
                raise ValueError("Regional total-valid denominator must remain identical")
            overall = rows["OVERALL"]
            if overall["pixel_count"] != overall["total_valid"]:
                raise ValueError("Overall region must retain every GT-valid query pixel")
            for parent, children in (
                ("OVERALL", PARTITION),
                ("OBS01", ("OBS0", "OBS1")),
                ("OBS2PLUS", ("ANGLE_0_5", "ANGLE_5_15", "ANGLE_15_30", "ANGLE_GT30")),
            ):
                if sum(rows[r]["pixel_count"] for r in children) != rows[parent]["pixel_count"]:
                    raise ValueError("Regional pixel partitions do not reconstruct parent")
                residual = abs(
                    sum(rows[r]["absrel_sum"] for r in children) - rows[parent]["absrel_sum"]
                )
                maximum_residual = max(maximum_residual, residual / overall["total_valid"])
                if not np.isclose(
                    sum(rows[r]["absrel_sum"] for r in children),
                    rows[parent]["absrel_sum"],
                    rtol=1e-6,
                    atol=1e-8,
                ):
                    raise ValueError("Regional error contributions do not reconstruct parent")
            if not np.isclose(
                overall["absrel_sum"] / overall["total_valid"],
                query_lookup[variant, *identity]["depth_absrel"],
                rtol=1e-6,
                atol=1e-8,
            ):
                raise ValueError("Overall region disagrees with unfiltered query metric")
    return ids, sorted(variants), maximum_residual


def analyze(
    query_rows,
    context_rows,
    region_rows,
    observability_rows,
    trajectories,
    manifest,
    rules,
    *,
    draws=None,
    seed=None,
):
    draws = rules["statistics"]["draws"] if draws is None else draws
    seed = rules["statistics"]["seed"] if seed is None else seed
    if rules["primary_variant"] != "S3":
        raise ValueError("Primary cannot be selected after seeing query scores")
    ids, variants, residual = validate_rows(
        query_rows, context_rows, region_rows, observability_rows, manifest
    )
    query_groups, context_groups, region_groups = (
        defaultdict(list),
        defaultdict(list),
        defaultdict(list),
    )
    for row in query_rows:
        query_groups[row["variant"], row["method"]].append(row)
    for row in context_rows:
        context_groups[row["variant"]].append(row)
    for row in region_rows:
        region_groups[row["variant"], row["region"]].append(row)
    groups = {}
    for (variant, method), rows in query_groups.items():
        key = f"{variant}|{method}"
        groups[key] = {
            "variant": variant,
            "method": method,
            "query_metrics": {
                m: describe(scene_values(rows, m), draws=draws, seed=seed) for m in METRICS
            },
            "render_seconds_total": sum(r.get("seconds", 0) for r in rows),
        }
        if method == "direct" and variant in context_groups:
            groups[key]["context_metrics"] = {
                m: describe(scene_values(context_groups[variant], m), draws=draws, seed=seed)
                for m in METRICS
            }
            groups[key]["generalization_gap"] = paired(
                groups[key]["query_metrics"]["depth_absrel"]["per_scene"],
                groups[key]["context_metrics"]["depth_absrel"]["per_scene"],
                draws=draws,
                seed=seed,
                improvement=False,
            )
    regions = {}
    for variant in variants:
        regions[variant] = {}
        for region in REGIONS:
            rows = [
                {
                    **r,
                    "fraction": r["pixel_count"] / r["total_valid"],
                    "contribution": r["absrel_sum"] / r["total_valid"],
                }
                for r in region_groups[variant, region]
            ]
            fraction, contribution = (
                scene_values(rows, "fraction"),
                scene_values(rows, "contribution"),
            )
            conditional = {
                s: contribution[s] / fraction[s] if fraction[s] > 0 else None for s in ids
            }
            regions[variant][region] = {
                "conditional_absrel": conditional_summary(conditional, draws=draws, seed=seed),
                "pixel_fraction": describe(fraction, draws=draws, seed=seed),
                "additive_error_contribution": describe(contribution, draws=draws, seed=seed),
            }
    comparisons = {}
    for left in VARIANTS:
        for right in VARIANTS:
            if left == right:
                continue
            comparisons[f"{left}_minus_{right}"] = paired(
                groups[f"{left}|direct"]["query_metrics"]["depth_absrel"]["per_scene"],
                groups[f"{right}|direct"]["query_metrics"]["depth_absrel"]["per_scene"],
                draws=draws,
                seed=seed,
            )
    region_gaps, regional_gains = {}, {}
    for region in REGIONS:
        region_gaps[region] = conditional_difference(
            regions["S0"][region]["conditional_absrel"]["per_scene"],
            regions["ORACLE"][region]["conditional_absrel"]["per_scene"],
            draws=draws,
            seed=seed,
        )
        regional_gains[region] = {}
        for variant in ("S1", "S2", "S3"):
            regional_gains[region][variant] = {
                "conditional_gain": conditional_difference(
                    regions["S0"][region]["conditional_absrel"]["per_scene"],
                    regions[variant][region]["conditional_absrel"]["per_scene"],
                    draws=draws,
                    seed=seed,
                ),
                "additive_gain_contribution": paired(
                    regions["S0"][region]["additive_error_contribution"]["per_scene"],
                    regions[variant][region]["additive_error_contribution"]["per_scene"],
                    draws=draws,
                    seed=seed,
                ),
            }
    additive_gaps = {
        r: {
            s: regions["S0"][r]["additive_error_contribution"]["per_scene"][s]
            - regions["ORACLE"][r]["additive_error_contribution"]["per_scene"][s]
            for s in ids
        }
        for r in PARTITION
    }
    share = positive_low_support_share(additive_gaps)
    obs_status = observability_status(
        region_gaps["OBS2PLUS"],
        regions["S0"]["OBS01"]["conditional_absrel"]["scene_coverage"],
        share["share"],
        rules,
    )
    controls = {}
    for variant in VARIANTS:
        for method in (
            ("wrong_scene", "spatial_shuffle", "zero") if variant == "S3" else ("wrong_scene",)
        ):
            controls[f"{variant}|{method}"] = paired(
                groups[f"{variant}|{method}"]["query_metrics"]["depth_absrel"]["per_scene"],
                groups[f"{variant}|direct"]["query_metrics"]["depth_absrel"]["per_scene"],
                draws=draws,
                seed=seed,
            )
    oracle_values = groups["ORACLE|direct"]["query_metrics"]["depth_absrel"]["per_scene"]
    base_gap = paired(
        groups["S0|direct"]["query_metrics"]["depth_absrel"]["per_scene"],
        oracle_values,
        draws=draws,
        seed=seed,
    )
    closure = {}
    for variant in ("S1", "S2", "S3"):
        new = paired(
            groups[f"{variant}|direct"]["query_metrics"]["depth_absrel"]["per_scene"],
            oracle_values,
            draws=draws,
            seed=seed,
        )
        closed = comparisons[f"S0_minus_{variant}"]
        closure[variant] = {
            "new_gap": new,
            "gap_closed": closed,
            "gap_closed_fraction": gap_fraction(
                base_gap["per_scene"], closed["per_scene"], draws=draws, seed=seed
            ),
        }
    correlations = {}
    for scene in ids:
        rows = [r for r in observability_rows if r["scene_id"] == scene]
        if any(r["spearman_visible_count_absrel"] is None for r in rows):
            correlations[scene] = None
        else:
            correlations[scene] = scene_values(rows, "spearman_visible_count_absrel")[scene]
    correlation_stats = conditional_summary(correlations, draws=draws, seed=seed)
    low_minus_observed = conditional_difference(
        regions["S0"]["OBS01"]["conditional_absrel"]["per_scene"],
        regions["S0"]["OBS2PLUS"]["conditional_absrel"]["per_scene"],
        draws=draws,
        seed=seed,
    )
    minimum = rules["region_rules"]["minimum_scene_coverage"]
    observed = region_gaps["OBS2PLUS"]
    margin = rules["observability_rules"]["equivalence_margin"]
    observed_near = (
        observed["scene_coverage"] >= minimum
        and observed["ci95"] is not None
        and -margin <= observed["ci95"][0]
        and observed["ci95"][1] <= margin
    )
    visibility = (
        obs_status not in ("OBSERVED_REGION_FAILURE", "MIXED")
        and observed_near
        and low_minus_observed["scene_coverage"] >= minimum
        and low_minus_observed["mean"] >= 0.02
        and low_minus_observed["ci95"][0] > 0
        and correlation_stats["scene_coverage"] >= minimum
        and correlation_stats["ci95"][1] < 0
    )
    geometry_recommended = (
        stable_gain(comparisons["S0_minus_S3"])
        and controls["S3|wrong_scene"]["ci95"][0] > 0
        and controls["S3|spatial_shuffle"]["ci95"][0] > 0
    )
    costs, seen_trajectories = defaultdict(list), set()
    for key, item in trajectories.items():
        spec, summary = item["spec"], item["summary"]
        identity = spec["variant"], spec["scene_id"], spec["role"]
        if identity in seen_trajectories:
            raise ValueError("Duplicate optimized trajectory identity")
        seen_trajectories.add(identity)
        costs[spec["variant"]].append({"key": key, **summary})
    expected_trajectories = {(v, s, role) for v in VARIANTS for s in ids for role in ("A", "B")}
    if seen_trajectories != expected_trajectories:
        raise ValueError("All four matched optimization variants must have per-role summaries")
    costs_by_variant = {}
    for variant, summaries in costs.items():
        seconds = [
            r["seconds"] if "seconds" in r else r["cumulative_optimization_seconds"]
            for r in summaries
        ]
        costs_by_variant[variant] = {
            "n_states": len(summaries),
            "final_context_objective_components": {
                r["key"]: r.get("final_context_metrics") for r in summaries
            },
            "optimization_seconds_total": sum(seconds),
            "optimization_seconds_per_state": float(np.mean(seconds)),
            "peak_cuda_allocated_bytes": max(
                (r.get("peak_cuda_allocated_bytes") or 0) for r in summaries
            ),
            "peak_cuda_reserved_bytes": max(
                (r.get("peak_cuda_reserved_bytes") or 0) for r in summaries
            ),
            "render_seconds_total": groups[f"{variant}|direct"]["render_seconds_total"],
        }
    frozen_recommendations = {
        "GEOMETRY_AWARE_CARRIER_RECOMMENDED": bool(geometry_recommended),
        "VISIBILITY_AWARE_FUSION_RECOMMENDED": True if visibility else "inconclusive",
        "meaning": "future research only; no carrier training or independent qualification",
    }
    return {
        "observability_analysis": {
            "scene_ids": ids,
            "regions": regions,
            "OBSERVABILITY_STATUS": obs_status,
            "base_conditional_context_oracle_gaps": region_gaps,
            "positive_low_support_gap_share": share,
            "signed_additive_gap_by_region": {
                r: describe(v, draws=draws, seed=seed) for r, v in additive_gaps.items()
            },
            "partition_max_abs_error_residual": residual,
            "S0_visible_count_error_spearman": correlation_stats,
            "S0_low_support_minus_observed_error": low_minus_observed,
            "observability_semantics": "approximate nearest-depth consistency",
        },
        "supervision_analysis": {
            "primary_variant": "S3",
            "BEST_SUPERVISION_MEANING": "PREDECLARED_PRIMARY_NOT_QUERY_WINNER",
            "groups": {k: v for k, v in groups.items() if v["variant"] in VARIANTS},
            "reference_groups": {k: v for k, v in groups.items() if v["variant"] not in VARIANTS},
            "overall_absrel_comparisons": comparisons,
            "regional_gains": regional_gains,
            "GEOMETRY_SUPERVISION_STATUS": geometry_status(comparisons),
            **frozen_recommendations,
        },
        "gap_closure_analysis": {
            "base_gap": base_gap,
            "variants": closure,
            "oracle_role": "privileged diagnostic, not mathematical upper bound or deployment",
        },
        "wrong_scene_analysis": {
            "contrasts": controls,
            "positive_means": "direct better than control at identical recipient camera",
        },
        "bootstrap_results": {
            "draws": draws,
            "seed": seed,
            "unit": "scene, never pixels",
            "overall_comparisons": comparisons,
            "regional_gains": regional_gains,
            "base_regional_gaps": region_gaps,
            "region_empty_policy": "All scenes kept; bootstrap coverage denominator is recomputed",
        },
        "cost_analysis": {
            "variants": costs_by_variant,
            "actual_optimization_seconds": sum(
                v["optimization_seconds_total"] for v in costs_by_variant.values()
            ),
            "timing_note": "sum worker seconds; shared-GPU wall time separate; references reused",
        },
        "decision_summary": {
            "OBSERVABILITY_STATUS": obs_status,
            "GEOMETRY_SUPERVISION_STATUS": geometry_status(comparisons),
            "BEST_SUPERVISION": "S3_PREDECLARED_PRIMARY",
            **frozen_recommendations,
            "FINAL_HOLDOUT_TOUCHED": False,
            "NEW_CARRIER_TRAINED": False,
            "DYNAMIC_TTT_RUN": False,
        },
    }