# Can you calculate the ground-state fidelity using DMRG?

Hi Miles,

I've attempted to calculate the ground-state fidelity
for the transverse Ising model using DMRG. I'm getting
incorrect results. Below is my code (adapted from
excited_dmrg.cc). Can you help me with this?
(Another question: How do you suppress in the code
intermediate outputs?)

Oz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++

## include "itensor/all.h"

using namespace itensor;

## define DL 0.1

double h,h1;
double fid[NP];
double E0[NP],E1[NP];
int main()
{
for(int k = 0; k < NP-1; ++k)
{
h= 0.5 + 0.1*k;
h1= h + DL;

//creates_chain()

  auto sites = SpinHalf(N); //make a chain of N spin 1/2's


// creates_hamiltonian() transvese field - h

  auto ampo = AutoMPO(sites);
for(int j = 1; j < N; ++j)
{
ampo += -4*J,"Sz",j,"Sz",j+1;
}
for(int j = 1; j <= N; ++j)
{
ampo += -2*h,"Sx",j;
}
auto H = MPO(ampo);


//// creates_hamiltonian() transvese field - h1= h + DL

  auto ampo1 = AutoMPO(sites);
for(int j = 1; j < N; ++j)
{
ampo1 += -4*J,"Sz",j,"Sz",j+1;
}
for(int j = 1; j <= N; ++j)
{
ampo1 += -2*h1,"Sx",j;
}
auto H1 = MPO(ampo1);


// init_wavefunction()

  auto state = InitState(sites);
for(int i = 1; i <= N; ++i)
{
if(i%2 == 1)
state.set(i,"Up");
else
state.set(i,"Dn");
}
auto psi = MPS(state);


//setssweepingparameters()

  auto sweeps = Sweeps(30);
sweeps.maxm() = 10,20,100,100,200;
sweeps.cutoff() = 1E-10;
sweeps.niter() = 2;
sweeps.noise() = 1E-7,1E-8,0.0;


// println(sweeps);

  auto psi0 = MPS(sites);
auto psi1 = MPS(sites);


//finds_groundstate()

  auto en0 = dmrg(psi0,H,sweeps,{"Quiet=",true});
auto en1 = dmrg(psi1,H1,sweeps,{"Quiet=",true});


// println("\n----------------------\n");

  fid[k]= overlap(psi0,psi1);
E0[k] = en0;
E1[k] = en1;


}
printfln(" h fidelity");
for(int k = 0; k < NP-1; ++k)
{
h= 0.5 + 0.1*k;
printfln("%.2f %.5E",h,fid[k]);
}
return 0;
}

Hi, so yes you can calculate the fidelity and the way you are doing it (using overlap between two MPS) is correct.

I'm not sure why you are getting incorrect results. It could be due to many various reasons including an error in constructing your Hamiltonian; insufficient convergence of DMRG; poor selection of initial states; finite size effects; etc.

I'd recommend studying a particular set of Hamiltonian parameters in detail, trying out different numbers of sweeps and looking at the convergence of the MPS by looking closely at the reported truncation error, for example. Then if you are still getting an incorrect fidelity for that particular Hamiltonian you will be in a better position to assess why it's happening.

Please let me know if I can be of more help, like if you suspect there is an issue with one of the ITensor routines.

Best regards,
Miles

commented by (140 points)
Hi Miles,

Thanks, I will do it.

PS: Another question: How do you suppress in the code the intermediate printouts? like:
vN Entropy at center bond b=500 = 0.295190192552
Eigs at center bond b=500: 0.9142 0.0855
Largest m during sweep 1/20 was 10
Largest truncation error: 2.49966e-08
Energy after sweep 1/20 is -1262.873018602332
Sweep 1/20 CPU time = 4.048s (Wall time = 0.756s)
commented by (32.2k points)
Great!

So to suppress the printouts, we should try to make this easier but the technical way is you need to make an "Observer" object which is a class that inherits from Observer and (optionally) implements the measure and checkDone methods. You could just make an empty "do-nothing" class and plug this into the versions of DMRG that take a custom Observer.

Alternatively, you can modify the code in itensor/mps/DMRGObserver.h to turn off the printouts there and recompile your code. The downside of this is that you won't be able to pull new versions of ITensor without stashing or committing your changes to that file.
commented by (140 points)