🕌

ITensorsで縮約の計算

2023/12/26に公開

ITensorsを使ったMPSの縮約の計算

一部のMPSのコアの縮約

ITensorsで要素をある足の要素を固定し、次に縮約の計算をする方法をメモ。最後に内積を計算する。

ステップ1. ITensorsでTensor train(TT)を作成
ステップ2. TT の最後のテンソル M[end] のインデックスを固定
ステップ3. M[end-1] *= M[end] でインデックスを固定した M[end] を M[end-1] にかける
ステップ4. M_ = MPS(M[1:end-1])

これでMPS同士の内積が計算が実行できる。
特別な関数を使わなくても、* で共通したインデックスの縮約計算ができる。

それぞれのステップのコードを見てみる
ステップ1

R = 4 
d = 3 
s = siteinds(d, R) 
chi = 4 
chi2 = 5 
psi = randomMPS(s; linkdims=chi) 
phi = randomMPS(s; linkdims=chi2) 

ステップ2

# R番目のテンソルのlocal dimをlocal_dim_last[1]に固定する。
local_dim_last = [1, 2, 3] 
psi[R] = psi[R] * state(s[R], local_dim_last[3]) 
phi[R] = phi[R] * state(s[R], local_dim_last[3]) 

ステップ3

psi[end-1] *= psi[end]
phi[end-1] *= phi[end]

ステップ4

M_1 = MPS(psi[1:end-1])
M_2 = MPS(phi[1:end-1])

inner(M_1, M_2)

全てのコアの縮約

R = 10
D = 4
sites = [Index(2, "Qubit,n=$n") for n in 1:R]
# MPS
M = randomMPS(sites; linkdims=D_org)
tensor_org = reduce(*, M_org)

出力を見ると、link方向のindexに関して縮約をとったMPSが得られていることがわかる。

julia> tensor_org
ITensor ord=10 (dim=2|id=392|"Qubit,n=1") (dim=2|id=33|"Qubit,n=2") (dim=2|id=138|"Qubit,n=3") (dim=2|id=280|"Qubit,n=4") (dim=2|id=974|"Qubit,n=5") (dim=2|id=324|"Qubit,n=6") (dim=2|id=188|"Qubit,n=7") (dim=2|id=268|"Qubit,n=8") (dim=2|id=204|"Qubit,n=9") (dim=2|id=724|"Qubit,n=10")
NDTensors.Dense{Float64, Vector{Float64}}

Discussion