tests/test_rgbd_segment_diversity_v21.py
"""V21 segment diversity: the branch rule, the paired P1 contrast and the segment data rule."""
import importlib.util
from pathlib import Path
import pytest
SCRIPTS = Path(__file__).resolve().parents[1] / "scripts"
def script(name):
spec = importlib.util.spec_from_file_location(name.removesuffix(".py"), SCRIPTS / name)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module
def rows(far24, scenes=40, hybrid=0.0):
"""Per scene FAR(T6000) = 0.45 and FAR(T24000) = far24 (with a little jitter)."""
out = []
for i in range(scenes):
jitter = 0.002 * ((i % 5) - 2)
values = {
("REPROJ_NN", 0): (0.32, 0.22, 0.52),
("REPROJ_HARMONIC", 0): (0.30, 0.20, 0.50),
("AHFILL8_T24000", 1): (0.30 - hybrid - jitter, 0.20, 0.45),
("T6000", 1): (0.31, 0.21, 0.45),
("T24000", 1): (0.31, 0.21, far24 + jitter),
}
for (method, seed), (all_, near, far) in values.items():
for role in ("A", "B"):
for qid in (14, 15):
out.append(
{
"cohort": "EVAL_V3" if i % 2 else "EVAL_V4",
"scene_id": f"ai_{i:03d}_001",
"role": role,
"query_id": qid,
"method": method,
"seed": seed,
"absrel_ALL": all_,
"absrel_NEAR": near,
"absrel_FAR": far,
"far_fraction": 0.2,
}
)
return out
def test_branch_rule():
v21 = script("analyze_rgbd_segment_diversity_v21.py")
assert v21.branch("SUPPORTED", "ABOVE") == "A"
assert v21.branch("SUPPORTED", "NOT_DISTINGUISHABLE") == "B"
assert v21.branch("PARTIAL", "ABOVE") == "B"
assert v21.branch("PARTIAL", "NOT_DISTINGUISHABLE") == "C"
def test_p1_pairs_the_arms_by_scene_and_sets_the_branch():
v21 = script("analyze_rgbd_segment_diversity_v21.py")
evaluation = v21.frozen_v17_evaluation()
g1, g5 = rows(0.40), rows(0.37, hybrid=0.03)
result = v21.analyze({"G1": g1, "G5": g5}, g1, evaluation)
p1 = result["P1_DIVERSITY_GAIN_T24000"]
assert p1["gain"]["mean"] == pytest.approx(0.03, abs=1e-9)
assert result["statuses"]["DIVERSITY_STATUS"] == "SUPPORTED"
assert result["INTERPRETATION_BRANCH"] in ("A", "B")
same = v21.analyze({"G1": g1, "G5": rows(0.40)}, g1, evaluation)
assert same["statuses"]["DIVERSITY_STATUS"] != "SUPPORTED"
assert same["descriptive"]["DEVICE_CHECK_V17_CPU_MINUS_G1_GPU_T24000"]["gain"]["mean"] == 0
def test_segment_rule_takes_later_positions_and_never_the_original_frames():
prep = script("prepare_rgbd_segment_data.py")
assert prep.SEGMENTS == (1, 2, 3, 4) and prep.SEGMENT_LENGTH == 16
assert prep.segment_id("ai_001_002", 3) == "ai_001_002_seg3"
class Info:
def __init__(self, name):
self.filename = name
scene = "ai_001_002"
names = [f"{scene}/_detail/metadata_scene.csv"] + [
f"{scene}/_detail/cam_00/camera_keyframe_{k}.hdf5"
for k in ("frame_indices", "positions", "orientations")
]
for i in range(40):
names += [
f"{scene}/images/scene_cam_00_final_preview/frame.{i:04d}.color.jpg",
f"{scene}/images/scene_cam_00_geometry_hdf5/frame.{i:04d}.depth_meters.hdf5",
f"{scene}/images/scene_cam_00_geometry_hdf5/frame.{i:04d}.position.hdf5",
]
_, meta, segments = prep.members_of(scene, [Info(n) for n in names], list(range(40)))
assert len(meta) == 4 and sorted(segments) == [1]
ids, members = segments[1]
assert ids == list(range(16, 32)) and len(members) == 33