Applying an iMPO to an iMPS
Posted: 18 Oct 2022, 20:34
Hello,
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.
We then want to define a new state \(\Ket{\Phi}\) = H\(\Ket{\Psi}\) , where \(\Ket{\Psi}\) is the ground state of the system.
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.
We also tried to check the norm of this new state. We would assume that the norm of \(\Ket{\Phi}\) should be given by |E| since \(\Ket{\Psi}\) was normalized. Nevertheless, we find different result depending on whether we use the overlap or norm. But both do not give us the correct result.
We also tried different bond dimensions and compression methods but we never got reasonable results.
The same problems also occur when using the current operator instead of the Hamiltonian.
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
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