Exemple #1
0
 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]
Exemple #2
0
    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]
Exemple #3
0
def ones(shape, dtype=None):
    if dtype is None:
        dtype = backend.real_dtype
    return Matrix(np.ones(shape), dtype=dtype)
Exemple #4
0
    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]
Exemple #5
0
# -*- 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)