Hello,
This is a conceptual question about how a key aspect of the DMRG works in the language of Matrix Product States. I have attached an image of Block Site absorption; this image has been taken from "DMRG in the Language of Matrix Product States" by Ulrich Schollwock. In this post, I call the states \(\{ a_{l}\rangle\}\) the new states and the states \(\{a_{l1} \rangle \}\) the old states.
From Quantum Mechanics we see that each new state can be written from all the old states:
\(a_{l} \rangle = \sum_{a_{l1} ;\sigma_{l}} \langle a_{l1} \sigma_{l} a_{l} \rangle  a_{l1} \sigma_{l} \rangle \)\(\equiv \sum_{a_{l1} ;\sigma_{l}} M^{\sigma_{l}}_{a_{l1} , a_{l}}  a_{l1} \sigma_{l} \rangle\)
However, knowing the old states is not enough to find the coefficients \( M^{\sigma_{l}}_{a_{l1} , a_{l}} \). Here were my ideas on how to implement this algorithm conceptually:
(1) Consider the block from sites 1 to \(l1\). Suppose we find the states \(\{a_{l1} \rangle \}\). In order to find the new states, we need these old states \(\{a_{l1} \rangle \}\). Hence we need to store these states in the computer's memory, but storing all of these states \(\{a_{l1} \rangle \}\) will take up an exponential amount of space.
(2) To deal with this, we can reshape the states \(\{a_{l1} \rangle \}\) into matrices and can compute the density matrix of each state. Then we perform exact diagonalization on each density matrix to find the eigenvalues. These eigenvalues can be used to compute the Von Neumann entanglement entropy. The m states with the largest entanglement entropy are kept. We note that a sum over the subset of old states with high entanglement is just as good as the sum over all old states.
(3) Each state that we keep has an exponential number of coefficients (for instance for a spin 0.5 chain with N sites, the eigenstates are \(2^N \times 1\) vectors). Storing the kept vectors as is will still take up an exponential amount of space. As a result, each state that we keep can be converted into MPS form. This way we can store m states polynomially.
(4) By doing all of this, we can almost find all of the new states and absorb the site into the block to get a larger block.
Here are my questions:
(1) Is the MPS version of DMRG implemented the way I described in steps (1), (2), and (3)? Which of my steps are actually used and which are not? What steps are used in lieu of mine?
(2) How does one approximate the coefficients \(M^{\sigma_{l}}_{a_{l1} , a_{l}}\)? How does one get an approximate version of the new states?
BTW: I am new to the DMRG algorithm and I mainly use it to study known systems. However, I am keenly interested in knowing how the algorithm works conceptually (let's say from a systems engineer perspective rather than from a developer's perspective, since I am trying to understand the algorithm from a high level, one which humans can carry out by words and pictures). I am reading Schollwock's paper too and a lot of the math makes sense, but not everything is clicking and hence why I asked.
How Does Block Absorption Work in MPS DMRG

 Posts: 7
 Joined: 05 Dec 2021, 20:23
How Does Block Absorption Work in MPS DMRG
 Attachments

 Screenshot (4).png (111.31 KiB) Viewed 508 times
Re: How Does Block Absorption Work in MPS DMRG
Yes, the main idea is that you *never* have the Schmidt states as whole, but only as (partial) MPS, recursivley adding tensors to get the Schmidt states on the next bond; see also Figure 4 c) of our paper arXiv:1805.00055. Indeed, the formula you wrote gives the Schmidt states a_l> in the basis of a_{l1}> and sigma_l>, with the M tensor being the coefficients! This is true as long as you're in the corresponding canonical form  in our notation, leftcanonical A tensors give you the left Schmidt states on the bond to the right in terms of the left Schmidt states on the left and local physical states, while rightcanonical B tensors yield the right Schmidt states on the bond to the left in terms of the right Schmidt states on the right and local physical states.
Diagonalizing the density matrix works (was used in the old formulation before MPS language), but these days we usually do an equivalent SVD:
If we updated the state on sites (i, i+1), we have the local wave function in the basis
\(\Theta> = \sum \Theta_{a^L_i,\sigma_{i+1},\sigma_{i+1},a^R_{i+1}} a^L_i> \sigma_i> \sigma_{i+1}> a^R_{i+1}>\)
i.e. with four "legs". Grouping each physical leg to the left/right, we can do the SVD to get
\(\Theta_{a^L_i,\sigma_{i+1},\sigma_{i+1},a^R_{i+1}} = A^{a^L_{i+1}}_{a^L_i,\sigma_{i+1}} S^{a^L_{i+1},a^R_{i}}B^{a^R_{i}}_{\sigma_{i+1},a^R_{i+1}}\)
with the A/B tensors exactly being the basis transformations of the Schmidt states. See also Fig. 8 (c) in our paper.
Truncation is based on the square of the Schmidt values, which are the eigenvalues of the left/right density matrix.
If you don't truncate, you would go from MPS bond dimension chi to d*chi with each tensor, so truncation is important to avoid the exponential scaling.
Diagonalizing the density matrix works (was used in the old formulation before MPS language), but these days we usually do an equivalent SVD:
If we updated the state on sites (i, i+1), we have the local wave function in the basis
\(\Theta> = \sum \Theta_{a^L_i,\sigma_{i+1},\sigma_{i+1},a^R_{i+1}} a^L_i> \sigma_i> \sigma_{i+1}> a^R_{i+1}>\)
i.e. with four "legs". Grouping each physical leg to the left/right, we can do the SVD to get
\(\Theta_{a^L_i,\sigma_{i+1},\sigma_{i+1},a^R_{i+1}} = A^{a^L_{i+1}}_{a^L_i,\sigma_{i+1}} S^{a^L_{i+1},a^R_{i}}B^{a^R_{i}}_{\sigma_{i+1},a^R_{i+1}}\)
with the A/B tensors exactly being the basis transformations of the Schmidt states. See also Fig. 8 (c) in our paper.
Truncation is based on the square of the Schmidt values, which are the eigenvalues of the left/right density matrix.
If you don't truncate, you would go from MPS bond dimension chi to d*chi with each tensor, so truncation is important to avoid the exponential scaling.