Hello,
I am working with Kraus operators in ITensor, and would like to apply dag only to the site legs of a Kraus tensor, and not on the virtual index, to implement the following:
\sum_i K_i \rho K_i^\dagger
Is there a good way to do this with the ITensor library? I thought there could be something like dag(K, oninds=listofinds) or dag(K, ignoreids=virtualidx).
Thank you!
Take a look at the apply/product function, the docstring should help:
julia> using ITensors
julia> ?
help?> product
[...]
EDIT: I noticed the docstring doesn’t cover the keyword argument apply_dag, if you do product(A, B; apply_dag=true) or apply(A, B; apply_dag=true) it performs what would be comparable to the linear algebra operation ABA^{\dagger} treating the ITensors A and B as matrices from the primed to the unprimed site/external indices.
Thank you for the reply! I got apply to work for the quantum channel \rho' = \sum_i K_i \rho K_i^\dagger. However, apply does not allow me to express the completeness condition \sum_i K_i^\dagger K_i = I, since that would require running apply(Kdag, \delta(...), apply_dag=true), and I do not have Kdag. Do you have any suggestions for this case? It is also inconvenient to have to include the \delta(...).
What about Kdag = swapprime(dag(K), 0 => 1)?
Thank you for the tip. This seems to work, though I have to contract the result with δ(krausidx, prime(krausidx)) to unprime the virtual index that is being summed over. Ideally, there would be a kwarg for dag to list indices to not dag on.