コード例 #1
0
ファイル: toricCode.py プロジェクト: ZENG-Hui/DMRG_py
def toEnvOperator(op):
    result = bops.unifyLegs(
        bops.unifyLegs(
            bops.unifyLegs(
                bops.unifyLegs(bops.permute(op, [0, 4, 1, 5, 2, 6, 3, 7]), 6,
                               7), 4, 5), 2, 3), 0, 1)
    tn.remove_node(op)
    return result
コード例 #2
0
ファイル: ising2d.py プロジェクト: NoaFeldman/DMRG_py
def getBMPS(hs, steps):
    for h in hs:
        h = np.round(h, 1)
        if int(h) == h:
            h = int(h)
        with open('ising/origTensors/ising_field_' + str(h) + '_A', 'rb') as f:
            ATensor = pickle.load(f)
        with open('ising/origTensors/ising_field_' + str(h) + '_B', 'rb') as f:
            BTensor = pickle.load(f)
        A = tn.Node(ATensor)
        A = bops.permute(A, [1, 2, 3, 0, 4])
        B = tn.Node(BTensor)
        B = bops.permute(B, [1, 2, 3, 0, 4])

        def toEnvOperator(op):
            result = bops.unifyLegs(
                bops.unifyLegs(
                    bops.unifyLegs(
                        bops.unifyLegs(
                            bops.permute(op, [0, 4, 1, 5, 2, 6, 3, 7]), 6, 7),
                        4, 5), 2, 3), 0, 1)
            tn.remove_node(op)
            return result

        AEnv = toEnvOperator(bops.multiContraction(A, A, '4', '4*'))
        BEnv = toEnvOperator(bops.multiContraction(B, B, '4', '4*'))

        envOpAB = bops.permute(bops.multiContraction(AEnv, BEnv, '1', '3'),
                               [0, 3, 2, 4, 1, 5])
        envOpBA = bops.permute(bops.multiContraction(BEnv, AEnv, '1', '3'),
                               [0, 3, 2, 4, 1, 5])

        curr = bops.permute(
            bops.multiContraction(envOpBA, envOpAB, '45', '01'),
            [0, 2, 4, 6, 1, 3, 5, 7])

        for i in range(2):
            [C, D, te] = bops.svdTruncation(curr, [0, 1, 2, 3], [4, 5, 6, 7],
                                            '>>',
                                            normalize=True)
            curr = bops.permute(bops.multiContraction(D, C, '23', '12'),
                                [1, 3, 0, 5, 2, 4])
            curr = bops.permute(
                bops.multiContraction(curr, envOpAB, '45', '01'),
                [0, 2, 4, 6, 1, 3, 5, 7])

        b = 1
        currAB = curr

        rowTensor = np.zeros((11, 4, 4, 11), dtype=complex)
        rowTensor[0, 3, 3, 0] = 1
        rowTensor[1, 3, 3, 2] = 1
        rowTensor[2, 3, 3, 3] = 1
        rowTensor[3, 3, 0, 4] = 1
        rowTensor[4, 0, 3, 1] = 1
        rowTensor[5, 3, 3, 6] = 1
        rowTensor[6, 3, 0, 7] = 1
        rowTensor[7, 0, 3, 8] = 1
        rowTensor[8, 3, 3, 5] = 1
        row = tn.Node(rowTensor)

        print('60')
        upRow = bops.unifyLegs(
            bops.unifyLegs(
                bops.unifyLegs(
                    bops.unifyLegs(
                        bops.permute(
                            bops.multiContraction(row, tn.Node(currAB.tensor),
                                                  '12', '04'),
                            [0, 2, 3, 4, 7, 1, 5, 6]), 5, 6), 5, 6), 0, 1), 0,
            1)
        [C, D, te] = bops.svdTruncation(upRow, [0, 1], [2, 3],
                                        '>>',
                                        normalize=True)
        upRow = bops.multiContraction(D, C, '2', '0')
        [cUp, dUp, te] = bops.svdTruncation(upRow, [0, 1], [2, 3],
                                            '>>',
                                            normalize=True)

        GammaC, LambdaC, GammaD, LambdaD = peps.getBMPSRowOps(
            cUp, tn.Node(np.ones(cUp[2].dimension)), dUp,
            tn.Node(np.ones(dUp[2].dimension)), AEnv, BEnv, steps)
        cUp = bops.multiContraction(GammaC, LambdaC, '2', '0', isDiag2=True)
        dUp = bops.multiContraction(GammaD, LambdaD, '2', '0', isDiag2=True)
        upRow = bops.multiContraction(cUp, dUp, '2', '0')
        downRow = bops.copyState([upRow])[0]
        rightRow = peps.bmpsCols(upRow,
                                 downRow,
                                 AEnv,
                                 BEnv,
                                 steps,
                                 option='right',
                                 X=upRow)
        leftRow = peps.bmpsCols(upRow,
                                downRow,
                                AEnv,
                                BEnv,
                                steps,
                                option='left',
                                X=upRow)
        circle = bops.multiContraction(
            bops.multiContraction(
                bops.multiContraction(upRow, rightRow, '3', '0'), upRow, '5',
                '0'), leftRow, '70', '03')

        openA = tn.Node(
            np.transpose(
                np.reshape(np.kron(A.tensor, np.conj(A.tensor)),
                           [d**2, d**2, d**2, d**2, d, d]),
                [4, 0, 1, 2, 3, 5]))
        openB = tn.Node(
            np.transpose(
                np.reshape(np.kron(B.tensor, np.conj(B.tensor)),
                           [d**2, d**2, d**2, d**2, d, d]),
                [4, 0, 1, 2, 3, 5]))
        ABNet = bops.permute(
            bops.multiContraction(
                bops.multiContraction(openB, openA, '2', '4'),
                bops.multiContraction(openA, openB, '2', '4'),
                '28',
                '16',
                cleanOr1=True,
                cleanOr2=True),
            [1, 5, 6, 13, 14, 9, 10, 2, 0, 4, 8, 12, 3, 7, 11, 15])
        dm = bops.multiContraction(circle, ABNet, '01234567', '01234567')
        ordered = np.round(np.reshape(dm.tensor, [16, 16]), 14)
        ordered /= np.trace(ordered)
        print(h, getM(ordered))
        with open('ising/bmpsResults_' + str(h), 'wb') as f:
            pickle.dump(
                [upRow, downRow, leftRow, rightRow, openA, openB, A, B], f)
コード例 #3
0
        rowTensor[0, 0, 0, 0] = 1
        rowTensor[1, 0, 0, 2] = 1
        rowTensor[2, 0, 0, 3] = 1
        rowTensor[3, 0, 3, 4] = 1
        rowTensor[4, 3, 0, 1] = 1
        rowTensor[5, 0, 0, 6] = 1
        rowTensor[6, 0, 3, 7] = 1
        rowTensor[7, 3, 0, 8] = 1
        rowTensor[8, 0, 0, 5] = 1
        row = tn.Node(rowTensor)

        upRow = bops.unifyLegs(
            bops.unifyLegs(
                bops.unifyLegs(
                    bops.unifyLegs(
                        bops.permute(
                            bops.multiContraction(row, tn.Node(currAB.tensor),
                                                  '12', '04'),
                            [0, 2, 3, 4, 7, 1, 5, 6]), 5, 6), 5, 6), 0, 1), 0,
            1)
        [C, D, te] = bops.svdTruncation(upRow, [0, 1], [2, 3],
                                        '>>',
                                        normalize=True)
        upRow = bops.multiContraction(D, C, '2', '0')
        [cUp, dUp, te] = bops.svdTruncation(upRow, [0, 1], [2, 3],
                                            '>>',
                                            normalize=True)
        GammaC, LambdaC, GammaD, LambdaD = peps.getBMPSRowOps(
            cUp, tn.Node(np.ones(cUp[2].dimension)), dUp,
            tn.Node(np.ones(dUp[2].dimension)), AEnv, BEnv, 50)
        cUp = bops.multiContraction(GammaC, LambdaC, '2', '0', isDiag2=True)
コード例 #4
0
ファイル: PEPS.py プロジェクト: NoaFeldman/DMRG_py
def bmpsRowStep(gammaL, lambdaMid, gammaR, lambdaSide, envOp):
    row = bops.multiContraction(bops.multiContraction(bops.multiContraction(
        bops.multiContraction(lambdaSide, gammaL, '1', '0', isDiag1=True),
        lambdaMid,
        '2',
        '0',
        cleanOr1=True,
        cleanOr2=True,
        isDiag2=True),
                                                      gammaR,
                                                      '2',
                                                      '0',
                                                      cleanOr1=True,
                                                      cleanOr2=True),
                                lambdaSide,
                                '3',
                                '0',
                                cleanOr1=True,
                                isDiag2=True)
    opRow = bops.permute(
        bops.multiContraction(row, envOp, '12', '01', cleanOr1=True),
        [0, 2, 4, 5, 1, 3])
    [U, S, V, truncErr] = bops.svdTruncation(opRow, [0, 1, 2], [3, 4, 5],
                                             dir='>*<',
                                             maxBondDim=chi)
    newLambdaMid = bops.multNode(S, 1 / np.sqrt(sum(S.tensor**2)))
    lambdaSideInv = tn.Node(
        np.array([1 / val if val > 1e-15 else 0 for val in lambdaSide.tensor],
                 dtype=complex))
    newGammaL = bops.multiContraction(lambdaSideInv,
                                      U,
                                      '1',
                                      '0',
                                      cleanOr2=True,
                                      isDiag1=True)
    splitter = tn.Node(
        bops.getLegsSplitterTensor(newGammaL[0].dimension,
                                   newGammaL[1].dimension))
    newGammaL = bops.unifyLegs(newGammaL, 0, 1)
    newGammaR = bops.multiContraction(V,
                                      lambdaSideInv,
                                      '2',
                                      '0',
                                      cleanOr1=True,
                                      cleanOr2=True,
                                      isDiag2=True)
    newGammaR = bops.unifyLegs(newGammaR, 2, 3)
    newLambdaSide = bops.multiContraction(bops.multiContraction(lambdaSide,
                                                                splitter,
                                                                '1',
                                                                '0',
                                                                cleanOr1=True,
                                                                isDiag1=True),
                                          splitter,
                                          '01',
                                          '01',
                                          cleanOr1=True,
                                          cleanOr2=True)
    temp = newLambdaSide
    newLambdaSide = tn.Node(np.diag(newLambdaSide.tensor))
    tn.remove_node(temp)
    return newGammaL, newLambdaMid, newGammaR, newLambdaSide