# convert a quantum-number MPS to a no-quantum-number MPS

+1 vote

What I want to do is to compute <psi1|OP|psi2>,

inner (psi1, OP, psi2);


where psi1 and psi2 are MPS and OP is an MPO. Here psi1 and psi2 have conserved but different quantum numbers (particle number), but OP does not. For example psi1 and psi2 have 1 and 2 electrons respectively, and OP is the annihilation operator.

In my task, psi1 and psi2 are loaded from files, and OP is generated by the program. Since OP does not conserve quantum number, I cannot use the SiteSet from psi1 to create OP, while the function "inner" requires psi1, psi2 and OP have the same Site indices. What is the proper way to do such tasks? Thanks!

commented by (46.8k points)
Hi Chiamin,
One question to clarify: is OP just a single-site or few-site operator, or is it a sum of many terms?

Miles
commented by (250 points)
Hi Miles,

OP is an MPO for sum of many terms. In my case, it is an MPO for superconducting order parameter.
commented by (46.8k points)
Thanks - ok just wanted to make sure an MPO was necessary. If it was a single or few-site operator there might be a simpler approach.

My other question is this: I see that your MPO does not conserve the quantum number, but does it change it by a definite amount? That’s actually all that is required to still use the QN system in ITensor. So for example if one is conserving particle number and the MPO has the property of always lowering the particle number by exactly 1, then even though the MPO does not conserve particle number you can still make it with AutoMPO and using QN ITensors.

But maybe for your case your MPO creates a superposition of states with many different particle numbers? I’m not sure.

Thanks,
Miles
commented by (250 points)
Yes. The MPO is the sum of creation and annihilation operators of a singlet on every bonds, so it change the particle number for +2 or -2. And psi1 and psi2 have particle number difference 2.

+1 vote

Hi Chiamin,
Thanks for the question. I realized we hadn't documented this feature well enough so I just added some information about it to the website.

The feature I'd recommend you use for this is the function removeQNs(psi) where psi is an MPS. You can call a similar function on an MPO. The removeQNs function returns an MPS (or MPO) with all of the zeros filled in and QN information removed from the indices.

So if you are able to make your operator as an MPO and your MPS as well, then you can call removeQNs on all of them to get dense versions and compute the quantity you want with inner. Note that depending on how you made each MPS or the MPO you may need to modify their site indices to be the same. But if e.g. you made the MPO with AutoMPO using the same site set as for the MPS then you should be fine.

Best,
Miles

commented by (250 points)
Thanks Miles! Is it possible to remove only one of the quantum number? For example, remove the quantum number of particle number but remain the total Sz conserved? It is not necessary but just wonder.
commented by (46.8k points)
Hi Chiamin,
Good question. It is not possible right now, but it would be a really good feature to have in the future, and ideal for a case like this, since your operator conserves fermion parity. We may add this feature first in the Julia version as the block-sparse storage system there has a more flexible and general-purpose design (see NDTensors.jl) and because we are planning to implement ITensor slicing there which may involve some of the same pieces of code.

Best,
Miles