MPOEnvironmentBuilder

  • full name: tenpy.networks.mpo.MPOEnvironmentBuilder

  • parent module: tenpy.networks.mpo

  • type: class

Inheritance Diagram

Inheritance diagram of tenpy.networks.mpo.MPOEnvironmentBuilder

Methods

MPOEnvironmentBuilder.__init__(H, psi)

MPOEnvironmentBuilder.init_LP_RP_iterative([...])

Construct boundary environments for periodic MPO environments.

MPOEnvironmentBuilder.test_sanity()

Sanity check, raises ValueErrors, if something is wrong.

class tenpy.networks.mpo.MPOEnvironmentBuilder(H, psi)[source]

Bases: object

Construct boundary environments for periodic MPOEnvironments.

This class implement the construction scheme from [phien2012] to construct LP[0] and RP[self.L-1] for a periodic MPOEnvironment:

|             - - > - - - - - 'vR*'
|            |          |
|   LP[0] = E[0] ->- T_H**n - 'wR' (index `j`)
|            |          |
|             - - > - - - - - 'vR'

where T_H has the structure of a corresponding MPOTransferMatrix and the limit \(n → \infty\) has to be taken.

The above equation does generally not converge to a fixpoint due to the extensive energy contribution of the Hamiltonian.

However, for an MPO H that is upper triangular up to permutations, LP[0] can be constructed iteratively in index j:

E[n+1][:,j,:] = \sum_{i<=j} E[n][:,i,:]T_H[:,i,:][:,j,:]

with:

E[n][:,j=IdL,:]=Id

The last environment E[n][:,j=IdR,:] requires solving the geometric series:

E[n+1][:,j=D-1,:] = \sum_{k=0,...,n-1} T_H[:,j,:][:,j,:]**k (C)

which is singular due to the identity and density matrix as eigenvector pair with eigenvalue 1. To avoid this,:

E[n+1][:,j=D-1,:] = c0_j + epsilon * n * Id

can be decomposed into a constant term and an extensive contribution. The latter captures the energy per site of the environment.

Here, we also generalize the scheme to higher powers of MPOs, where the environment more generally is decomposed into terms proportional to different powers of n:

LP[0] = e_0 * n**0 * LP[0][0] + e_1 * n**1 LP[0][1] + ...

The largest needed n is given by the number of identities on the diagonal of the MPO.

Todo

  • Currently, we only allow simple loops. E.g. a double loop

    Outer[j] -> A1 -> Outer[j] AND Outer[j] -> A2 -> Outer[j] is not allowed. This can in principle be adjusted by grouping nodes of the graph.

  • Currently, we assume identities along the loops. In principle, we can allow

    arbitrary operators if we compute the dominant eigenvectors explicitly.

test_sanity()[source]

Sanity check, raises ValueErrors, if something is wrong.

init_LP_RP_iterative(which='both', calc_E=False, tol_c0=None, gmres_options=None, tol_id=1e-12)[source]

Construct boundary environments for periodic MPO environments.

See class docstring for an explanation.

Parameters:
  • which ({'LP', 'RP', 'both'}) – Specifies which environments to compute.

  • tol_c0 (float | None) – Tolerance for explicitly computing the dominant left and right eigenvectors of the MPSTransferMatrix associated with self.ket, if numerical errors affect the MPS canonical form. Ignored if None. In this case uses c0=Id.

  • calc_E (bool) – Whether to return the energy. Only permitted when the expectation value scales at most linearly with system size. For higher-order scaling, expectation values must be computed via explicit contractions.

  • gmres_options (dict) – Further optional parameters passed to tenpy.linalg.krylov_based.GMRES.

  • tol_id (float) – Cycles with smaller norm are discarded.

Returns:

  • init_env_data (dict) – Dictionary with init_LP and init_RP in the same format as MPOTransferMatrix.find_init_LP_RP().

  • envs (dict of list) – All environments grouped by powers of n. envs[‘init_LP’][j]=`LP[0][j]` and envs[‘init_RP’][j]=`RP[self.L-1][j]`

  • E (float) – Energy per site, only returned if calc_E is True.