Source: tests/test_v8_q0.py · Plain text

tests/test_v8_q0.py

import importlib.util
import json
from pathlib import Path
from types import SimpleNamespace

import numpy as np
import pytest
import torch

from mcss.v8_geometry import V8Proposal, depth_z_to_points_cam


def _load_runner():
    path = Path(__file__).parents[1] / "scripts" / "run_v8_q0.py"
    spec = importlib.util.spec_from_file_location("run_v8_q0", path)
    assert spec is not None and spec.loader is not None
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module


def _proposal(depth: float = 2.0) -> V8Proposal:
    intrinsics = np.asarray(
        [[4.0, 0.0, 1.0], [0.0, 4.0, 0.5], [0.0, 0.0, 1.0]], dtype=np.float32
    )
    depth_z = np.full((1, 2, 3), depth, dtype=np.float32)
    return V8Proposal(
        supplier="supplier",
        frame_ids=(7,),
        depth_z_m=depth_z,
        points_cam_m=depth_z_to_points_cam(depth_z[0], intrinsics)[None],
        native_confidence=np.ones_like(depth_z),
        native_risk=np.zeros_like(depth_z),
        valid_mask=np.ones_like(depth_z, dtype=np.bool_),
        intrinsics=intrinsics[None],
        c2w=np.eye(4, dtype=np.float32)[None],
    )


def test_posthoc_depth_check_converts_context_ray_distance_to_z_depth() -> None:
    runner = _load_runner()
    proposal = _proposal()
    ray_distance = np.linalg.norm(proposal.points_cam_m, axis=-1)
    result = runner._posthoc_depth_check(proposal, proposal, ray_distance)
    assert result["context_depth_semantics"] == "ray_distance_m_converted_to_opencv_z_m"
    assert result["unidepth_median_abs_error_m"] == pytest.approx(0.0, abs=1e-6)
    assert result["emvsnet_median_abs_error_m"] == pytest.approx(0.0, abs=1e-6)


def test_proposal_check_rejects_request_camera_mismatch() -> None:
    runner = _load_runner()
    proposal = _proposal()
    request = runner.GeometrySupplierRequest(
        (7,),
        runner.torch.zeros(1, 3, 2, 3),
        runner.Cameras(
            runner.torch.tensor(proposal.intrinsics),
            runner.torch.tensor(proposal.c2w),
            (2, 3),
        ),
    )
    proposal.intrinsics[0, 0, 0] += 1.0
    with pytest.raises(ValueError, match="intrinsics"):
        runner._check_proposal(proposal, request)


def test_unverified_checkpoint_training_method_is_a_hard_stop() -> None:
    runner = _load_runner()
    provenance = runner._checkpoint_method_provenance(
        {"epoch": 9, "model": {}, "best_val_mae": 3.63}, requested_method="der"
    )
    assert provenance["status"] == "FAIL"
    assert provenance["reason"] == "training_method_unverified"
    with pytest.raises(RuntimeError, match="training_method_unverified"):
        runner._require_checkpoint_method_provenance(provenance)


def test_publisher_release_provenance_requires_matching_artifact_hashes(tmp_path: Path) -> None:
    runner = _load_runner()
    checkpoint = tmp_path / "best_model_64.ckpt"
    checkpoint.write_bytes(b"checkpoint")
    model_card = tmp_path / "README.md"
    model_card.write_text(
        "## Download Checkpoints\nbest_model_64.ckpt\n"
        "python eval.py --evidential_method der --loadckpt best_model_64.ckpt\n",
        encoding="utf-8",
    )
    manifest = tmp_path / "provenance.json"
    manifest.write_text(
        json.dumps(
            {
                "schema_version": "mcss.emvsnet_checkpoint_provenance.v1",
                "checkpoint": {
                    "filename": checkpoint.name,
                    "sha256": runner._sha256_file(checkpoint),
                    "hub_model_id": "BuTTerK3ks/EMVSNet",
                    "hub_revision": "7596a73607b30771df1b6bcdb1d3e4ce2f17eef3",
                },
                "training": {
                    "evidential_method": "der",
                    "evidence_kind": "publisher_release_inference_contract",
                },
                "model_card": {
                    "sha256": runner._sha256_file(model_card),
                    "required_fragments": [
                        "best_model_64.ckpt",
                        "--evidential_method der",
                    ],
                },
            }
        ),
        encoding="utf-8",
    )

    provenance = runner._checkpoint_method_provenance(
        {"epoch": 9, "model": {}},
        requested_method="der",
        checkpoint_path=checkpoint,
        provenance_path=manifest,
        model_card_path=model_card,
    )

    assert provenance["status"] == "PASS"
    assert provenance["evidence_kind"] == "publisher_release_inference_contract"
    assert provenance["checkpoint_internal_method"] is None

    checkpoint.write_bytes(b"changed")
    mismatch = runner._checkpoint_method_provenance(
        {"epoch": 9, "model": {}},
        requested_method="der",
        checkpoint_path=checkpoint,
        provenance_path=manifest,
        model_card_path=model_card,
    )
    assert mismatch["status"] == "FAIL"
    assert mismatch["reason"] == "checkpoint_sha256_mismatch"


def test_publisher_der_contract_keeps_low_alpha_optimizer_pattern_as_warning(
    tmp_path: Path,
) -> None:
    runner = _load_runner()
    checkpoint = tmp_path / "best_model_64.ckpt"
    checkpoint.write_bytes(b"checkpoint")
    model_card = tmp_path / "README.md"
    model_card.write_text("--evidential_method der\n", encoding="utf-8")
    manifest = tmp_path / "provenance.json"
    manifest.write_text(
        json.dumps(
            {
                "schema_version": "mcss.emvsnet_checkpoint_provenance.v1",
                "checkpoint": {
                    "filename": checkpoint.name,
                    "sha256": runner._sha256_file(checkpoint),
                },
                "training": {
                    "evidential_method": "der",
                    "evidence_kind": "publisher_release_inference_contract",
                },
                "model_card": {
                    "sha256": runner._sha256_file(model_card),
                    "required_fragments": ["--evidential_method der"],
                },
            }
        ),
        encoding="utf-8",
    )
    active = torch.tensor([1.0, 1.0, 1e-14, 1.0]).reshape(4, 1, 1, 1, 1)
    state = {
        "model": {},
        "optimizer": {
            "param_groups": [{"params": [0, 1]}],
            "state": {
                0: {"exp_avg_sq": active.clone()},
                1: {"exp_avg_sq": active.clone()},
            },
        },
    }

    provenance = runner._checkpoint_method_provenance(
        state,
        requested_method="der",
        checkpoint_path=checkpoint,
        provenance_path=manifest,
        model_card_path=model_card,
        parameter_names=[
            "evidential.classif0.2.weight",
            "evidential.classif1.2.weight",
        ],
    )

    assert provenance["status"] == "PASS"
    assert provenance["reason"] == "inference_method_verified_by_publisher_release_contract"
    assert provenance["checkpoint_internal_method"] is None
    signature = provenance["optimizer_signature"]
    assert signature["pattern"] == "low_alpha_second_moment"
    assert signature["method_inference"] == "INDETERMINATE"
    assert signature["hard_gate_eligible"] is False
    assert "suggested_method" not in signature
    assert provenance["warnings"][0]["code"] == "optimizer_alpha_moment_imbalance"


def test_q0_report_surfaces_checkpoint_diagnostic_warnings() -> None:
    runner = _load_runner()
    record = {
        "schema_version": runner.Q0_SCHEMA_VERSION,
        "status": "GO_TO_Q1_LABEL_BLIND_AUDIT",
        "checks": {
            "checkpoint_method_provenance": {
                "status": "PASS",
                "warnings": [
                    {
                        "code": "optimizer_alpha_moment_imbalance",
                        "severity": "WARNING",
                        "message": "Adam moments cannot identify the training method.",
                    }
                ],
            }
        },
    }

    report = runner._render_report(record)

    assert "## Diagnostic Warnings" in report
    assert "optimizer_alpha_moment_imbalance" in report
    assert "Adam moments cannot identify the training method." in report


def test_repeat_stability_metrics_require_both_suppliers() -> None:
    runner = _load_runner()
    stable = _proposal(2.0)
    changed = _proposal(2.1)
    metrics = runner._repeat_stability_metrics(stable, stable, stable, changed)
    assert metrics["max_unidepth_depth_delta_m"] == pytest.approx(0.0)
    assert metrics["max_emvsnet_depth_delta_m"] == pytest.approx(0.1)
    assert metrics["passed"] is False


def test_source_drop_intervention_delta_is_computed_on_reference_overlap() -> None:
    runner = _load_runner()
    full = _proposal(2.0)
    dropped = _proposal(2.25)
    metrics = runner._source_drop_intervention_delta(full, dropped)
    assert metrics["reference_frame_id"] == 7
    assert metrics["median_depth_delta_m"] == pytest.approx(0.25)
    assert metrics["max_depth_delta_m"] == pytest.approx(0.25)


def test_determinism_configuration_is_explicit() -> None:
    runner = _load_runner()
    config = runner._configure_determinism()
    assert config["torch_deterministic_algorithms"] is True
    assert config["cudnn_deterministic"] is True
    assert config["cudnn_benchmark"] is False


def test_q0_record_separates_label_blind_proposals_from_postseal_audit(tmp_path: Path) -> None:
    runner = _load_runner()
    args = SimpleNamespace(
        window_file=tmp_path / "window.json",
        unidepth_code_root=tmp_path / "unidepth",
        emvsnet_code_root=tmp_path / "emvsnet",
        unidepth_bundle=tmp_path / "unidepth_bundle",
        emvsnet_checkpoint=tmp_path / "model.ckpt",
        emvsnet_provenance=None,
        emvsnet_model_card=None,
        device="cpu",
        evidential_method="der",
    )

    boundary = runner._initial_record(args)["research_boundary"]

    assert boundary["proposal_phase_target_access"] is False
    assert boundary["postseal_context_depth_audit"] is True
    assert "target_access" not in boundary

    record = runner._initial_record(args)
    record["status"] = "STOP_EMVSNET_Q0"
    report = runner._render_report(record)
    assert "proposal generation is label blind" in report
    assert "post-seal development context-depth audit" in report
    assert "no training, target access" not in report