@@ -98,6 +98,37 @@ function _addZ!(OR::LocalOperator{2, 2}, Z::AbstractTensorMap)
9898 return OR
9999end
100100
101+ # swap two operators to deal with horizontal bond
102+ _swap(A:: LocalOperator{1, 1} , B:: LocalOperator{1, 1} ) = B, A
103+ _swap(A:: LocalOperator{1, 1} , B:: LocalOperator{1, 2} ) = B, A
104+ _swap(A:: LocalOperator{2, 1} , B:: LocalOperator{1, 1} ) = B, A
105+ function _swap(A:: LocalOperator{1, 2} , B:: LocalOperator{2, 1} )
106+ return _swapOp(B), _swapOp(A)
107+ end
108+ function _swap(A:: LocalOperator{1, 2} , B:: LocalOperator{2, 2} )
109+ # | | | |
110+ # A-- --B--va --> B-- --A--va
111+ # | | | |
112+
113+ @tensor AB[d e; a b f] := A. A[a b c] * B. A[c d e f]
114+ # QR
115+ TA, TB = leftorth(AB)
116+
117+ return LocalOperator(permute(TA, (1 ,), (2 , 3 )), B. name, B. si, B. strength), LocalOperator(permute(TB, (1 , 2 ), (3 , 4 )), A. name, A. si, A. strength)
118+ end
119+ function _swap(A:: LocalOperator{2, 2} , B:: LocalOperator{2,1} )
120+ # | | | |
121+ # va--A-- --B --> va--B-- --A
122+ # | | | |
123+
124+ @tensor AB[a e f; b c] := A. A[a b c d] * B. A[d e f]
125+ # QR
126+ TA, TB = rightorth(AB)
127+
128+ return LocalOperator(permute(TA, (1 , 2 ), (3 , 4 )), B. name, B. si, B. strength), LocalOperator(permute(TB, (1 , 2 ), (3 ,)), A. name, A. si, A. strength)
129+ end
130+
131+
101132
102133
103134
0 commit comments