# Constructing MPO manually

+1 vote
edited

Hi Miles,

I was going to construct an IQMPO with exponential interaction and I found here http://itensor.org/docs.cgi?page=tutorials/MPO that it could be written simply in this way( 1D Ising as an example)

$$H^{\sigma _{i}^{\prime }\sigma _{i}}= % \begin{array}{ccc} 1 & 0 & 0 \ Siz & e^{-1} & 0 \ 0 & JSiz & I% \end{array}%$$

However, I was working on a Hubbard model with two chains. Do you think it would be possible to construct the inner chain exponential interaction into an IQMPO in a similar way? Since it is hard to use AutoMPO in this case, do you have any instructions or samples of constructing the IQMPO manually? Thank you very much.

Best regards,

Yixuan

answered by (30.7k points)

Hi Yixuan,
Yes, you can definitely create an exponential interaction with that pattern. Also, yes you can extend this trick to a ladder or two-chain system as you are thinking. You just have to be clever about blocking the MPO into different rows and columns so that the correct terms connect with each other on different legs of the ladder, and set the diagonal terms to 1 or else e^{-1} (or the appropriate base of your exponential) on alternating sites.

To get you started with making an MPO or IQMPO manually, have a look at the file Heisenberg.h in the sample/ folder under the ITensor source code directory. That file has a code pattern you can use to make arbitrary MPOs in a more manual way, by placing operators in different locations in each matrix as you wish.

Finally, once you think you have made your IQMPO correctly, a good way to test it is to prepare different product states |i> and |j> where, for example, |i> is the state with a single particle located on site i and |j> similar but for site j. Call these IQMPS psii and psij. Then calculate overlap(psii,H,psij) and it should give you the coefficient of the hopping term connecting site i to j in your Hamiltonian MPO. You can do similar things with two particles to get interaction matrix elements etc.

Miles

commented by (310 points)
Hi Miles,

Thank you very much. I will start working on that.

Best,

Yixuan
commented by (310 points)
Hi Miles,

I have come up with a way to make the IQMPO of exponential interaction, but now I need to add it to the normal(hopping) Hamiltonian IQMPO which is made by AutoMPO. I think this is done the same way as adding two IQMPS. I have found the function of summing two IQMPS here, http://itensor.org/docs.cgi?page=classes/mps_mpo_algs, could you help me on how to sum two IQMPO? Thanks.

Best,

Yixuan
commented by (30.7k points)
Hi, so if your model is simple enough, you can just define a new MPO which is rigorously the sum of two other MPOs. Without attempting to compress the two together, the sum is just formed by making block-diagonal MPO tensors (though of as matrices of operators) and then making the boundary vector, say on the left, have a +1 in the two entries corresponding to the starting operators of each of your blocks.

But yes, you can also add MPOs with ITensor. I should put it into the docs, but the sum function (http://itensor.org/docs.cgi?page=classes/mps_mpo_algs) should also work for MPOs the same way it works for MPS. Take care, though, that it works accurately for your system. Adding MPOs numerically can lead to some funny behavior for large systems. You can compute matrix elements of your final MPO by creating two product-state MPS's (a and b) with the InitState class and then use overlap function like overlap(a,H,b) to get MPO matrix elements and check that they are correct.
commented by (310 points)
Hi Miles,

I have checked the matrix elements of my summed IQMPO ( made by H = sum(H0, V, Args) ) using overlapC(a, H, b) and found that the real part is exactly correct on every matrix element, but there is always a small imaginary part(to the order of 1E-14) that makes the DMRG run time and the bond dimension doubled through out the sweeps.

On the other hand, if I used the vector<IQMPO> H instead of summing up the IQMPO, the run time and bond dimension became normal and it worked well. Because there is no summing of IQMPO involved in this way, could I just assume that the matrix elements of the total IQMPO would be exactly as it should be?

Best,

Yixuan
commented by (30.7k points)
Hi Yixuan,
That's odd you are seeing an imaginary part. If you are summing two completely real IQMPOs then the result should also be exactly real. (If you use overlapC to check this, though, then it may just be that overlapC itself is returning a tiny imaginary part that's not really there?)

But actually your suggestion of using a vector<IQMPO> is actually a much better idea than trying to sum the MPOs in the first place. Not only is it simpler and less subject to numerical errors, but it should also make your code run faster since otherwise your MPO would likely be block-diagonal and make the DMRG algorithm scale worse (since it doesn't know about the block diagonal structure and would do lots of multiplications by zeros).

Yes, you can assume that vector<IQMPO> input to DMRG is exactly the same as if you summed the IQMPOs in the vector.