import numpy as np from fall_detection.features import FEATURE_DIM, normalize_pose_sequence def random_visible_pose(seed: int = 0) -> np.ndarray: rng = np.random.default_rng(seed) poses = rng.normal(size=(12, 33, 4)).astype(np.float32) poses[:, :, :2] = poses[:, :, :2] * 0.05 + 0.5 poses[:, :, 3] = 1.0 return poses def test_feature_shape_and_finiteness() -> None: features = normalize_pose_sequence(random_visible_pose()) assert features.shape == (12, FEATURE_DIM) assert np.isfinite(features).all() def test_translation_does_not_change_normalized_coordinates() -> None: poses = random_visible_pose() translated = poses.copy() translated[:, :, 0] += 0.20 translated[:, :, 1] -= 0.15 original_features = normalize_pose_sequence(poses) translated_features = normalize_pose_sequence(translated) # Normalized xyz and static geometry are translation invariant. The last # motion features may differ by tiny finite-precision gradients. np.testing.assert_allclose( original_features[:, : 33 * 4 + 5], translated_features[:, : 33 * 4 + 5], atol=2e-5, )