import os import numpy as np def _collect_vnormal_sequence(sensor, frames: int) -> np.ndarray: seq = [] for _ in range(frames): img = sensor.get_img() assert img is not None sensor.compute_deformation(check_motion=False) (vnormal,) = sensor.read_info(sensor.info.VNORMAL) seq.append(vnormal.copy()) return np.asarray(seq) def test_available_backends_smoke(sensor_factory, available_backends): for backend in available_backends: sensor = sensor_factory(backend=backend) try: img = sensor.get_img() assert img is not None sensor.compute_deformation(check_motion=False) flow, vnormal, vshear = sensor.read_info( sensor.info.VRAW, sensor.info.VNORMAL, sensor.info.VSHEAR, ) assert flow.shape == vnormal.shape == vshear.shape assert flow.shape[-1] == 2 assert np.isfinite(flow).all() assert np.isfinite(vnormal).all() assert np.isfinite(vshear).all() finally: sensor.disconnect() def test_backend_parity_against_cpu(sensor_factory, available_backends): if len(available_backends) <= 1: return compare_frames = int(os.getenv("ORISYS_PARITY_FRAMES", "30")) warmup = int(os.getenv("ORISYS_PARITY_WARMUP", "5")) tol = float(os.getenv("ORISYS_PARITY_REL_TOL", "2.0")) cpu_sensor = sensor_factory(backend="cpu") try: cpu_seq = _collect_vnormal_sequence(cpu_sensor, compare_frames) finally: cpu_sensor.disconnect() cpu_ref = cpu_seq[warmup:].mean(axis=0) cpu_scale = float(np.mean(np.abs(cpu_ref))) + 1e-6 for backend in available_backends: if backend == "cpu": continue sensor = sensor_factory(backend=backend) try: seq = _collect_vnormal_sequence(sensor, compare_frames) finally: sensor.disconnect() cand_ref = seq[warmup:].mean(axis=0) rel = float(np.mean(np.abs(cand_ref - cpu_ref)) / cpu_scale) assert rel < tol, f"{backend} parity drift too high: relative_error={rel:.4f}, tol={tol}"