Dear ITensor team,
this is a kind of follow-up of my previous question on manually constructing MPOs in ITensor v3 c++. It appears to me that it is not well documented the general way to construct generic MPS, and it would be really useful to have it written somewhere. :)
Say one wants to generate an MPS
psi = A^sigma1{b1} A{b1,b2}^sigma2 A{b2,b3}^sigma_3 ....
with b1,b2 indices of dimension = dim and sigma local site indices and A{bi,bi+1}^sigmai matrices we know. The main problem to me is to assign correct indices that are correctly contracted and properly represent the MPS (or MPO, it's the same). The way I do it is the following:
psi = MPS(sites)
auto comInd = Index(dim,"Link"); // define a common index
for(int n = 1; n <= N; n ++){ // run over the chain of size N
auto sigma = sites(n);
if(n==1){
auto j = Index(dim,"Link");
auto A = ITensor(sigma,i);
// here set the values of the matrix elements of A
psi.set(n,A);
comInd = j; // set the common index to the right index of A
}
if(n>1 && n< N){
auto i = comInd;
auto j = Index(dim,"Link");
auto A = ITensor(sigma,i,j);
// here set the values of the matrix elements of A
psi.set(n,A);
comInd = j; // set the common index to the right index of A
}
if(n==N){
auto i=comInd;
auto A = ITensor(sigma,i);
// here set the values of the matrix elements of A
psi.set(n,A);
}
} // end of for over sites
I would like to know if this is the correct way to do it or if there are other ways or simpler methods!
Thanks a lot!
All the best,
Jacopo.