-
Notifications
You must be signed in to change notification settings - Fork 25
Add full update algorithm #106
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
Some recent design thoughts inspired by YASTN: The FU consists of two parts - updating the two tensors connected to a bond, and then updating the surrounding CTM tensors. When updating the two tensors, there can be multiple ways to build the environment around the bond (called the "bond metric" in YASTN). The usual FU use the CTM tensors as the environment, but there is a cheaper method (but still more accurate than SU) called the Neighboring Tensor Update (NTU). There, the bond metric is the exact contraction of a few neighboring tensors, like: or approximate contraction (using boundary MPS approach) of a relatively larger portion of the network around the bond, like: There is a large family of such of bond metrics in the YASTN documentation. Thus we may need to write the first part of FU in a more general manner that accepts different kinds of bond metrics, in preparation of adding NTU in the future. |
|
It might already be possible to achieve something like this by simply restricting the number of iterations in the CTMRG contraction. This is definitely not fully equivalent, so I agree that it would be beneficial to have an abstraction to allow different algorithms there. |
|
I've recently implemented NTU with a few choices of the bond metrics (NN, NNN and NNN+; these are evaluated exactly without any approximation), but some metrics in YASTN is a bit difficult to be rewritten in TensorKit. In some simple cases (such as the Heisenberg model, 2 x 2 unit cell, D = 4) it even performs better than current version of FU, possibly because the exactness of the simple metrics. I'll open a separate PR for NTU after the packages have been updated to work with latest TensorKit (#119), and return to the FU after NTU has been perfected. |
|
The following is the best I can do now for the t-J model: I compare the energy for D = 12 states at t/J = 2.5 with Corboz's results (The energy per hole is calculated using the formula The energy per site (in units of J) difference between my and Corboz's results at doping = 0.1 is about 0.002. Although I only use χ = 100 (it's already quite slow on CPU, taking about 15 minutes per FU step even with spin U(1) symmetry), I feel that the difference mainly comes from the initialization: the singlet pairing We know that around 0.1 doping there's strong competing stripe order, so the non-uniformness may help lower the energy. If I can get Corboz's initialization, I think I can also obtain a better energy. Now I'm somewhat confident about my FU implementation, and can gradually add it to PEPSKit. I shall prioritize this over NTU. (Anyway, I think even Corboz himself hardly uses FU now... it's either cluster update (which I'm also going to do) or AD) |
|
To be re-created later when FU is really ready. |

This PR adds the core part of the fast full update (arXiv 1503.05345) algorithm. Compared to simple update, the environment around a bond to be updated is more accurately represented by the CTM tensors, instead of diagonal weight matrices.
Limitations:
Things to do before merging:
Currently, the FU stops when the energy is no longer decreasing. However, I feel that this may prevent the algorithm to evolve out from a local minimum. It may be better if some singular value spectrum can be used to determine convergence (as in CTMRG and simple update).From my experience using the energy as criterion is good enough for most cases.Add support for bipartite iPEPS (currently for 2 x 2 unit cell, the algorithm cannot keep the bipartite structure).This is just too much work; the CTMRG algorithm also needs to be modified.