feat(lab): seal M4.8R3 occupancy shadows
This commit is contained in:
@@ -70,6 +70,7 @@ class M48sReplayTimeline:
|
||||
frames_name: str = "reference-graph-replay-frames.jsonl",
|
||||
worker_result_name: str = "reference-graph-replay-worker-result.json",
|
||||
frame_evidence_schema: str = FRAME_EVIDENCE_SCHEMA,
|
||||
frame_diff_name: str | None = None,
|
||||
camera_endpoint_root: str = (
|
||||
"/api/v1/laboratory/m48s/fixed-class-detector"
|
||||
),
|
||||
@@ -80,6 +81,10 @@ class M48sReplayTimeline:
|
||||
if (
|
||||
Path(frames_name).name != frames_name
|
||||
or Path(worker_result_name).name != worker_result_name
|
||||
or (
|
||||
frame_diff_name is not None
|
||||
and Path(frame_diff_name).name != frame_diff_name
|
||||
)
|
||||
or frame_evidence_schema not in {
|
||||
FRAME_EVIDENCE_SCHEMA,
|
||||
M48R3_FRAME_EVIDENCE_SCHEMA,
|
||||
@@ -92,11 +97,23 @@ class M48sReplayTimeline:
|
||||
self.camera_endpoint_root = camera_endpoint_root
|
||||
self.frames_path = (self.result_root / frames_name).resolve(strict=True)
|
||||
self.worker_path = (self.result_root / worker_result_name).resolve(strict=True)
|
||||
self.frame_diff_path = (
|
||||
None
|
||||
if frame_diff_name is None
|
||||
else (self.result_root / frame_diff_name).resolve(strict=True)
|
||||
)
|
||||
if (
|
||||
self.frames_path.parent != self.result_root
|
||||
or self.worker_path.parent != self.result_root
|
||||
or self.frames_path.is_symlink()
|
||||
or self.worker_path.is_symlink()
|
||||
or (
|
||||
self.frame_diff_path is not None
|
||||
and (
|
||||
self.frame_diff_path.parent != self.result_root
|
||||
or self.frame_diff_path.is_symlink()
|
||||
)
|
||||
)
|
||||
):
|
||||
raise M48sReplayTimelineError("M4.8S replay artifacts are invalid")
|
||||
self.profile = load_replay_threat_profile(
|
||||
@@ -123,6 +140,11 @@ class M48sReplayTimeline:
|
||||
self.outcomes,
|
||||
frame_evidence_schema=self.frame_evidence_schema,
|
||||
)
|
||||
self.frame_diff_offsets = (
|
||||
{}
|
||||
if self.frame_diff_path is None
|
||||
else _index_frame_diff(self.frame_diff_path)
|
||||
)
|
||||
self._cache_lock = Lock()
|
||||
self._chunk_json_cache: OrderedDict[tuple[int, int], bytes] = OrderedDict()
|
||||
self._camera_point_json_cache: OrderedDict[int, bytes] = OrderedDict()
|
||||
@@ -156,6 +178,11 @@ class M48sReplayTimeline:
|
||||
"camera_point_window_seconds": CAMERA_ACCUMULATION_WINDOW_SECONDS,
|
||||
"camera_point_sample_limit": CAMERA_ACCUMULATION_POINT_LIMIT,
|
||||
"world_state_delivery": "source-paced-latest-wins",
|
||||
"occupancy_provenance_delivery": (
|
||||
"baseline-versus-additive-component-diff"
|
||||
if self.frame_diff_path is not None
|
||||
else None
|
||||
),
|
||||
"world_state_frame_count": len(self.index.offsets_by_sequence),
|
||||
"superseded_frame_count": sum(
|
||||
value == "superseded" for value in self.outcomes.values()
|
||||
@@ -399,6 +426,12 @@ class M48sReplayTimeline:
|
||||
body_frame,
|
||||
occupied_voxel_size_m=self.profile.corridor.occupied_voxel_size_m,
|
||||
)
|
||||
provenance = self._component_provenance(sequence)
|
||||
for visual in metric_visuals:
|
||||
visual["occupancy_source"] = provenance.get(
|
||||
str(visual["component_id"]),
|
||||
"baseline",
|
||||
)
|
||||
associated = set(_strings(row.get("associated_proposal_ids"), "associated ids"))
|
||||
for proposal in _objects(row.get("detector_proposals"), "detector proposals"):
|
||||
proposal_id = _text(proposal.get("proposal_id"), "proposal id")
|
||||
@@ -480,6 +513,27 @@ class M48sReplayTimeline:
|
||||
raise M48sReplayTimelineError("M4.8S frame row is invalid")
|
||||
return value
|
||||
|
||||
def _component_provenance(self, sequence: int) -> dict[str, str]:
|
||||
if self.frame_diff_path is None:
|
||||
return {}
|
||||
offset = self.frame_diff_offsets.get(sequence)
|
||||
if offset is None:
|
||||
raise M48sReplayTimelineError("M4.8R3 frame diff is incomplete")
|
||||
with self.frame_diff_path.open("rb") as stream:
|
||||
stream.seek(offset)
|
||||
line = stream.readline()
|
||||
value = _object(json.loads(line), "frame diff")
|
||||
if value.get("sequence") != sequence:
|
||||
raise M48sReplayTimelineError("M4.8R3 frame diff binding changed")
|
||||
provenance = value.get("component_provenance")
|
||||
if not isinstance(provenance, dict) or any(
|
||||
not isinstance(key, str)
|
||||
or item not in {"mixed", "additive-low-step"}
|
||||
for key, item in provenance.items()
|
||||
):
|
||||
raise M48sReplayTimelineError("M4.8R3 component provenance changed")
|
||||
return provenance
|
||||
|
||||
|
||||
def _index_ledger(
|
||||
path: Path,
|
||||
@@ -517,6 +571,33 @@ def _index_ledger(
|
||||
return _LedgerIndex(offsets)
|
||||
|
||||
|
||||
def _index_frame_diff(path: Path) -> dict[int, int]:
|
||||
offsets: dict[int, int] = {}
|
||||
with path.open("rb") as stream:
|
||||
while True:
|
||||
offset = stream.tell()
|
||||
line = stream.readline()
|
||||
if not line:
|
||||
break
|
||||
try:
|
||||
value = json.loads(line)
|
||||
except json.JSONDecodeError:
|
||||
raise M48sReplayTimelineError("M4.8R3 frame diff is invalid") from None
|
||||
if not isinstance(value, dict):
|
||||
raise M48sReplayTimelineError("M4.8R3 frame diff is invalid")
|
||||
sequence = value.get("sequence")
|
||||
if (
|
||||
not isinstance(sequence, int)
|
||||
or isinstance(sequence, bool)
|
||||
or sequence != len(offsets)
|
||||
):
|
||||
raise M48sReplayTimelineError("M4.8R3 frame diff sequence changed")
|
||||
offsets[sequence] = offset
|
||||
if len(offsets) != EXPECTED_FRAME_COUNT:
|
||||
raise M48sReplayTimelineError("M4.8R3 frame diff is incomplete")
|
||||
return offsets
|
||||
|
||||
|
||||
def _ledger_source_envelope(
|
||||
line: bytes,
|
||||
*,
|
||||
|
||||
Reference in New Issue
Block a user