feat(lab): freeze RAVNOVES00 R0 acceptance contract
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from collections import Counter
|
||||
|
||||
import pytest
|
||||
|
||||
from k1link.compute.e37_acceptance_contract import (
|
||||
E37AcceptanceContractError,
|
||||
assign_split,
|
||||
derive_reference_labels,
|
||||
)
|
||||
|
||||
|
||||
def _decision(
|
||||
*,
|
||||
detector: str,
|
||||
ownership: str,
|
||||
cause: str | None = None,
|
||||
effective_stratum: str | None = "agree",
|
||||
) -> dict[str, object]:
|
||||
return {
|
||||
"detector_assessment": detector,
|
||||
"point_ownership": ownership,
|
||||
"cause_code": cause,
|
||||
"effective_stratum": effective_stratum,
|
||||
}
|
||||
|
||||
|
||||
def test_r0_reference_projection_keeps_dimensions_independent() -> None:
|
||||
assert derive_reference_labels(
|
||||
_decision(detector="valid", ownership="object"),
|
||||
None,
|
||||
) == ("object-present", "object-associated", "current")
|
||||
assert derive_reference_labels(
|
||||
_decision(
|
||||
detector="false-positive",
|
||||
ownership="surface-or-background",
|
||||
cause="time_mismatch",
|
||||
),
|
||||
None,
|
||||
) == ("background-or-noise", "rejected-nonobject", "stale")
|
||||
assert derive_reference_labels(
|
||||
_decision(
|
||||
detector="not-applicable",
|
||||
ownership="insufficient-support",
|
||||
effective_stratum="camera-only",
|
||||
),
|
||||
None,
|
||||
) == ("unknown", "insufficient-support", "unavailable")
|
||||
|
||||
|
||||
def test_human_exception_only_overrides_the_ambiguous_reference() -> None:
|
||||
ambiguous = _decision(
|
||||
detector="insufficient-evidence",
|
||||
ownership="insufficient-evidence",
|
||||
effective_stratum=None,
|
||||
)
|
||||
assert derive_reference_labels(ambiguous, "object-present") == (
|
||||
"occupied-environment",
|
||||
"independent-occupied",
|
||||
"unavailable",
|
||||
)
|
||||
assert derive_reference_labels(ambiguous, "background-or-noise") == (
|
||||
"background-or-noise",
|
||||
"rejected-nonobject",
|
||||
"unavailable",
|
||||
)
|
||||
|
||||
|
||||
def test_split_is_deterministic_balanced_and_complete() -> None:
|
||||
rows = [
|
||||
{
|
||||
"item_id": f"item-{index:03d}",
|
||||
"source_stratum": "agree" if index % 2 else "conflict",
|
||||
"range_bucket": "near" if index % 3 else "far",
|
||||
}
|
||||
for index in range(60)
|
||||
]
|
||||
first = assign_split(
|
||||
rows,
|
||||
seed="frozen-seed",
|
||||
validation_fraction=0.3,
|
||||
)
|
||||
second = assign_split(
|
||||
list(reversed(rows)),
|
||||
seed="frozen-seed",
|
||||
validation_fraction=0.3,
|
||||
)
|
||||
assert first == second
|
||||
assert set(first) == {row["item_id"] for row in rows}
|
||||
assert Counter(first.values())["validation"] == 18
|
||||
|
||||
|
||||
def test_split_rejects_mutable_or_invalid_fraction() -> None:
|
||||
with pytest.raises(E37AcceptanceContractError):
|
||||
assign_split([], seed="", validation_fraction=0.3)
|
||||
with pytest.raises(E37AcceptanceContractError):
|
||||
assign_split([], seed="seed", validation_fraction=0.9)
|
||||
@@ -0,0 +1,87 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import importlib.util
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def _module() -> object:
|
||||
path = (
|
||||
Path(__file__).resolve().parents[1]
|
||||
/ "experiments"
|
||||
/ "perception"
|
||||
/ "prepare_e37_worker_package.py"
|
||||
)
|
||||
spec = importlib.util.spec_from_file_location("e37_worker_package_test", path)
|
||||
assert spec is not None and spec.loader is not None
|
||||
module = importlib.util.module_from_spec(spec)
|
||||
sys.modules[spec.name] = module
|
||||
spec.loader.exec_module(module)
|
||||
return module
|
||||
|
||||
|
||||
def test_e37_package_is_minimal_content_addressed_projection(tmp_path: Path) -> None:
|
||||
module = _module()
|
||||
repository = Path(__file__).resolve().parents[1]
|
||||
runtime = repository / ".runtime" / "compute-experiments" / "e30"
|
||||
package = module.build_e37_worker_package(
|
||||
repository_root=repository,
|
||||
materialization_root=(
|
||||
runtime
|
||||
/ "materializations"
|
||||
/ (
|
||||
"e30-materialization-"
|
||||
"841af926d8d28ab93538c46d8f31278a2234c4d1c12c7dc4dc296b249d59735a"
|
||||
)
|
||||
),
|
||||
engineering_generation_root=(
|
||||
runtime
|
||||
/ "engineering-generations"
|
||||
/ (
|
||||
"e30-engineering-generation-"
|
||||
"62a4fea10dea9b77f69ceac1af5bf0e4928d9c7716083c22258a03670fe5bd4f"
|
||||
)
|
||||
),
|
||||
human_generation_root=(
|
||||
runtime
|
||||
/ "human-review-generations"
|
||||
/ (
|
||||
"e30-review-generation-"
|
||||
"7982a882558d0be690b4c7092e328c080bfcbf52478a220452be7e887a588250"
|
||||
)
|
||||
),
|
||||
profile_path=(
|
||||
repository
|
||||
/ "experiments"
|
||||
/ "perception"
|
||||
/ "e37_ravnoves00_acceptance_profile.json"
|
||||
),
|
||||
output_root=tmp_path,
|
||||
)
|
||||
manifest = module.validate_e37_worker_package(package)
|
||||
assert package.name == f"e37-worker-package-{manifest['identity_sha256']}"
|
||||
assert manifest["identity"]["classification"] == (
|
||||
"immutable-ravnoves00-r0-worker-input"
|
||||
)
|
||||
assert len(manifest["artifacts"]) == 12
|
||||
completed = subprocess.run(
|
||||
[
|
||||
sys.executable,
|
||||
str(package / "runtime" / "run_e37_acceptance_contract.py"),
|
||||
"--package",
|
||||
str(package),
|
||||
"--output-root",
|
||||
str(tmp_path / "results"),
|
||||
],
|
||||
env={
|
||||
"PYTHONPATH": str(package / "runtime"),
|
||||
"PYTHONDONTWRITEBYTECODE": "1",
|
||||
"E37_WORKER_NODE": "TEST-WORKER-006",
|
||||
},
|
||||
check=False,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
)
|
||||
assert completed.returncode == 0, completed.stderr
|
||||
assert '"accepted": true' in completed.stdout
|
||||
Reference in New Issue
Block a user