we have encountered some problems when appying an iMPO to an iMPS for an infinite system.
I include a minimal excample to show what we are worried about.
Let us assume to use a simple chain with a nearest neighbor hopping at half filling.
Code: Select all
class MyNewModel(CouplingMPOModel):
def __init__(self, model_params):
CouplingMPOModel.__init__(self, model_params)
def init_terms(self, model_params):
t = np.asarray(model_params.get('t', 1.))
self.add_coupling(-t, 0, 'Cd', 0, 'C', 1, plus_hc=True)
site = FermionSite(conserve='N')
lat=Chain(2, site, bc_MPS='infinite', bc='periodic')
model_params=dict(t = 1.0, lattice=lat)
M=MyNewModel(model_params)
product_state = ['empty', 'full']
psi = MPS.from_product_state([site]*len(product_state), product_state, bc='infinite')
info = dmrg.run(psi, M, options={})
E = info['E']
We would then expect the overlap \(\Bra{\Psi}\Ket{\Phi}\) to give us the same result as the expectation_value function of H or the energy that we get in the DMRG calculation. Unfortunately these results do not agree.
Code: Select all
HMPO = M.calc_H_MPO()
phi = psi.copy()
HMPO.apply(phi, options={'compression_method':'SVD', 'trunc_params':{'chi_max':100}})
print(psi.overlap(phi)) # (-3.501683217637142+0j)
print(HMPO.expectation_value(psi)) # -0.6366189922416629
print(E) # -0.6366190363299609
We also tried different bond dimensions and compression methods but we never got reasonable results.
Code: Select all
print(np.sqrt(phi.overlap(phi))) # (4.953072653276047+0j)
print(phi.norm) # 1.0
For a finite MPS everything seems to be fine and we only run into this issue when using an infinite system.
Is there anything that we need to do different in that case? Or is there a good way to work around it?
Thanks in advance,
Clara