🕌
ITensorsで縮約の計算
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