I was wondering, is there some built-in functionality to apply an MPO to an MPS?
In the meantime I tried to come up with something but I am afraid it messes with the form and normalization of the MPS.
In a very simple scenario of an MPO with virtual bond dimension [1, 2, 2, ..., 1] and and no conserved charges would something like
Code: Select all
def contract_at_site(i, mpo, mps): w, b = mpo.get_W(i), mps.get_B(i, form='B') cntr = npc.tensordot(w, b, axes=('p*', 'p')) cntr = cntr.combine_legs([['vL', 'wL'], ['vR', 'wR']], qconj=[1, -1]) cntr.ireplace_labels(['(vL.wL)', '(vR.wR)'], ['vL', 'vR']) mps.set_B(i, cntr, form='B') if i > 0: s = mps.get_SL(i) mps.set_SL(i, np.tile(s, 2)) for i in range(mps.L): contract_at_site(i, mpo, mps)
(I am not interested in performance, I am mostly trying to learn about tensor networks for the moment.)