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}^sigma*2 A*{b2,b3}^sigma_3 ....

with b1,b2 indices of dimension = dim and sigma local site indices and A*{bi,bi+1}^sigma*i 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.