Mixer

class tenpy.algorithms.dmrg.Mixer(mixer_params)[source]

Bases: object

Base class of a general Mixer.

Since DMRG performs only local updates of the state, it can get stuck in “local minima”, in particular if the Hamiltonain is long-range – which is the case if one maps a 2D system (“infinite cylinder”) to 1D – or if one wants to do single-site updates (currently not implemented in TeNPy). The idea of the mixer is to perturb the state with the terms of the Hamiltonian which have contributions in both the “left” and “right” side of the system. In that way, it adds fluctuation of the quantum numbers and non-zero contributions of the long-range terms - leading to a significantly improved convergence of DMRG.

The strength of the perturbation is given by the amplitude of the mixer. A good strategy is to choose an initially significant amplitude and let it decay until the perturbation becomes completely irrelevant and the mixer gets disabled.

This original idea of the mixer was introduced in [White2005]. [Hubig2015] discusses the mixer and provides an improved version.

Parameters
envMPOEnvironment

Environment for contraction <psi|H|psi> for later

mixer_paramsdict

Optional parameters as described in the following table. Use verbose>0 to print the used parameters during runtime.

key

type

description

amplitude

float

Initial strength of the mixer. (Should be << 1.)

decay

float

To slowly turn off the mixer, we divide amplitude by decay after each sweep. (Should be >= 1.)

disable_after

int

We disable the mixer completely after this number of sweeps.

Attributes
amplitudefloat

Current amplitude for mixing.

decayfloat

Factor by which amplitude is divided after each sweep.

disable_afterint

The number of sweeps after which the mixer should be disabled.

verboseint

Level of output vebosity.

Methods

perturb_svd(self, engine, theta, i0, …)

Perturb the wave function and perform an SVD with truncation.

update_amplitude(self, sweeps)

Update the amplitude, possibly disable the mixer.

update_amplitude(self, sweeps)[source]

Update the amplitude, possibly disable the mixer.

Parameters
sweepsint

The number of performed sweeps, to check if we need to disable the mixer.

Returns
mixerMixer | None

Returns self if we should continue mixing, or None, if the mixer should be disabled.

perturb_svd(self, engine, theta, i0, update_LP, update_RP)[source]

Perturb the wave function and perform an SVD with truncation.

Parameters
engineEngine

The DMRG engine calling the mixer.

thetaArray

The optimized wave function, prepared for svd.

i0int

Site index; theta lives on i0, i0+1.

update_LPbool

Whether to calculate the next env.LP[i0+1].

update_RPbool

Whether to calculate the next env.RP[i0].

Returns
UArray

Left-canonical part of theta. Labels '(vL.p0)', 'vR'.

S1D ndarray | 2D Array

Without mixer just the singluar values of the array; with mixer it might be a general matrix; see comment above.

VHArray

Right-canonical part of theta. Labels 'vL', '(vR.p1)'.

errTruncationError

The truncation error introduced.