In [30]:
using ITensors
# Create indices
i = Index(2, "i")
j = Index(2, "j")
k = Index(2, "k")
l = Index(2, "l")
m = Index(2, "m")
# Create random ITensor
tensor = randomITensor(i,j,k,l,m)
Out[30]:
ITensor ord=5 (dim=2|id=26|"i") (dim=2|id=475|"j") (dim=2|id=291|"k") (dim=2|id=803|"l") (dim=2|id=510|"m") NDTensors.Dense{Float64, Vector{Float64}}
In [31]:
# Compress tensor to MPS/TT
mps = MPS(tensor, (i, j, k, l, m); truncerr=10^-6, maxdim=10)
Out[31]:
MPS [1] ((dim=2|id=26|"i"), (dim=2|id=365|"Link,n=1")) [2] ((dim=2|id=365|"Link,n=1"), (dim=2|id=475|"j"), (dim=4|id=773|"Link,n=2")) [3] ((dim=4|id=773|"Link,n=2"), (dim=2|id=291|"k"), (dim=4|id=16|"Link,n=3")) [4] ((dim=4|id=16|"Link,n=3"), (dim=2|id=803|"l"), (dim=2|id=623|"Link,n=4")) [5] ((dim=2|id=623|"Link,n=4"), (dim=2|id=510|"m"))
In [33]:
function get_index(mps::MPS, index::Vector)
"""
Retrieve a single element of a tensor represented by an MPS/TT by performing the matrix product
Args:
mps: The MPS/TT
index: The index of the element to retrieve
"""
V = ITensor(1.)
for j=1:length(mps)
V *= (mps[j] * state(siteind(mps, j), index[j]))
end
v = scalar(V)
end
# Retrieve an element
get_index(mps, [1, 1, 2, 1, 1])
Out[33]:
-1.012932614052549
In [ ]: