Skip to content

Commit 4d0dd17

Browse files
committed
format transfer
1 parent f9a1f49 commit 4d0dd17

File tree

2 files changed

+65
-55
lines changed

2 files changed

+65
-55
lines changed

src/transfermatrix/transfer.jl

Lines changed: 44 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,18 @@ apply a transfer matrix to the left.
1515
└─Ā─
1616
```
1717
"""
18-
@generated function transfer_left(v::AbstractTensorMap{<:Any,S,1,N₁},
19-
A::GenericMPSTensor{S,N₂},
20-
Abar::GenericMPSTensor{S,N₂}) where {S,N₁,N₂}
18+
@generated function transfer_left(
19+
v::AbstractTensorMap{<:Any, S, 1, N₁},
20+
A::GenericMPSTensor{S, N₂},
21+
Abar::GenericMPSTensor{S, N₂}
22+
) where {S, N₁, N₂}
2123
t_out = tensorexpr(:v, -1, -(2:(N₁ + 1)))
2224
t_top = tensorexpr(:A, 2:(N₂ + 1), -(N₁ + 1))
2325
t_bot = tensorexpr(:Abar, (1, (3:(N₂ + 1))...), -1)
2426
t_in = tensorexpr(:v, 1, (-(2:N₁)..., 2))
25-
return macroexpand(@__MODULE__,
26-
:(return @plansor $t_out := $t_in * $t_top * conj($t_bot)))
27+
return macroexpand(
28+
@__MODULE__, :(return @plansor $t_out := $t_in * $t_top * conj($t_bot))
29+
)
2730
end
2831

2932
"""
@@ -37,61 +40,64 @@ apply a transfer matrix to the right.
3740
─Ā─┘
3841
```
3942
"""
40-
@generated function transfer_right(v::AbstractTensorMap{<:Any,S,1,N₁},
41-
A::GenericMPSTensor{S,N₂},
42-
Abar::GenericMPSTensor{S,N₂}) where {S,N₁,N₂}
43+
@generated function transfer_right(
44+
v::AbstractTensorMap{<:Any, S, 1, N₁},
45+
A::GenericMPSTensor{S, N₂},
46+
Abar::GenericMPSTensor{S, N₂}
47+
) where {S, N₁, N₂}
4348
t_out = tensorexpr(:v, -1, -(2:(N₁ + 1)))
4449
t_top = tensorexpr(:A, (-1, reverse(3:(N₂ + 1))...), 1)
4550
t_bot = tensorexpr(:Abar, (-(N₁ + 1), reverse(3:(N₂ + 1))...), 2)
4651
t_in = tensorexpr(:v, 1, (-(2:N₁)..., 2))
47-
return macroexpand(@__MODULE__,
48-
:(return @plansor $t_out := $t_top * conj($t_bot) * $t_in))
52+
return macroexpand(
53+
@__MODULE__, :(return @plansor $t_out := $t_top * conj($t_bot) * $t_in)
54+
)
4955
end
5056

5157
# transfer, but the upper A is an excited tensor
5258
function transfer_left(v::MPSBondTensor, A::MPOTensor, Ab::MPSTensor)
53-
@plansor t[-1; -2 -3] := v[1; 2] * A[2 3; -2 -3] * conj(Ab[1 3; -1])
59+
return @plansor t[-1; -2 -3] := v[1; 2] * A[2 3; -2 -3] * conj(Ab[1 3; -1])
5460
end
5561
function transfer_right(v::MPSBondTensor, A::MPOTensor, Ab::MPSTensor)
56-
@plansor t[-1; -2 -3] := A[-1 3; -2 1] * v[1; 2] * conj(Ab[-3 3; 2])
62+
return @plansor t[-1; -2 -3] := A[-1 3; -2 1] * v[1; 2] * conj(Ab[-3 3; 2])
5763
end
5864

5965
# transfer, but the upper A is an excited tensor and there is an mpo leg being passed through
6066
function transfer_left(v::MPSTensor, A::MPOTensor, Ab::MPSTensor)
61-
@plansor t[-1 -2; -3 -4] := v[1 3; 4] * A[4 5; -3 -4] * τ[3 2; 5 -2] * conj(Ab[1 2; -1])
67+
return @plansor t[-1 -2; -3 -4] := v[1 3; 4] * A[4 5; -3 -4] * τ[3 2; 5 -2] * conj(Ab[1 2; -1])
6268
end
6369

6470
function transfer_right(v::MPSTensor, A::MPOTensor, Ab::MPSTensor)
65-
@plansor t[-1 -2; -3 -4] := A[-1 4; -3 5] * τ[-2 3; 4 2] * conj(Ab[-4 3; 1]) * v[5 2; 1]
71+
return @plansor t[-1 -2; -3 -4] := A[-1 4; -3 5] * τ[-2 3; 4 2] * conj(Ab[-4 3; 1]) * v[5 2; 1]
6672
end
6773

6874
# the transfer operation of a density matrix with a utility leg in its codomain is ill defined - how should one braid the utility leg?
6975
# hence the checks - to make sure that this operation is uniquely defined
7076
function transfer_left(v::MPSTensor{S}, A::MPSTensor{S}, Ab::MPSTensor{S}) where {S}
7177
check_unambiguous_braiding(space(v, 2))
72-
@plansor v[-1 -2; -3] := v[1 2; 4] * A[4 5; -3] * τ[2 3; 5 -2] * conj(Ab[1 3; -1])
78+
return @plansor v[-1 -2; -3] := v[1 2; 4] * A[4 5; -3] * τ[2 3; 5 -2] * conj(Ab[1 3; -1])
7379
end
7480
function transfer_right(v::MPSTensor{S}, A::MPSTensor{S}, Ab::MPSTensor{S}) where {S}
7581
check_unambiguous_braiding(space(v, 2))
76-
@plansor v[-1 -2; -3] := A[-1 2; 1] * τ[-2 4; 2 3] * conj(Ab[-3 4; 5]) * v[1 3; 5]
82+
return @plansor v[-1 -2; -3] := A[-1 2; 1] * τ[-2 4; 2 3] * conj(Ab[-3 4; 5]) * v[1 3; 5]
7783
end
7884

7985
# the transfer operation with a utility leg in both the domain and codomain is also ill defined - only due to the codomain utility space
8086
function transfer_left(v::MPOTensor{S}, A::MPSTensor{S}, Ab::MPSTensor{S}) where {S}
8187
check_unambiguous_braiding(space(v, 2))
82-
@plansor t[-1 -2; -3 -4] := v[1 2; -3 4] * A[4 5; -4] * τ[2 3; 5 -2] * conj(Ab[1 3; -1])
88+
return @plansor t[-1 -2; -3 -4] := v[1 2; -3 4] * A[4 5; -4] * τ[2 3; 5 -2] * conj(Ab[1 3; -1])
8389
end
8490
function transfer_right(v::MPOTensor{S}, A::MPSTensor{S}, Ab::MPSTensor{S}) where {S}
8591
check_unambiguous_braiding(space(v, 2))
86-
@plansor t[-1 -2; -3 -4] := A[-1 2; 1] * τ[-2 4; 2 3] * conj(Ab[-4 4; 5]) * v[1 3; -3 5]
92+
return @plansor t[-1 -2; -3 -4] := A[-1 2; 1] * τ[-2 4; 2 3] * conj(Ab[-4 4; 5]) * v[1 3; -3 5]
8793
end
8894

8995
#transfer for 2 mpo tensors
9096
function transfer_left(v::MPSBondTensor, A::MPOTensor, B::MPOTensor)
91-
@plansor t[-1; -2] := v[1; 2] * A[2 3; 4 -2] * conj(B[1 3; 4 -1])
97+
return @plansor t[-1; -2] := v[1; 2] * A[2 3; 4 -2] * conj(B[1 3; 4 -1])
9298
end
9399
function transfer_right(v::MPSBondTensor, A::MPOTensor, B::MPOTensor)
94-
@plansor t[-1; -2] := A[-1 3; 4 1] * conj(B[-2 3; 4 2]) * v[1; 2]
100+
return @plansor t[-1; -2] := A[-1 3; 4 1] * conj(B[-2 3; 4 2]) * v[1; 2]
95101
end
96102

97103
# ----------------------------------------------------
@@ -102,37 +108,39 @@ transfer_left(v, ::Nothing, A, B) = transfer_left(v, A, B);
102108
transfer_right(v, ::Nothing, A, B) = transfer_right(v, A, B);
103109
#mpo transfer
104110
function transfer_left(x::MPSTensor, O::MPOTensor, A::MPSTensor, Ab::MPSTensor)
105-
@plansor y[-1 -2; -3] := x[1 2; 4] * A[4 5; -3] * O[2 3; 5 -2] * conj(Ab[1 3; -1])
111+
return @plansor y[-1 -2; -3] := x[1 2; 4] * A[4 5; -3] * O[2 3; 5 -2] * conj(Ab[1 3; -1])
106112
end
107113
function transfer_right(v::MPSTensor, O::MPOTensor, A::MPSTensor, Ab::MPSTensor)
108-
@plansor v[-1 -2; -3] := A[-1 2; 1] * O[-2 4; 2 3] * conj(Ab[-3 4; 5]) * v[1 3; 5]
114+
return @plansor v[-1 -2; -3] := A[-1 2; 1] * O[-2 4; 2 3] * conj(Ab[-3 4; 5]) * v[1 3; 5]
109115
end
110116

111117
#mpo transfer, but with A an excitation-tensor
112118
function transfer_left(v::MPSTensor, O::MPOTensor, A::MPOTensor, Ab::MPSTensor)
113-
@plansor t[-1 -2; -3 -4] := v[4 2; 1] * A[1 3; -3 -4] * O[2 5; 3 -2] * conj(Ab[4 5; -1])
119+
return @plansor t[-1 -2; -3 -4] := v[4 2; 1] * A[1 3; -3 -4] * O[2 5; 3 -2] * conj(Ab[4 5; -1])
114120
end
115121
function transfer_right(v::MPSTensor, O::MPOTensor, A::MPOTensor, Ab::MPSTensor)
116-
@plansor t[-1 -2; -3 -4] := A[-1 4; -3 5] * O[-2 2; 4 3] * conj(Ab[-4 2; 1]) * v[5 3; 1]
122+
return @plansor t[-1 -2; -3 -4] := A[-1 4; -3 5] * O[-2 2; 4 3] * conj(Ab[-4 2; 1]) * v[5 3; 1]
117123
end
118124

119125
#mpo transfer, with an excitation leg
120126
function transfer_left(v::MPOTensor, O::MPOTensor, A::MPSTensor, Ab::MPSTensor)
121-
@plansor v[-1 -2; -3 -4] := v[4 2; -3 1] * A[1 3; -4] * O[2 5; 3 -2] * conj(Ab[4 5; -1])
127+
return @plansor v[-1 -2; -3 -4] := v[4 2; -3 1] * A[1 3; -4] * O[2 5; 3 -2] * conj(Ab[4 5; -1])
122128
end
123129
function transfer_right(v::MPOTensor, O::MPOTensor, A::MPSTensor, Ab::MPSTensor)
124-
@plansor v[-1 -2; -3 -4] := A[-1 4; 5] * O[-2 2; 4 3] *
125-
conj(Ab[-4 2; 1]) * v[5 3; -3 1]
130+
return @plansor v[-1 -2; -3 -4] := A[-1 4; 5] * O[-2 2; 4 3] *
131+
conj(Ab[-4 2; 1]) * v[5 3; -3 1]
126132
end
127133

128134
# desity matrix transfer
129-
function transfer_left(x::MPSTensor, O::MPOTensor, A::GenericMPSTensor{<:Any,3},
130-
Ab::GenericMPSTensor{<:Any,3})
131-
@plansor y[-1 -2; -3] ≔ x[1 2; 6] * A[6 7 8; -3] * O[2 3; 7 5] * τ[5 4; 8 -2] *
132-
conj(Ab[1 3 4; -1])
133-
end
134-
function transfer_right(x::MPSTensor, O::MPOTensor, A::GenericMPSTensor{<:Any,3},
135-
Ab::GenericMPSTensor{<:Any,3})
136-
@plansor y[-1 -2; -3] ≔ A[-1 4 2; 1] * O[-2 6; 4 5] * τ[5 7; 2 3] *
137-
conj(Ab[-3 6 7; 8]) * x[1 3; 8]
135+
function transfer_left(
136+
x::MPSTensor, O::MPOTensor, A::GenericMPSTensor{<:Any, 3}, Ab::GenericMPSTensor{<:Any, 3}
137+
)
138+
return @plansor y[-1 -2; -3] ≔ x[1 2; 6] * A[6 7 8; -3] * O[2 3; 7 5] * τ[5 4; 8 -2] *
139+
conj(Ab[1 3 4; -1])
140+
end
141+
function transfer_right(
142+
x::MPSTensor, O::MPOTensor, A::GenericMPSTensor{<:Any, 3}, Ab::GenericMPSTensor{<:Any, 3}
143+
)
144+
return @plansor y[-1 -2; -3] ≔ A[-1 4 2; 1] * O[-2 6; 4 5] * τ[5 7; 2 3] *
145+
conj(Ab[-3 6 7; 8]) * x[1 3; 8]
138146
end
Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
11
abstract type AbstractTransferMatrix end;
22

33
# single site transfer
4-
struct SingleTransferMatrix{A<:AbstractTensorMap,B,C<:AbstractTensorMap} <:
5-
AbstractTransferMatrix
4+
struct SingleTransferMatrix{A <: AbstractTensorMap, B, C <: AbstractTensorMap} <:
5+
AbstractTransferMatrix
66
above::A
77
middle::B
88
below::C
99
isflipped::Bool
1010
end
1111

1212
#the product of transfer matrices is its own type
13-
struct ProductTransferMatrix{T<:AbstractTransferMatrix} <: AbstractTransferMatrix
13+
struct ProductTransferMatrix{T <: AbstractTransferMatrix} <: AbstractTransferMatrix
1414
tms::Vector{T} # I don't want to use tuples, as an infinite mps transfer matrix will then be non-inferable
1515
end
1616

1717
ProductTransferMatrix(v::AbstractVector) = ProductTransferMatrix(convert(Vector, v));
1818

1919
# a subset of possible operations, but certainly not all of them
20-
function Base.:*(prod::ProductTransferMatrix{T}, tm::T) where {T<:AbstractTransferMatrix}
20+
function Base.:*(prod::ProductTransferMatrix{T}, tm::T) where {T <: AbstractTransferMatrix}
2121
return ProductTransferMatrix(vcat(prod.tms, tm))
2222
end;
23-
function Base.:*(tm::T, prod::ProductTransferMatrix{T}) where {T<:AbstractTransferMatrix}
23+
function Base.:*(tm::T, prod::ProductTransferMatrix{T}) where {T <: AbstractTransferMatrix}
2424
return ProductTransferMatrix(vcat(prod.tms, tm))
2525
end;
26-
Base.:*(tm1::T, tm2::T) where {T<:SingleTransferMatrix} = ProductTransferMatrix([tm1, tm2])
26+
Base.:*(tm1::T, tm2::T) where {T <: SingleTransferMatrix} = ProductTransferMatrix([tm1, tm2])
2727

2828
# regularized transfer matrices; where we project out after every full application
29-
struct RegTransferMatrix{T<:AbstractTransferMatrix,L,R} <: AbstractTransferMatrix
29+
struct RegTransferMatrix{T <: AbstractTransferMatrix, L, R} <: AbstractTransferMatrix
3030
tm::T
3131
lvec::L
3232
rvec::R
@@ -44,7 +44,7 @@ Base.:*(tm::AbstractTransferMatrix, vec) = tm(vec);
4444
Base.:*(vec, tm::AbstractTransferMatrix) = flip(tm)(vec);
4545

4646
# TransferMatrix acting as a function
47-
(d::ProductTransferMatrix)(vec) = foldr((a, b) -> a(b), d.tms; init=vec);
47+
(d::ProductTransferMatrix)(vec) = foldr((a, b) -> a(b), d.tms; init = vec);
4848
function (d::SingleTransferMatrix)(vec)
4949
return if d.isflipped
5050
transfer_left(vec, d.middle, d.above, d.below)
@@ -57,34 +57,36 @@ end;
5757
# constructors
5858
TransferMatrix(a) = TransferMatrix(a, nothing, a);
5959
TransferMatrix(a, b) = TransferMatrix(a, nothing, b);
60-
function TransferMatrix(a::AbstractTensorMap, b, c::AbstractTensorMap, isflipped=false)
60+
function TransferMatrix(a::AbstractTensorMap, b, c::AbstractTensorMap, isflipped = false)
6161
return SingleTransferMatrix(a, b, c, isflipped)
62-
end;
63-
function TransferMatrix(a::AbstractVector, b, c::AbstractVector, isflipped=false)
62+
end
63+
function TransferMatrix(a::AbstractVector, b, c::AbstractVector, isflipped = false)
6464
tot = ProductTransferMatrix(convert(Vector, TransferMatrix.(a, b, c)))
6565
return isflipped ? flip(tot) : tot
6666
end
6767

6868
regularize(t::AbstractTransferMatrix, lvec, rvec) = RegTransferMatrix(t, lvec, rvec);
6969

7070
function regularize!(v::MPSBondTensor, lvec::MPSBondTensor, rvec::MPSBondTensor)
71-
@plansor v[-1; -2] -= lvec[1; 2] * v[2; 1] * rvec[-1; -2]
71+
return @plansor v[-1; -2] -= lvec[1; 2] * v[2; 1] * rvec[-1; -2]
7272
end
7373

7474
function regularize!(v::MPSTensor, lvec::MPSBondTensor, rvec::MPSBondTensor)
75-
@plansor v[-1 -2; -3] -= lvec[1; 2] * v[2 -2; 1] * rvec[-1; -3]
75+
return @plansor v[-1 -2; -3] -= lvec[1; 2] * v[2 -2; 1] * rvec[-1; -3]
7676
end
7777

78-
function regularize!(v::AbstractTensorMap{T,S,1,2} where {T,S}, lvec::MPSBondTensor,
79-
rvec::MPSBondTensor)
80-
@plansor v[-1; -2 -3] -= lvec[1; 2] * v[2; -2 1] * rvec[-1; -3]
78+
function regularize!(
79+
v::AbstractTensorMap{T, S, 1, 2} where {T, S}, lvec::MPSBondTensor,
80+
rvec::MPSBondTensor
81+
)
82+
return @plansor v[-1; -2 -3] -= lvec[1; 2] * v[2; -2 1] * rvec[-1; -3]
8183
end
8284

8385
function regularize!(v::MPOTensor, lvec::MPSTensor, rvec::MPSTensor)
84-
@plansor v[-1 -2; -3 -4] -= v[1 2; -3 3] * lvec[3 2; 1] * rvec[-1 -2; -4]
86+
return @plansor v[-1 -2; -3 -4] -= v[1 2; -3 3] * lvec[3 2; 1] * rvec[-1 -2; -4]
8587
end
8688

8789
function regularize!(v::MPOTensor, lvec::MPSBondTensor, rvec::MPSBondTensor)
88-
@plansor v[-1 -2; -3 -4] -= τ[6 2; 3 4] * v[3 4; -3 5] * lvec[5; 2] * rvec[-1; 1] *
89-
τ[-2 -4; 1 6]
90+
return @plansor v[-1 -2; -3 -4] -= τ[6 2; 3 4] * v[3 4; -3 5] * lvec[5; 2] * rvec[-1; 1] *
91+
τ[-2 -4; 1 6]
9092
end

0 commit comments

Comments
 (0)