DensityMatrixMixer¶
full name: tenpy.algorithms.dmrg.DensityMatrixMixer
parent module:
tenpy.algorithms.dmrg
type: class
Inheritance Diagram

Methods
|
|
Decompose single-site wavefunction and expand/mix an adjacent bond. |
|
Decompose two-site wavefunction and expand/mix enclosed bond(s). |
|
|
Calculate the (possibly mixed) reduced density matrices. |
|
Mix and SVD-like decompose a two-site wavefunction. |
|
|
|
Diagonalize |
Update the amplitude, possibly disable the mixer. |
Class Attributes and Properties
|
|
|
|
|
- class tenpy.algorithms.dmrg.DensityMatrixMixer(options, sweep_activated)[source]¶
Bases:
Mixer
,DensityMatrixMixer
Deprecated.
Deprecated since version 1.0.0: Use
DensityMatrixMixer
instead. Note the changed function names and signatures- mix_and_decompose_1site(engine: Sweep, theta: Array, i0: int, move_right: bool)[source]¶
Decompose single-site wavefunction and expand/mix an adjacent bond.
For a right move, we decompose:
| -- theta -- ==> -- U === S === VH -- | | |
For a left move:
| -- theta -- ==> -- U === S === VH -- | | |
The LHS is equal to the RHS up to truncation and rescaling (we normalize to
norm(S)==1
). The double lines (===
) indicate the mixed/expanded bonds. Only the tensor with a physical leg (e.g. U for a right mive) is an isometry and is equivalent to the corresponding output ofmixed_svd_2site()
. It carries the qtotal of theta. The other (e.g. VH for a right move) is in general not isometric. S are the usual singular values.The mixer can be injected in a sweeping algorithm by replacing the usual SVD of theta that shifts the canonical form with this method.
- Parameters
engine (
Sweep
) – The engine that is using this mixer.theta (2D
Array
) – Single-site wavefunction prepared for SVD. Labels either'(vL.p0)', 'vR'
for a right move, or'vL', '(p0.vR)'
for a left move.i0 (int) – The site that
theta
lives on. The bond to be expanded isi0, i0 + 1
for a right move ori0 - 1, i0
for a left move.move_right (bool | None) – Whether we move to the right (
True
), left (False
), or dont move (None
).
- Returns
U (
Array
) – Left part as defined above. Isometric for a right move. Labels'(vL.p)', 'vR'
for a right move or'vL', '(p.vR)'
for a left move.S (1D ndarray) – Singular values on the new bond.
VH (
Array
) – Right part as defined above. Isometric for a left move. Labels'vL', '(p.vR)'
for a right move or'(vL.p)', 'vR'
for a left move.err (
TruncationError
) – The truncation error introduced.
- mix_and_decompose_2site(engine: Sweep, theta: Array, i0: int, mix_left: bool, mix_right: bool, qtotal_LR=None)[source]¶
Decompose two-site wavefunction and expand/mix enclosed bond(s).
This is a weaker version of
mixed_svd_2site()
. The decomposition is also:| -- theta -- ==> -- U === S --- VH -- | | | | |
But only the tensors on mixed sites (e.g. only U for the case depicted above, i.e.
mix_left=True, mix_right=False
) are guaranteed to be isometric, while any non-mixed tensor (VH in this example) is in general not isometric. Other than that, parameters and returns are the same as formixed_svd_2site()
.The reason to relax the isometry condition is that the decomposition described above can be done using
mix_and_decompose_1site()
ifmixed_svd_2site()
is not implemented.
- mix_rho(engine: Sweep, theta: Array, i0: int, mix_left: bool, mix_right: bool)[source]¶
Calculate the (possibly mixed) reduced density matrices.
- Parameters
engine (
Sweep
) – The engine that is using this mixer.theta (2D
Array
) – Two-site wavefunction prepared for SVD. Labels'(vL.p0)', '(p1.vR)'
.i0 (int) – The site index of the left site, i.e. such that theta lives on sites
i0, i0 + 1
.mix_left (bool) – If the virtual index left of S should be expanded by perturbing rho_L.
mix_right (bool) – If the virtual index right of S should be expanded by perturbing rho_R.
- Returns
- mixed_svd_2site(engine: Sweep, theta: Array, i0: int, mix_left: bool, mix_right: bool, qtotal_LR=[None, None])[source]¶
Mix and SVD-like decompose a two-site wavefunction.
The goal is to split theta as follows:
| -- theta -- ==> -- U === S --- VH -- | | | | |
The LHS is equal to the RHS up to truncation and rescaling (we normalize to
norm(S)==1
). The double lines (===
) indicate the mixed/expanded bond, here e.g. formix_left=True, mix_right=False
. U and VH are isometries like in an SVD, but S may be a general bond-matrix and in particular not necessarily diagonal or even square. Either one (or both) of the bonds next to S can be expanded / mixed. The isometry on a non-mixed side (e.g. U ifmix_left=False
) could have been obtained from an SVD of theta.- Parameters
engine (
Sweep
) – The engine that is using this mixer.theta (2D
Array
) – Two-site wavefunction prepared for SVD. Labels'(vL.p0)', '(p1.vR)'
.i0 (int) – The site index of the left site, i.e. such that theta lives on sites
i0, i0 + 1
.mix_left (bool) – If the virtual index left of S should be expanded.
mix_right (bool) – If the virtual index right of S should be expanded.
qtotal_LR ([{charges}, {charges}] | None) – The desired qtotal for U and VH, respectively. If
None
, the qtotal are arbitrary.
- Returns
U (
Array
) – Left isometry as defined above. Labels'(vL.p)', 'vR'
.S (1D ndarray | 2D
Array
) – Singular values (1D ndarray) or general bond matrix (2D Array, labels'vL', 'vR'
).VH (
Array
) – Right isometry as defined above. Labels'vL', '(p.vR)'
.err (
TruncationError
) – The truncation error introduced.S_approx (ndarray) – Approximation of the singular values of theta. Exact if avaible.
See also
- svd_from_rho(engine: Sweep, rho_L: Array, rho_R: Array, theta: Array, qtotal_LR)[source]¶
Diagonalize
rho_L, rho_R
to rewrite theta asU S V
with isometric U/V.If rho_L and rho_R were the actual density matrices of theta, this function just performs an SVD by diagonalizing rho_L with U and rho_R with VH and then rewriting theta == U (U^dagger theta VH^dagger VH) = U S V`. Since the actual rho_L and rho_R passed as arguments are perturbed by mix_rho, we get a similar decomposition but S is a general (non-diagoanl) bond matrix.
- Returns
As defined in
mixed_svd_2site()
.- Return type
U, S, VH, err, S_approx