67 lines
2.2 KiB
Python
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}"
|