## Applying an iMPO to an iMPS

How do I use this algorithm? What does that parameter do?
clara
Posts: 2
Joined: 18 Oct 2022, 19:04

### Applying an iMPO to an iMPS

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.

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 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.

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 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.

Code: Select all

print(np.sqrt(phi.overlap(phi)))	# (4.953072653276047+0j)
print(phi.norm) 			# 1.0
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?

Clara
Johannes
Posts: 357
Joined: 21 Jul 2018, 12:52
Location: TU Munich

### Re: Applying an iMPO to an iMPS

The issue lies in different scalings with system size and hence definitions for overlaps that are not what you expect naively.

For infinite MPS, the overlap is formally 0, 1, or infinite, and as such not very usefull. Instead, MPS.overlap returns the "overlap per unit cell", to be precise the dominant eigenvalue of the MPS transfer matrix between phi and psi. The formal overlap is the product over different unit cells.
Note that this can not give the expected expectation value of H, because the latter is an extensive sum of energy densities.

I'm pretty sure you're not the only one puzzled by this, so I've now written a warning on this conceptual issue, and now raise warnings in MPS.apply_local_op, MPO.apply and MPS.overlap, unless you explicitly pass an understood_infinite=True argument.
clara
Posts: 2
Joined: 18 Oct 2022, 19:04

Hi Johannes,