Source: tests/test_rgbd_segment_diversity_v21.py · Plain text

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