def initialize_LR(self): # initialize the Lpart and Rpart first_LR = [] first_LR.append(np.ones((1, 1, 1, 1))) second_LR = [] second_LR.append(np.ones((1, 1))) for isite in range(1, len(self.cv_mps)): first_LR.append(None) second_LR.append(None) first_LR.append(np.ones((1, 1, 1, 1))) second_LR.append(np.ones((1, 1))) if self.cv_mps.to_right: path1 = [([0, 1], "abcd, efa->bcdef"), ([3, 0], "bcdef, gfhb->cdegh"), ([2, 0], "cdegh, ihjc->degij"), ([1, 0], "degij, kjd->egik")] path2 = [([0, 1], "ab, cda->bcd"), ([1, 0], "bcd, edb->ce")] for isite in range(len(self.cv_mps), 1, -1): first_LR[isite - 1] = asnumpy(multi_tensor_contract( path1, first_LR[isite], self.cv_mps[isite - 1], self.a_oper[isite - 1], self.a_oper[isite - 1], self.cv_mps[isite - 1])) second_LR[isite - 1] = asnumpy(multi_tensor_contract( path2, second_LR[isite], self.b_mps[isite - 1], self.cv_mps[isite - 1])) else: path1 = [([0, 1], "abcd, aef->bcdef"), ([3, 0], "bcdef, begh->cdfgh"), ([2, 0], "cdfgh, cgij->dfhij"), ([1, 0], "dfhij, dik->fhjk")] path2 = [([0, 1], "ab, acd->bcd"), ([1, 0], "bcd, bce->de")] for isite in range(1, len(self.cv_mps)): mps_isite = asxp(self.cv_mps[isite - 1]) first_LR[isite] = asnumpy(multi_tensor_contract( path1, first_LR[isite - 1], mps_isite, self.a_oper[isite - 1], self.a_oper[isite - 1], self.cv_mps[isite - 1])) second_LR[isite] = asnumpy(multi_tensor_contract( path2, second_LR[isite - 1], self.b_mps[isite - 1], mps_isite)) return [first_LR, second_LR]
def initialize_LR(self, direction): first_LR = [np.ones((1, 1, 1))] second_LR = [np.ones((1, 1, 1, 1))] forth_LR = [np.ones((1, 1))] for isite in range(1, len(self.cv_mpo)): first_LR.append(None) second_LR.append(None) forth_LR.append(None) first_LR.append(np.ones((1, 1, 1))) second_LR.append(np.ones((1, 1, 1, 1))) third_LR = copy.deepcopy(second_LR) forth_LR.append(np.ones((1, 1))) if direction == "right": for isite in range(len(self.cv_mpo), 1, -1): path1 = [([0, 1], "abc, defa -> bcdef"), ([2, 0], "bcdef, gfhb -> cdegh"), ([1, 0], "cdegh, ihec -> dgi")] first_LR[isite - 1] = asnumpy( multi_tensor_contract( path1, first_LR[isite], moveaxis(self.cv_mpo[isite - 1], (1, 2), (2, 1)), self.a_oper[isite - 1], self.cv_mpo[isite - 1])) path2 = [([0, 1], "abcd, efga -> bcdefg"), ([3, 0], "bcdefg, hgib -> cdefhi"), ([2, 0], "cdefhi, jikc -> defhjk"), ([1, 0], "defhjk, lkfd -> ehjl")] path4 = [([0, 1], "ab, cdea->bcde"), ([1, 0], "bcde, fedb->cf")] second_LR[isite - 1] = asnumpy( multi_tensor_contract( path2, second_LR[isite], moveaxis(self.cv_mpo[isite - 1], (1, 2), (2, 1)), self.b_oper[isite - 1], self.cv_mpo[isite - 1], self.h_mpo[isite - 1])) third_LR[isite - 1] = asnumpy( multi_tensor_contract( path2, third_LR[isite], self.h_mpo[isite - 1], moveaxis(self.cv_mpo[isite - 1], (1, 2), (2, 1)), self.cv_mpo[isite - 1], self.h_mpo[isite - 1])) forth_LR[isite - 1] = asnumpy( multi_tensor_contract( path4, forth_LR[isite], moveaxis(self.a_ket_mpo[isite - 1], (1, 2), (2, 1)), self.cv_mpo[isite - 1])) if direction == "left": for isite in range(1, len(self.cv_mpo)): path1 = [([0, 1], "abc, adef -> bcdef"), ([2, 0], "bcdef, begh -> cdfgh"), ([1, 0], "cdfgh, cgdi -> fhi")] first_LR[isite] = asnumpy( multi_tensor_contract( path1, first_LR[isite - 1], moveaxis(self.cv_mpo[isite - 1], (1, 2), (2, 1)), self.a_oper[isite - 1], self.cv_mpo[isite - 1])) path2 = [([0, 1], "abcd, aefg -> bcdefg"), ([3, 0], "bcdefg, bfhi -> cdeghi"), ([2, 0], "cdeghi, chjk -> degijk"), ([1, 0], "degijk, djel -> gikl")] path4 = [([0, 1], "ab, acde->bcde"), ([1, 0], "bcde, bdcf->ef")] second_LR[isite] = asnumpy( multi_tensor_contract( path2, second_LR[isite - 1], moveaxis(self.cv_mpo[isite - 1], (1, 2), (2, 1)), self.b_oper[isite - 1], self.cv_mpo[isite - 1], self.h_mpo[isite - 1])) third_LR[isite] = asnumpy( multi_tensor_contract( path2, third_LR[isite - 1], self.h_mpo[isite - 1], moveaxis(self.cv_mpo[isite - 1], (1, 2), (2, 1)), self.cv_mpo[isite - 1], self.h_mpo[isite - 1])) forth_LR[isite] = asnumpy( multi_tensor_contract( path4, forth_LR[isite - 1], moveaxis(self.a_ket_mpo[isite - 1], (1, 2), (2, 1)), self.cv_mpo[isite - 1])) return [first_LR, second_LR, third_LR, forth_LR]
def ones(shape, dtype=None): if dtype is None: dtype = backend.real_dtype return Matrix(np.ones(shape), dtype=dtype)
def initialize_LR(self): first_LR = [np.ones((1, 1, 1, 1))] forth_LR = [np.ones((1, 1))] for isite in range(1, len(self.cv_mpo)): first_LR.append(None) forth_LR.append(None) first_LR.append(np.ones((1, 1, 1, 1))) second_LR = copy.deepcopy(first_LR) third_LR = copy.deepcopy(first_LR) forth_LR.append(np.ones((1, 1))) if self.cv_mpo.to_right: for isite in range(len(self.cv_mpo), 1, -1): cv_isite = self.cv_mpo[isite - 1] dag_cv_isite = moveaxis(cv_isite, (1, 2), (2, 1)) path1 = [([0, 1], "abcd, efga -> bcdefg"), ([3, 0], "bcdefg, hgib -> cdefhi"), ([2, 0], "cdefhi, jikc -> defhjk"), ([1, 0], "defhjk, lkfd -> ehjl")] path2 = [([0, 1], "ab, cdea->bcde"), ([1, 0], "bcde, fedb->cf")] first_LR[isite - 1] = asnumpy( multi_tensor_contract(path1, first_LR[isite], dag_cv_isite, self.a_oper[isite - 1], self.a_oper[isite - 1], cv_isite)) second_LR[isite - 1] = asnumpy( multi_tensor_contract(path1, second_LR[isite], dag_cv_isite, self.a_oper[isite - 1], cv_isite, self.h_mpo[isite - 1])) third_LR[isite - 1] = asnumpy( multi_tensor_contract(path1, third_LR[isite], self.h_mpo[isite - 1], dag_cv_isite, cv_isite, self.h_mpo[isite - 1])) forth_LR[isite - 1] = asnumpy( multi_tensor_contract( path2, forth_LR[isite], moveaxis(self.b_mpo[isite - 1], (1, 2), (2, 1)), cv_isite)) else: for isite in range(1, len(self.cv_mpo)): cv_isite = self.cv_mpo[isite - 1] dag_cv_isite = moveaxis(cv_isite, (1, 2), (2, 1)) path1 = [([0, 1], "abcd, aefg -> bcdefg"), ([3, 0], "bcdefg, bfhi -> cdeghi"), ([2, 0], "cdeghi, chjk -> degijk"), ([1, 0], "degijk, djel -> gikl")] path2 = [([0, 1], "ab, acde->bcde"), ([1, 0], "bcde, bdcf->ef")] first_LR[isite] = asnumpy( multi_tensor_contract(path1, first_LR[isite - 1], dag_cv_isite, self.a_oper[isite - 1], self.a_oper[isite - 1], cv_isite)) second_LR[isite] = asnumpy( multi_tensor_contract(path1, second_LR[isite - 1], dag_cv_isite, self.a_oper[isite - 1], cv_isite, self.h_mpo[isite - 1])) third_LR[isite] = asnumpy( multi_tensor_contract(path1, third_LR[isite - 1], self.h_mpo[isite - 1], dag_cv_isite, cv_isite, self.h_mpo[isite - 1])) forth_LR[isite] = asnumpy( multi_tensor_contract( path2, forth_LR[isite - 1], moveaxis(self.b_mpo[isite - 1], (1, 2), (2, 1)), cv_isite)) return [first_LR, second_LR, third_LR, forth_LR]
# -*- coding: utf-8 -*- # Author: Jiajun Ren <*****@*****.**> """ construct the operator matrix in the MPS sweep procedure """ from functools import reduce from collections import deque from renormalizer.mps.backend import np, backend from renormalizer.mps.matrix import Matrix, multi_tensor_contract, asxp, asnumpy sentinel = np.ones((1, 1, 1), dtype=backend.real_dtype) class Environ: def __init__(self, mps, mpo, domain=None, mps_conj=None): # todo: real disk and other backend # idx indicates the exact position of L or R, like # L(idx-1) - mpo(idx) - R(idx+1) self._virtual_disk = {} self._construct(mps, mpo, domain, mps_conj) def _construct(self, mps, mpo, domain=None, mps_conj=None): assert domain in ["L", "R", None] if mps_conj is None: mps_conj = mps.conj() if domain is None: self._construct(mps, mpo, "L", mps_conj)