evals_, evecs_ = lt_.symeig(eigenvectors=True)
sub_evals.append(DiagLazyTensor(evals_ / dlt_.diag_values))
sub_evecs.append(evecs_)
Lambda_I = KroneckerProductDiagLazyTensor(*sub_evals).add_jitter(1.0)
S = KroneckerProductLazyTensor(*sub_evecs)
return MatmulLazyTensor(S, Lambda_I.inverse().sqrt())
else:
// again, we compute the root decomposition by pulling across the diagonals
After Change
lt = self.lazy_tensor
if isinstance(self.diag_tensor, KroneckerProductDiagLazyTensor):
if all(isinstance(tdiag, ConstantDiagLazyTensor) for tdiag in dlt.lazy_tensors):
evals_p_i, evecs = _constant_kpadlt_constructor(lt, dlt)
evals_p_i_inv_root = DiagLazyTensor(evals_p_i.diag().reciprocal().sqrt())
// here we need to scale the eigenvectors by the constants as
// A = D^{1/2} Q (\kron a_i^{-1} \Lambda_i + I) Q^\top D^{1/2}