How does DMRG wind up in a different QN symmetry sector

Kind of a philosophical question here: when starting from a state with definite quantum number how does DMRG wind up in a different quantum number sector when quantum number conservation is turned off?

Here’s my take:

It shouldn’t be from the eigensolver which only uses applications of the Hamiltonian. To my mind that leaves the SVD as the only culprit. When using QN conservation the SVD is done block by block. Without QN conservation the tensor should still be block sparse but with degenerate singular values there is no guarantee that the SVD will also produce block sparse tensors. Throw in a little floating point error and eventually you’ll wind up in a superposition of symmetry sectors.

Below is code for a little demo with the Fermi-Hubbard Hamiltonian. I initialize in a product state with 3 spin up and 3 spin down electrons and run DMRG. For the first 6 sweeps it remains in this symmetry sector. But at sweep 7 it immediately jumps out. After 100 steps it has converged to what I guess is the global ground state with 2 spin up and 2 spin down electrons.

let 
  N, nUp, nDn = 6, 3, 3
  conserve_qns = false

  # Fermi Hubbard Hamiltonian on N sites
  sites, H = fermi_hubbard(N; conserve_qns)

  # The MPOs for the number of spin up and down electrons
  Nup, Ndn = NupNdn(sites)

  psiInit = initial_state(sites, nUp, nDn)
  println("The initial state")
  check_flux(psiInit, Nup, Ndn)
  
  E, psi = dmrg(H, psiInit; nsweeps=6, maxdim=64, cutoff=0, outputlevel=0)
  println("\nAfter 6 sweeps of DMRG")
  check_flux(psi, Nup, Ndn)

  E, psi = dmrg(H, psiInit; nsweeps=7, maxdim=64, cutoff=0, outputlevel=0)
  println("\nAfter 7 sweeps of DMRG")
  check_flux(psi, Nup, Ndn)

  E, psi = dmrg(H, psiInit; nsweeps=100, maxdim=64, cutoff=0, outputlevel=0)
  println("\nAfter 100 sweeps of DMRG")
  check_flux(psi, Nup, Ndn)
end

The output is

The initial state
<Nup> = 3.0, variance = 0.0
<Ndn> = 3.0, variance = 0.0

After 6 sweeps of DMRG
<Nup> = 2.9999999999999942, variance = 1.7763568394002505e-14
<Ndn> = 2.999999999999994, variance = 2.3092638912203256e-14

After 7 sweeps of DMRG
<Nup> = 2.517036125816046, variance = 0.2497615038863925
<Ndn> = 2.482713172373026, variance = 0.24975290223099567

After 100 sweeps of DMRG
<Nup> = 2.000000000000001, variance = -1.7763568394002505e-15
<Ndn> = 2.0000000000000004, variance = -8.881784197001252e-16

I share your intuition. The eigensolver would like to switch to a different sector, since its “goal” is to minimize the energy any way it can. But the initial guess it is provided, if there was no floating-point or truncation approximations, would have zero overlap with any other symmetry sectors, so it would never switch. But in practice it does have small overlap with other symmetry sectors, so eventually it makes the ‘jump’ to the lower-energy one.

1 Like

Great, thank you!

This topic was automatically closed 10 days after the last reply. New replies are no longer allowed.