## Learn to Use ITensor

main / formulas / gates_to_mpo

# Transforming a Set of Gates into an MPO

Here we describe how to transform a set of gates into an MPO.

Imagine we have a Hamiltonian that is a sum of local terms

$$H = \sum_j h_{j,j+1}$$

where $h_{j,j+1}$ only acts non-trivially on sites j and (j+1).

Part of a Trotter decomposition may look like:

$$e^{-\tau H} \approx e^{-\tau h_{1,2}} e^{-\tau h_{2,3}} \cdots e^{-\tau h_{N-1,N}}$$

We can turn this into an MPO with the following code:

#include "itensor/all.h"

using namespace itensor;
using std::vector;

int
main()
{
// Create the sites
auto N = 20;
auto s = SpinHalf(N,{"ConserveQNs=",false});

// Create the gates
auto tau = 0.1; // Time step
auto G = vector<ITensor>(N);
for(auto j : range1(N-1))
{
G[j] = expHermitian(op(s,"Sx",j)*op(s,"Sx",j+1),-tau);
}

// Split up the gates
auto A = vector<ITensor>(N);
auto B = vector<ITensor>(N);
for(auto j : range1(N-1))
{
auto [Aj,Bj] = factor(G[j],{s(j),prime(s(j))});
A[j] = Aj;
B[j] = Bj;
}

// Some temporary internal indices
auto t = vector<Index>(N+1);
for(auto j : range1(N))
{
t[j] = sim(s(j));
}

// Replace internal indices
// so that the correct indices contract
for(auto j : range1(2,N-1))
{
B[j-1] *= delta(prime(s(j)),t[j]);
A[j] *= delta(s(j),t[j]);
}

// Create and store the MPO tensors
auto M = MPO(N);
M.set(1,A);
for(auto j : range1(2,N-1))
{
M.set(j,B[j-1]*A[j]);
}
M.set(N,B[N-1]);

///////////////////////////////////////////////
//
// As a test, apply this MPO to a state
// and compare to applying the gates
//

// Create a starting state
auto init = InitState(s);
for(auto j : range1(N))
{
init.set(j, "Up");
}
auto psi = MPS(init);

// Apply our MPO to the starting state
auto Mpsi = applyMPO(M,psi);

// Now compare to applying the gates
auto Gpsi = psi;

// Put the orthogonality center at position 1
Gpsi.position(1);
for(auto j : range1(1,N-1))
{
auto phi = Gpsi(j)*Gpsi(j+1)*G[j];
phi.noPrime();
auto [U,S,V] = svd(phi,inds(Gpsi(j)));
Gpsi.set(j,U);
Gpsi.set(j+1,S*V);
}

PrintData(inner(Mpsi,Mpsi));
PrintData(inner(Gpsi,Gpsi));
PrintData(inner(Gpsi,Mpsi));

return 0;
} Download the full example code Back to Formulas Back to Main