Files
orisys-sdk/tests/test_backends.py
T
2026-03-09 13:33:18 +08:00

67 lines
2.2 KiB
Python

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}"