# Conserve QN in ancilla method

+1 vote

Hello,

from what I understand in version 3.1 QN conservation is demanded at the level of the declaration of sites, as:

auto sites = SpinHalf(2*N,{"ConserveQNs=",true});

Is there a way to makes the indices conserve Sz (for example) quantum numbers in the ancilla purification method to construct thermal states?

Assuming obviously the Hamiltonian conserve QN as

auto ampo = AutoMPO(sites);
for(auto j : range1(N-1))
{
auto s1 = 2j-1,
s2 = 2
j+1;
ampo += 0.5,"S+",s1,"S-",s2;
ampo += 0.5,"S-",s1,"S+",s2;
ampo += "Sz",s1,"Sz",s2;
}

auto H = toMPO(ampo);


what would be the choice of the initial infinite temperature state with the correct QN to be evolved in imaginary time with H?
All my attempts lead to "Mismatched QN Index arrows" error.

Thanks a lot!

Jacopo.

commented by (14.1k points)
Hi Jacopo,

Could you please include a minimal example of what you have tried? Then we can help you figure out where it is going wrong.

Thanks,
Matt
commented by (390 points)
Dear Matt,

the most obvious choice is the initial state which is a product of singlets

auto psi = MPS(sites);
for(int n = 1; n <= 2*N; n += 2)
{
auto s1 = sites(n);
auto s2 = sites(n+1);
auto wf = ITensor(s1,s2);
wf.set(s1(1),s2(2), ISqrt2);
wf.set(s1(2),s2(1), -ISqrt2);
ITensor D;
psi.ref(n) = ITensor(s1);
psi.ref(n+1) = ITensor(s2);
svd(wf,psi.ref(n),D,psi.ref(n+1));
psi.ref(n) *= D;
}

and then I evolve with applyMPO toExpH on psi. This gives me the error but I suspect that the initial state has indeed a problem in QN ... (I am learning to use version 3)

Jacopo.
commented by (70.1k points)
Hi Jacopo, I agree with Matt that more info is helpful here. We may have to see the rest of your code to guess where the arrow error is arising.

Your question about QN's and which initial state is a good one, but the answer is the state you are already making, which is one where the ancilla state, thought of as a pure-state wavefunciton on 2N sites, has a total QN of zero (since it's a product state of singlets).

However, this question is a bit orthogonal to issues related to arrows. From what I can see of your code, you set up the Index arrows correctly (all site arrows going Out, and the svd should handle the bond-dimension arrows correctly) so it doesn't appear you are doing anything wrong so far. So the only issues I can see remaining are e.g. if the MPO is somehow being produced incorrectly or if additional dimension-1 bond/link indices are needed between the singlets as well as within the singlets. (Usually our MPS/MPO codes are tolerant of missing bond indices but sometimes they can be picky about this, depending on the algorithm used or version of the code.)

Miles
commented by (390 points)
Dear Miles and Matt,

I just checked that taking your code, ancilla.cc, in the subfolder tutorial/finiteT in ITensor-3.1.1 and changing sites to conserved QN sites, namely writing auto sites = SpinHalf(2*N,{"ConserveQNs=",true}), then it gives the same error during runtime, which appears at the level of psi = applyMPO(expH,psi,args).

thanks!

Jacopo
commented by (70.1k points)
Thanks, that gives us a code to test -
commented by (70.1k points)
Hi ok, so I found the error. It's actually not related to QNs, but was just caught in the QN version of the code because it does stricter checking of Index arrows. I'll post a more detail explanation below.

Hi, so the issue you encountered is actually not to do with QNs per se, but rather to do with a change in behavior of MPO functions in ITensor v3 (versus version 2).

The change in behavior is that functions such as applyMPO no longer automatically "un prime" site indices. So when acting with an MPO of the kind produced by AutoMPO which has sites s1,s2,s3... and sites s1', s2', s3',...onto an MPS, the resulting MPS psi will have primed site indices. It's necessary to call psi.noPrime(); afterward to remove the primes.

The ancilla.cc tutorial code you used wasn't properly upgraded to version 3, but I'll upgrade it right now. Unfortunately it was still appearing to run correctly without QN conservation because when there are no QNs, the code doesn't check Index arrows (even though it could) so certain incorrect algorithms sometimes slip through the automatic error checking.