def logmap(self, sd_vectors): # If we've been passed a single vector to map, then add the extra axis # Number of sample first if len(sd_vectors.shape) < 3: sd_vectors = sd_vectors[None, ...] longlat = cart2sph(-sd_vectors[..., 1], sd_vectors[..., 0], sd_vectors[..., 2]) longlat[..., 0] += np.pi c = np.arccos( np.sin(self.long0lat1[..., 1]) * np.sin(longlat[..., 1]) + np.cos(self.long0lat1[..., 1]) * np.cos(longlat[..., 1]) * np.cos(longlat[..., 0] - self.long0lat1[..., 0])) k = 1.0 / np.sin(c) k = np.nan_to_num(k) k = c * k v0 = k * (np.cos(longlat[..., 1]) * np.sin(longlat[..., 0] - self.long0lat1[..., 0])) v1 = k * (np.cos(self.long0lat1[..., 1]) * np.sin(longlat[..., 1]) - np.sin(self.long0lat1[..., 1]) * np.cos(longlat[..., 1]) * np.cos(longlat[..., 0] - self.long0lat1[..., 0])) vs = np.dstack([v0[..., None], v1[..., None]]) return vs
def logmap(self, sd_vectors): # If we've been passed a single vector to map, then add the extra axis # Number of sample first if len(sd_vectors.shape) < 3: sd_vectors = sd_vectors[None, ...] longlat = cart2sph(-sd_vectors[..., 1], sd_vectors[..., 0], sd_vectors[..., 2]) longlat[..., 0] += np.pi c = np.arccos(np.sin(self.long0lat1[..., 1]) * np.sin(longlat[..., 1]) + np.cos(self.long0lat1[..., 1]) * np.cos(longlat[..., 1]) * np.cos(longlat[..., 0] - self.long0lat1[..., 0])) k = 1.0 / np.sin(c) k = np.nan_to_num(k) k = c * k v0 = k * (np.cos(longlat[..., 1]) * np.sin(longlat[..., 0] - self.long0lat1[..., 0])) v1 = k * (np.cos(self.long0lat1[..., 1]) * np.sin(longlat[..., 1]) - np.sin(self.long0lat1[..., 1]) * np.cos(longlat[..., 1]) * np.cos(longlat[..., 0] - self.long0lat1[..., 0])) vs = np.dstack([v0[..., None], v1[..., None]]) return vs
def __init__(self, base_vectors): super(AEP, self).__init__() self.base_vectors = base_vectors self.long0lat1 = cart2sph(-self.base_vectors[:, 1], self.base_vectors[:, 0], self.base_vectors[:, 2]) self.long0lat1[:, 0] += np.pi self.long0lat1 = self.long0lat1[None, ...]