def init_condition(self, r, x0): if x0 is None: x0 = ManifoldElement.rand(self.target_matrix.shape, r, norm=self.norm_bound) self.x_prev, self.x = ManifoldElement(x0, r), ManifoldElement(x0, r) self.delta = delta_on_sigma_set(self.x, self.target_matrix, self.sigma_set) self.grad_partial = riemannian_grad_partial(self.x, self.target_matrix, self.sigma_set, grad=self.delta, manifold_elems=True) self.grad = -TangentVector(self.x, self.grad_partial) self.grad_prev = self.grad self.conj_prev, self.conj = TangentVector.zero(self.x), TangentVector.zero(self.x) return None
def cg_grad(self): self.delta = delta_on_sigma_set(self.x, self.target_matrix, self.sigma_set) self.grad_partial = riemannian_grad_partial(self.x, self.target_matrix, self.sigma_set, grad=self.delta, manifold_elems=True) self.grad_prev, self.grad = self.grad, -TangentVector(self.x, self.grad_partial) return None