0 votes
asked by (1.2k points)

Hello Matt,

I found that the DMRG results in ITensor v3 and v2 are different. Maybe this is not an issue because the difference is decreasing during the sweeps. But if the initial state and the iterative process are the same, the numbers should be the same for all sweeps. What changes in Version 3 compared to Version 2? Or what do I missed? Thanks.


1 Answer

0 votes
answered by (70.1k points)

Hi Jin, it could be a number of things but most likely it’s some recent changes to the truncation logic used in the SVD (or density matrix diagonalization) part of DMRG.

Is the energy decreasing slower than before, and if so by a significant amount? If it’s decreasing faster than this is actually a good thing and would be evidence that the changes we made were a success.

Best regards,

commented by (1.2k points)
edited by
Hi Miles, thanks for the reply. I did some tests using the sample code for 2D Hamiltonian with Lx = 8, Ly = 3, nsweeps = 50. It is found that

1. With large bond dimension or small cutoff, the energy decreasing rate is almost the same for both versions.

2. When the maximal bond dimension is arbitrarily large and the cutoff is the main accuracy parameter, version2 always converges to a smaller value than version3 does. The final energy difference is more than 100 times bigger than the cutoff. Version2 is better in this case.

3. When the cutoff is arbitrarily small and the maximal bond dimension is the main accuracy parameter,  the final energy difference is the order of or smaller than the smallest cutoff in the final sweep. Two versions have the same accuracy in this case.
commented by (70.1k points)
From the sound of it only case 2 sounds like it’s not ideal. Could you please post some sample sweep parameters so we can try to reproduce? Thanks!
commented by (1.2k points)
edited by
Hi Miles,

I used the following sweep parameters.

    auto sweeps = Sweeps(50);
    sweeps.maxdim() = 10,20,100,100,200,200,300,300,400,400,500,500,600;
    sweeps.cutoff() = 1E-4;
    sweeps.niter() = 2;
    sweeps.noise() = 1E-7,1E-8,0.0;
For cutoff = [1e-4, 1e-5, 1e-6, 1e-7, 1e-8, 1e-9, 1e-10], Ev3 = [-11.592512491595, -11.644549496655, -11.648325909394, -11.648603685809, -11.648630715598, -11.648633432203, -11.648633725977], Ev2 = [-11.637580459566, -11.647706401323, -11.648540555337, -11.648624067026, -11.648632913158, -11.648633665882, -11.648633742644].

The log-log-plot of Ev3-Ev2 v.s. cutoff is a straight line, linear fit gives log10(Ev3-Ev2) = 1.06 log10(cutoff) + 2.78.
commented by (1.2k points)
Aha, I see the most recent version give the same results as version2. Thanks.
commented by (70.1k points)
Glad to hear it! Thanks for following up -
Welcome to ITensor Support Q&A, where you can ask questions and receive answers from other members of the community.

Formatting Tips:
  • To format code, indent by four spaces
  • To format inline LaTeX, surround it by @@ on both sides
  • To format LaTeX on its own line, surround it by $$ above and below
  • For LaTeX, it may be necessary to backslash-escape underscore characters to obtain proper formatting. So for example writing \sum\_i to represent a sum over i.
If you cannot register due to firewall issues (e.g. you cannot see the capcha box) please email Miles Stoudenmire to ask for an account.

To report ITensor bugs, please use the issue tracker.