@@ -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+ )
2730end
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+ )
4955end
5056
5157# transfer, but the upper A is an excited tensor
5258function 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 ])
5460end
5561function 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 ])
5763end
5864
5965# transfer, but the upper A is an excited tensor and there is an mpo leg being passed through
6066function 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 ])
6268end
6369
6470function 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 ]
6672end
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
7076function 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 ])
7379end
7480function 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 ]
7783end
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
8086function 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 ])
8389end
8490function 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 ]
8793end
8894
8995# transfer for 2 mpo tensors
9096function 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 ])
9298end
9399function 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 ]
95101end
96102
97103# ----------------------------------------------------
@@ -102,37 +108,39 @@ transfer_left(v, ::Nothing, A, B) = transfer_left(v, A, B);
102108transfer_right (v, :: Nothing , A, B) = transfer_right (v, A, B);
103109# mpo transfer
104110function 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 ])
106112end
107113function 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 ]
109115end
110116
111117# mpo transfer, but with A an excitation-tensor
112118function 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 ])
114120end
115121function 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 ]
117123end
118124
119125# mpo transfer, with an excitation leg
120126function 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 ])
122128end
123129function 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 ]
126132end
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 ]
138146end
0 commit comments