@@ -55,38 +55,38 @@ function expectation_value(ψ::AbstractMPS, (inds, O)::Pair)
5555 # some special cases that avoid using transfer matrices
5656 if length (sites) == 1
5757 AC = ψ. AC[sites[1 ]]
58- return @plansor conj (AC[4 5 ; 6 ]) *
59- conj (Ut[1 ]) * local_mpo[1 ][1 5 ; 3 2 ] * Ut[2 ] *
60- AC[4 3 ; 6 ]
61- end
62- if length (sites) == 2 && (sites[1 ] + 1 == sites[2 ])
58+ E = @plansor conj (AC[4 5 ; 6 ]) *
59+ conj (Ut[1 ]) * local_mpo[1 ][1 5 ; 3 2 ] * Ut[2 ] *
60+ AC[4 3 ; 6 ]
61+ elseif length (sites) == 2 && (sites[1 ] + 1 == sites[2 ])
6362 AC = ψ. AC[sites[1 ]]
6463 AR = ψ. AR[sites[2 ]]
6564 O1, O2 = local_mpo
66- return @plansor conj (AC[4 5 ; 10 ]) * conj (Ut[1 ]) * O1[1 5 ; 3 8 ] * AC[4 3 ; 6 ] *
67- conj (AR[10 9 ; 11 ]) * Ut[2 ] * O2[8 9 ; 7 2 ] * AR[6 7 ; 11 ]
68- end
69-
70- # generic case: write as Vl * T^N * Vr
71- # left side
72- T = storagetype ( site_type (ψ))
73- @plansor Vl[ - 1 - 2 ; - 3 ] := isomorphism (T ,
74- left_virtualspace (ψ, sites[1 ] - 1 ),
75- left_virtualspace (ψ, sites[ 1 ] - 1 ))[ - 1 ; - 3 ] *
76- conj (Ut[ - 2 ])
77-
78- # middle
79- M = foldl ( zip (sites, local_mpo); init = Vl) do v, (site, o)
80- if o isa Number
81- return scale! (v * TransferMatrix (ψ . AL[site], ψ . AL[site]), o)
82- else
83- return v * TransferMatrix (ψ . AL[site], o, ψ . AL[site])
65+ E = @plansor conj (AC[4 5 ; 10 ]) * conj (Ut[1 ]) * O1[1 5 ; 3 8 ] * AC[4 3 ; 6 ] *
66+ conj (AR[10 9 ; 11 ]) * Ut[2 ] * O2[8 9 ; 7 2 ] * AR[6 7 ; 11 ]
67+ else
68+ # generic case: write as Vl * T^N * Vr
69+ # left side
70+ T = storagetype ( site_type (ψ))
71+ @plansor Vl[ - 1 - 2 ; - 3 ] := isomorphism (T,
72+ left_virtualspace (ψ, sites[ 1 ] - 1 ) ,
73+ left_virtualspace (ψ, sites[1 ] - 1 ))[ - 1 ; - 3 ] *
74+ conj (Ut[ - 2 ])
75+
76+ # middle
77+ M = foldl ( zip (sites, local_mpo); init = Vl) do v, (site, o)
78+ if o isa Number
79+ return scale! (v * TransferMatrix (ψ . AL[site], ψ . AL[site]), o)
80+ else
81+ return v * TransferMatrix (ψ . AL[site], o, ψ . AL[site])
82+ end
8483 end
84+
85+ # right side
86+ E = @plansor M[1 2 ; 3 ] * Ut[2 ] * ψ. CR[sites[end ]][3 ; 4 ] *
87+ conj (ψ. CR[sites[end ]][1 ; 4 ])
8588 end
8689
87- # right side
88- E = @plansor M[1 2 ; 3 ] * Ut[2 ] * ψ. CR[sites[end ]][3 ; 4 ] *
89- conj (ψ. CR[sites[end ]][1 ; 4 ])
9090 return E / norm (ψ)^ 2
9191end
9292
0 commit comments