Skip to content

Commit df1800c

Browse files
authored
ensure expval returns normalized values (#200)
1 parent f960d29 commit df1800c

File tree

1 file changed

+26
-26
lines changed

1 file changed

+26
-26
lines changed

src/algorithms/expval.jl

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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
9191
end
9292

0 commit comments

Comments
 (0)