Inner product of MPS with different dimension

Hi Matt and Mile,
I am trying to write a piece of code to compute the inner product of two MPS. Both of these MPS are for a 1-D lattice (I mean they have all parameters in common) except the number of their sites; the first one has N sites and the other one N+1 sites.
Now my main question is how can I compute the inner product between these two MPS.

I tried inner() operator but (as I expected) I got an error:
(DimensionMismatch(“inner: mismatched lengths 10 and 11”)


Just as an idea to deal with this problem, may I add an extra unentangled site to the shorter lattice’s MPS, and then compute the inner product ?
If it’s possible, how could I add an extra unentangled site to a MPS?


You should be able to just write a loop contracting the tensors of the two MPS, for example:

using ITensors

function partial_inner(psi1, psi2)
  n1 = length(psi1)
  n2 = length(psi2)
  @assert n1 < n2
  o = ITensor(1.0)
  for j in 1:n2
    if j <= n1
      o = o * dag(psi1[j]) * psi2[j]
      o = o * psi2[j]
  return o

n = 4
s = siteinds("S=1/2", n + 1)
psi1 = randomMPS(s[1:n]; linkdims=3)
psi2 = randomMPS(s; linkdims=3)
o = partial_inner(psi1, psi2)



Hi Matt,
That’s really cool, so interesting code!
I’m new in ITensor and I didn’t know we can write some if/else or for loop codes for our ITensor objects.
Thank you for taking time to code my problem.

1 Like