I have noticed that when I add two MPO’s together, the itensor’s ‘+’ operator end up calling lapack syevr.
This happens even when I set a common bound dimension by using truncate before summing the MPOs. Why does summing requires ED ? I would have expected that summing two MPO’s with the same bond dimension only requires to sum the entries together.

This is critical and surprising because my lanczos code ends up spending most of its time doing trivial steps in lapack syevr instead of doing tensor contractions.

Is there a more efficient way to sum two MPOs with the same bond dimension ?

Hi Nichola,
It’s a good question. While it may seem that adding MPO’s would be done by adding the elements of the tensors, that’s actually not the correct mathematical procedure and the correct one is more interesting. The actual procedure is to sum MPO’s A + B, one creates a new MPO C which is block diagonal with the blocks consisting of the tensors of A and B:

So you can see if the bond dimension or rank of the MPO’s is \chi_A and \chi_B, then the bond dimension of C can be as large as \chi_C = \chi_A + \chi_B. But in many cases the bond dimension is less than this, and can even be as small as \chi_C depending on the details of the MPO’s one is summing. To find out the actual bond dimension of C, one has to diagonalize the C tensors and truncate these diagonalizations to the desired accuracy of the sum.

So that is why you see something like syevr running. We aren’t performing “ED” per ses, which is more of a physics term for finding a few dominant eigenvectors very large matrices using techniques like Lanczos. But we are just diagonalizing certain intermediate matrices appearing in a procedure like that sketched above.