I want to time evolve an operator in the Heisenberg picture using MPO methods. Let us call the operator A. So I want to compute A(t) = U'AU (U' is the adjoint of U). Note that I am using the Julia version throughout.
I have an array containing Trotter gates for U' called
gates_adjoint. These can be applied to the MPO representation of A from the left (or rather, from "above") by using
apply(gates_adjoint, A). This is basically the same as what is done in https://itensor.github.io/ITensors.jl/stable/tutorials/MPSTimeEvolution.html for an MPS.
However, my issue is in applying U on the right (or rather, on the "bottom" indices of the MPO A). My first approach was to try the following:
A = dag(apply(gates_adjoint, dag(apply(gates_adjoint, A; cutoff = 1E-8)); cutoff = 1E-8));
where I am basically trying to carrying out the sequence A --->(
apply) U'A --->(
dag) A'U --->(
apply) U'A'U --->(
dag) U'AU = A(t)
dag doesn't appear to work the way I expected it to. For example, in the following code:
s = siteinds("S=1/2", 1);
A = op("S+", s);
B = op("S+", s);
@show C = apply(A,B)
@show D = apply(A,dag(B))
C comes out correctly as a zero ITensor but D also comes out as a zero ITensor even though I want it to be @@S_+S_-@@. I think I may not be fully understanding how
My question now is how do I correctly evolve my MPO A? Is there a nice direct way to apply the gates from both sides and/or if I have to use
dag, how do I use it correctly? Am I perhaps making a mistake with how I deal with indices (for example, do I also have prime/unprime some indices at some point)?
This is my first time working with ITensor and any help would be much appreciated!