def _compress_svd_r(self, rank, relerr, svdfunc):
"""Compresses the MPA in place from left to right using SVD;
yields a left-canonical state
See :func:`~compress` for parameters
"""
assert rank > 0, "Cannot compress to rank={}".format(rank)
assert (relerr is None) or ((0. <= relerr) and (relerr <= 1.)), \
"Relerr={} not allowed".format(relerr)
for site in range(len(self) - 1):
ltens = self._lt[site]
matshape = (-1, ltens.shape[-1])
if relerr is None:
u, sv, v = svdfunc(ltens.reshape(matshape), rank)
rank_t = len(sv)
else:
u, sv, v = svd(ltens.reshape(matshape))
svsum = np.cumsum(sv) / np.sum(sv)
rank_relerr = np.searchsorted(svsum, 1 - relerr) + 1
rank_t = min(ltens.shape[-1], u.shape[1], rank, rank_relerr)
yield sv, rank_t
newtens = (u[:, :rank_t].reshape(ltens.shape[:-1] + (rank_t, )),
matdot(sv[:rank_t, None] * v[:rank_t, :], self._lt[site + 1]))
self._lt.update(slice(site, site + 2), newtens,
canonicalization=('left', None))
yield np.sum(np.abs(self._lt[-1])**2)
评论列表
文章目录