def field_generator(self): support = self._f_support(self.__manifold.gd) vectors = self._f_vectors(self.__manifold.gd) return StructuredField_0(support, self.__controls * vectors, self.__sigma, device=self.device, backend=self.backend)
def cot_to_vs(self, sigma, backend=None): v0 = StructuredField_0(self.gd[0], self.cotan[0], sigma, backend=backend) R = torch.einsum('nik, njk->nij', self.cotan[1], self.gd[1]) vm = StructuredField_m(self.gd[0], R, sigma, backend=backend) return SumStructuredField([v0, vm])
def cot_to_vs(self, sigma, backend=None): v0 = StructuredField_0(self.gd[0], self.cotan[0], sigma, device=self.device, backend=backend) if self.__transport == 'vector': vu = StructuredField_0_u(self.gd[0], self.cotan[1], self.gd[1], sigma) else: vu = StructuredField_0_u(self.gd[0], -self.gd[1], self.cotan[1], sigma) return SumStructuredField([v0, vu])
def compute_geodesic_control(self, man): support = self._f_support(self.manifold.gd) vectors = self._f_vectors(self.manifold.gd) # vector field for control = 1 v = StructuredField_0(support, vectors, self.sigma, device=self.device, backend='torch') K_q = K_xx(support, self.sigma) m = torch.mm(K_q, vectors) co = self.coeff * torch.dot(m.flatten(), vectors.flatten()) self.controls = man.inner_prod_field(v) / co
def field_generator(self): return StructuredField_0(self.__manifold.gd, self.__controls, self.__sigma, device=self.device, backend=self.backend)
def field_generator(self): return StructuredField_0(self.__manifold.gd[0], self.__controls.unsqueeze(1).repeat(1, self.dim)*self.__manifold.gd[1], self.__sigma, device=self.device, backend=self.backend)
def cot_to_vs(self, sigma, backend=None): return StructuredField_0(self.gd, self.cotan, sigma, device=self.device, backend=backend)