+1 vote
asked by (190 points)

Hi all,

I found that the built in function correlation_matrix() can lead to a Out Of Memory Error easyily even for a small size system with a moderate bond dimensions.

The minimal code can be like


Nx = 4
Ny = 4
N = Nx * Ny
Npart = Int(Nx * Ny / 2)
t = 1.0
D = 600

Nsweep = 4
sweeps = Sweeps(Nsweep)
maxdim!(sweeps, D)
cutoff!(sweeps, 1E-8)

sites = siteinds("Electron", N; conserve_qns=true)
lattice = square_lattice(Nx, Ny; yperiodic=true)

ampo = AutoMPO()
for b in lattice
    ampo .+= -t, "Cdagup", b.s1, "Cup", b.s2
    ampo .+= -t, "Cdagup", b.s2, "Cup", b.s1
    ampo .+= -t, "Cdagdn", b.s1, "Cdn", b.s2
    ampo .+= -t, "Cdagdn", b.s2, "Cdn", b.s1

H = MPO(ampo, sites)
H = splitblocks(linkinds, H)

state = ["Emp" for n = 1:N]
p = Npart
for i = N:-1:1
    if p > i
        println("Doubly occupying site $i")
        state[i] = "UpDn"
        p -= 2
    elseif p > 0
    println("Singly occupying site $i")
    state[i] = (isodd(i) ? "Up" : "Dn")
    p -= 1

psi0_ini = randomMPS(sites, state, 10)
energy0, psi0 = dmrg(H, psi0_ini, sweeps)

Cupij = correlation_matrix(psi0,"Cdagup","Cup")

So for a Hubbard model on a 4*4 cylinder with bond dimension D = 600, I can readily obtain the ground state wavefunction, but get a out of memory error report.

I am not sure whthere I miss something when using the built-in function correlation_matrix().
Any comments will be helpful :)


commented by (70.1k points)
Thanks for posting your code - I'm testing to see what happens on my machine.

How much memory does your machine have? Thanks
commented by (70.1k points)
To follow up, I can see on my machine that the code is indeed using a seemingly unecessary amount or very large amount (20+ Gb) of memory for this! So thanks for reporting this behavior. It could very well be an issue and I'll look into it more.

1 Answer

+3 votes
answered by (70.1k points)

Hi Xin-Chi,
Thanks again for reporting this. I found that there was indeed a bug in the correlation_matrix code. The bug was that certain tensor contractions were happening in the wrong order, leading to some intermediate tensors which were very large. I just submitting a pull request (https://github.com/ITensor/ITensors.jl/pull/754) which reorders these contractions. Now the code is much faster than before and uses a reasonable amount of memory (I measured only 500Mb usage or so with the new code).

This updated code will be included in the next version of ITensors.jl which I'll register later today.

Best regards,

commented by (190 points)
Hi Miles,
  Thank you for replying and fixing this in such a short time!

commented by (1.2k points)
I also found this issue yesterday and wrote my own correlation_matrix function. Thanks for fixing this.
commented by (70.1k points)
Glad you were able to find your own fix - but yes the new version is a lot faster and more efficient than the other one now.
commented by (610 points)
Well, I actually encountered the same problem recently...
I was planning to submit a pull request, and just noticed that Miles already submitted one : )

Anyway, I guess advanced users usually will write their own codes on the measurement part.

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.