Skip to content

Extend correlator to pair correlation #300

Open
@ZongYongyue

Description

@ZongYongyue

Hi Lukas,

I'm trying to extend the function of correlator to pair correlation like $$\langle c^\dagger_i c^\dagger_j c_k c_l\rangle$$. I'm doing two things for this purpose: one is adding new method for transfer_left:

function transfer_left(v::AbstractTensorMap{T, S, 4, 1}, A::MPSTensor{S}, Ab::MPSTensor{S}) where {T, S}
    check_unambiguous_braiding(space(v, 4))
    @plansor v[-1 -2 -3 -4; -5] := v[1 2 3 4; 5] * A[5 6; -5] * τ[4 7; 6 -4] * τ[3 8; 7 -3] * τ[2 9; 8 -2] * conj(Ab[1 9; -1])
end

function transfer_left(v::AbstractTensorMap{T, S, 3, 1}, A::MPSTensor{S}, Ab::MPSTensor{S}) where {T, S}
    check_unambiguous_braiding(space(v, 2))
    @plansor v[-1 -2 -3; -4] := v[1 2 3; 4] * A[4 5; -4] * τ[3 6; 5 -3] * τ[2 7; 6 -2] * conj(Ab[1 7; -1])
end

to deal with the transfer matrix like this:
Image

        @plansor Vᵢ[-1 -2; -3] := state.AC[i][3 4; -3] * conj(U[1]) * I[1 2; 4 -2] *
                            conj(state.AC[i][3 2; -1])
        if k > (i + 1)
            Vᵢ = Vᵢ * TransferMatrix(state.AR[(i + 1):(k - 1)])
        end                     
        @plansor Vₖ[-1 -2 -3 -4; -5] := Vᵢ[1 2; 3] * state.AR[k][3 4; -5] * 
                            K[5 6; 4 -4] * τ[5 7; 6 -3] * τ[2 8; 7 -2] * conj(state.AR[k][1 8; -1])
        if j > (k + 1)
             Vₖ = Vₖ * TransferMatrix(state.AR[(k + 1):(j - 1)])
        end

It works, but I am not sure if I write it in a right way and I don't know the means of this functioncheck_unambiguous_braiding here.

The another thing is to contract different diagrams for different orders of i, j ,k ,l , like i<j<k<l,i<j=k<l, i=k<l<j ... I have successfully done some of them, but I encounter a problem with this diagram:
Image

      @plansor Vₖ[-1 -2 -3; -4] := state.AC[k][1 2; -4] * K[3 4; 2 -3] *
                          τ[3 5; 4 -2] * conj(state.AC[k][1 5; -1])
  #     if i > (k + 1)
  #         Vₖ = Vₖ * TransferMatrix(state.AR[(k + 1):(i - 1)])
  #     end
      @plansor Vᵢ[-1 -2 -3 -4; -5] := Vₖ[1 2 3; 4] * state.AR[i][4 5; -5] * τ[3 6; 5 -4] * 
                          τ[2 7; 6 -3] * conj(U[8]) * I[8 9; 7 -2] * conj(state.AR[i][1 9; -1])

It returns ERROR: LoadError: ArgumentError: not a planar diagram expression: ((var"##state.AR[i]#1082"[4 5; -5] * (var"##τ#1091"[(3, 6); (5, -4)] * ((Vₖ[1 2 3; 4] * var"##state.AR[i]#1082"'[(-1,); (1, 9)]) * var"##τ#1092"[(2, 7); (6, -3)]))) * I[8 9; 7 -2]) * U'[(); (8,)]

I'm not sure where is wrong, and it is a little weird because I follow the same thought and contract other diagrams successfully like:
Image

@plansor Vᵢ[-1 -2; -3] := state.AC[i][3 4; -3] * conj(U[1]) * I[1 2; 4 -2] *
                  conj(state.AC[i][3 2; -1])
if k > (i + 1)
  Vᵢ = Vᵢ * TransferMatrix(state.AR[(i + 1):(k - 1)])
end                     
@plansor Vₖ[-1 -2 -3 -4; -5] := Vᵢ[1 2; 3] * state.AR[k][3 4; -5] * 
                  K[5 6; 4 -4] * τ[5 7; 6 -3] * τ[2 8; 7 -2] * conj(state.AR[k][1 8; -1])
if l > (k + 1)
  Vₖ = Vₖ * TransferMatrix(state.AR[(k + 1):(l - 1)])
end
@plansor Vₗ[-1 -2 -3; -4] := Vₖ[1 2 3 4; 5] * state.AR[l][5 6; -4] * L[4 7; 6 10] * U[10] *
                  τ[3 8; 7 -3] * τ[2 9; 8 -2] * conj(state.AR[l][1 9; -1])
if j > (l + 1)
  Vₗ = Vₗ * TransferMatrix(state.AR[(l + 1):(j - 1)])
end
G = @plansor Vₗ[1 2 3; 4] * state.AR[j][4 5; 9] *
                  τ[3 6; 5 7] * J[2 8; 6 7] * conj(state.AR[j][1 8; 9])

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions