# MPO of single-site Sz operator

Hello, I am a student new to MPO/MPS and iTensor.

When I am learning how to generate MPO via autoMPO, I tried to get the MPO expression for a single-site Sz operator by the following code:

int N = 8;  // create an 8-site spin-half chain
auto sites = SpinHalf(N);
auto ampo_Ham = AutoMPO(sites);
// the operator is Sz at site 4
ampo_Ham += "Sz",4;
// convert AutoMPO to MPO
auto Ham = toMPO<ITensor>(ampo_Ham);


When I print the Ham to examine its properties, the physical legs (site index) have dimension 2, as expected for spin-half systems. However, I discover that all the virtual links are of dimension 2. The information for tensor at site 4 is as below:

ITensor r=4: ("Hl3",2,Link|559) ("Hl4",2,Link|993) ("S=1/2 4",2,Site|270) ("S=1/2 4",2,Site|270)'
{norm=2.12 (Dense Real)}


for other sites (site 6 for example)

ITensor r=4: ("Hl5",2,Link|248) ("Hl6",2,Link|379) ("S=1/2 6",2,Site|827) ("S=1/2 6",2,Site|827)'
{norm=2.00 (Dense Real)}


But according to the Appendix of the article New. J. Phys. 12, 055026 (2010), for MPOs describing products of local operators, the tensors at each site should have dimension-1 virtual links, and the tensor elements at site i are simply @@W^{ti, si} =⟨ti|O^i|si⟩@@.

So I want to know why and how iTensor produces this 2-dimensional virtual link. Thank you in advance !

selected

Hi Steve,

That is a good question. In fact, the MPO created by AutoMPO in that case can be truncated to a bond dimension of 1, as you can see if you run the following code:

for(int b = 1; b<N; b++)
{
Ham.position(b);
auto wf = Ham.A(b)*Ham.A(b+1);
auto U = Ham.A(b);
ITensor S,V;
auto spectrum = svd(wf,U,S,V);
PrintData(spectrum);
}


You should see that the spectrum in every case only has one non-zero eigenvalue, meaning the MPO could be safely truncated to a bond dimension of one.

Likely what is going on (I am only speculating, since I haven't worked much with the AutoMPO code) is that the code being used to generate the MPO is accounting for the possibility of having a superposition of local, on-site terms on every site of the lattice, and doesn't write specialized code to make the most efficient MPO for only a single on-site operator (which is not a common use case for an MPO). The interesting thing about an MPO is that with a bond dimension of only 2, it can account for having a superposition of on-site terms on every site of the lattice.

Cheers,
Matt

commented by (2.8k points)
You can also see this tutorial page for some explicit examples of constructing MPOs:
http://itensor.org/docs.cgi?page=tutorials/MPO
commented by (250 points)
Thanks! I also tried multi-site products (i.e. Sz_2 * Sz_3 * Sz_4 * Sz_5). This time the link connecting the involved sites are of dimension 3 (others still 2-dimensional), but it can also be truncated to 1-dimensional bond using your code.
commented by (250 points)
By the way, when the "position" function is applied to an MPO, does it treat the two physical legs of the MPO as one index, so that the MPO can be treated as an MPS to set the orthogonality center?
commented by (2.8k points)
That case above likely makes the MPO with bond dimension 3 to account for the possibility of a superposition of 4-local terms (operators of the form @@O_i\otimes O_{i+1}\otimes O_{i+2} \otimes O_{i+3}@@ for any site @@i@@), but for only one term can again be truncated to a bond dimension 1 MPO, as you noticed.

That is exactly right about how the position function works. It actually uses the same code for MPS and MPO, which is a neat feature of the ITensor Index system.