Description
Hi Lukas,
I'm trying to extend the function of correlator
to pair correlation like 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:
@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:
@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:
@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])