# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under the license found in the # LICENSE file in the root directory of this source tree. import random import numpy as np import torch def compute_ARE(rotation1, rotation2): if isinstance(rotation1, torch.Tensor): rotation1 = rotation1.cpu().detach().numpy() if isinstance(rotation2, torch.Tensor): rotation2 = rotation2.cpu().detach().numpy() R_rel = np.einsum("Bij,Bjk ->Bik", rotation1.transpose(0, 2, 1), rotation2) t = (np.trace(R_rel, axis1=1, axis2=2) - 1) / 2 theta = np.arccos(np.clip(t, -1, 1)) error = theta * 180 / np.pi return np.minimum(error, np.abs(180 - error))