# Exponentiating autompo with 3-site operators

+1 vote

I was trying to do some time evolution of a Hamiltonian containing 3 spin interactions using the exactApplyMPO method.

However, I cant exponentiate the hamiltonian using the toexp function which can only take up to 2 spin term.

How should I proceed?

commented by (70.1k points)
By the way, if you are feeling ambitious, you could begin your project by expanding our AutoMPO feature to handle this case. Most of the machinery is the same as the case that does the regular (non-exponentiated) MPO, but the pieces have to be arranged in a different pattern in order to make the exponential. If you added this feature, I'd do a writeup on the ITensor news page with a photo of you similar to this one of Anna Keselman: http://itensor.org/news.html#autompo
commented by (160 points)
reshown by

Related to this three site issue,

If we have a tensor of two sites, we can decompose it back to mps form using svdbond.
Is there a way to decompose a tensor of three sites into mps form?
I know one could manually do two svd and set the mps matrices, however, in doing so the orthogonality center is no longer well defined, even though in principle it is well defined if one has handled the svd correctly.

Best
Kenny
commented by (70.1k points)
Hi Kenny,
Good question. So yes this can be done. Say that you do repeated SVD's of a tensor in the way that you described, then manually set the tensors of an MPS using the results of these SVD's. Then you are right that the orthogonality center will not be defined for this MPS object, even though the tensors are known to you to have the orthogonality property.

So to fix this, after you finish setting the MPS tensors, you can call the .leftLim(ll) and .righLim(rl) methods on the MPS. Here ll and rl are integers saying what value you want the leftLim and rightLim to have.
(More documentation here: http://itensor.org/docs.cgi?page=classes/mps )

For the specific case of site 1 being the orthogonality center, if the MPS is called "psi" you should do:
psi.leftLim(0);
psi.rightLim(2);

Likewise, if you want the center to be "j", you should do .leftLim(j-1) and .rightLim(j+1).

As I write this, it occurs to me that it would probably be good to have a convenience function that just takes the center site number "j" and sets the left/right lim for you.

Miles
commented by (160 points)
Ahh I see. This is very helpful.

Thanks

selected by

Hi, so AutoMPO's containing more than two-site operators cannot currently be exponentiated using the toExpH feature. It is a feature we'd like to add soon.

If you definitely need to time evolve a Hamiltonian with more than two-site terms, then an alternative could be to use a "time step targeting" method such as TDVP or the method described in this paper:
https://arxiv.org/abs/1706.09537

Best regards,
Miles

commented by (260 points)
Hi miles. Will (and when will) this feature be added to version 3 of itensor? Can we try it using one of the pre-release branches of itensor?
commented by (70.1k points)
Hi Steve, thanks for the question, but we don't have a set time line for this feature. After we finish version 3 in a few weeks, our next priority will be to start working hard on the Julia version of ITensor. We'd also like to also put in more advanced time evolution features (a TDVP code would be an especially useful one, and would be superior to the toExpH approach in almost every respect). But since it's just two of us working on these things, basically, we have to prioritize. If you'd like to try your hand at generalizing toExpH to work for more types of AutoMPO inputs that would be very welcome. We could help you get started with the code and discuss how it works with you.

Best regards,
Miles