Skip to content

Mismatch between correlator and expectation_value for fermionic PEPS #231

@Yue-Zhengyuan

Description

@Yue-Zhengyuan

It seems that the correlation function calculated from correlator (added in #210) is different from expectation_value for fermionic PEPS.

To reproduce the issue, run the following code that calculates the spin correlation $\langle S_i \cdot S_j \rangle$ along the horizontal direction in t-J model using a random iPEPS and a random CTMRGEnv (I'm now using TensorKitTensors instead of MPSKitModels):

using Random
using TensorKit
using PEPSKit
import TensorKitTensors: TJOperators as tJ

Pspace = tJ.tj_space(Trivial, Trivial)
Vspace = Vect[FermionParity](0 => 2, 1 => 2)
Espace = Vect[FermionParity](0 => 3, 1 => 3)
Random.seed!(100)
peps = InfinitePEPS(rand, Float64, Pspace, Vspace; unitcell=(2, 2));
env = CTMRGEnv(rand, Float64, peps, Espace);
lattice = collect(space(t, 1) for t in peps.A)

site0 = CartesianIndex(1, 1)
maxsep = 6
site1s = collect(site0 + CartesianIndex(0, i) for i in 1:maxsep)
op = tJ.S_exchange(Float64, Trivial, Trivial);

vals1 = collect(
    begin
        O = LocalOperator(lattice, (site0, site1) => op)
        val = expectation_value(peps, O, env)
    end for site1 in site1s
)
vals2 = correlator(peps, op, site0, site1s, env)
@show @show vals1  vals2 # false

But if I calculate the spin correlation in Heisenberg model, correlator and expectation_value produce (approximately) the same results. This is why the test test/examples/tf_ising.jldidn't catch the issue. I think we need to change how the column transfer matrix acts on the already-contracted part of the correlator "sandwich": for fermionic iPEPS, simply using * may have missed some twists.

T = TransferMatrix(Atop, sandwich, _dag(Abot))
Vo = Vo * T
Vn = Vn * T

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions