SyTen

◆ operator*=() [1/2]

State & syten::MPS::State::operator*= ( Operator const &  op)

Applies an operator to this state as \( |\psi\rangle \to \hat O |\psi\rangle\) using apply_op_naive(); prefer using apply_op_itrunc() if you want to truncate the state later.

Parameters
opoperator to apply to the state.
Returns
a reference to *this

The order of multiplication is tricky. If the state tensor (A) is of size d·m·m and the operator tensor (W) of size w·w·d·d, then the left and right fuses (L, R) are of size wm·m·w.

There are five possible orderings (due to symmetry, exchange L/R to get the other 5):

  1. ((AW)L)R = m²·d·dw² + dwm·wm·wm + dwm·wm·wm = dw²m²(d + 2mw)
  2. ((AL)R)W = dm·m·wm² + w²md·m·w²m + w²m²·dw²·d = dw²m²(m + w²m + d)
  3. ((AL)W)R = dm·m·wm² + wm²·dw·dw + wmd·wm·wm = dw²m²(m + dw + wm)
  4. ((WL)A)R = d²w·w·wm² + w²md·md·m + dwm·wm·wm = dw²m²(dw + dm + wm)
  5. ((WL)R)A = d²w·w·wm² + wmd²·w·wm² + dw²m²·dm² = dw²m²(dw + dwm + dm²)

Of these, 3) is strictly better than 4) [m < dm]. 1) is strictly better than 2) [2w < w²+1]. Comparing 1) and 3), we find: d + 2w·m ? dw + (w+1)m with d << m always. If w << m, then (w+1) < 2w is enough for 3) to be better. If w ~ m, then we have d + 2m² ? m² + (d+1)m. Since d+1 < 2m, 3) wins.

This means that operator application to a state without truncation is of cost O(L dw²m² [(w+1)·m + dw]) for L sites.

References syten::MPS::apply_op_naive().

+ Here is the call graph for this function: