ITensors.jl
randomMPO
4 methods for generic function "randomMPO":
[1] randomMPO(sites::Vector{<:Index})
[2] randomMPO(sites::Vector{<:Index}, m::Int64)
[3] randomMPO(rng::Random.AbstractRNG, sites::Vector{<:Index})
[4] randomMPO(rng::Random.AbstractRNG, sites::Vector{<:Index}, m::Int64)
m=1
しか使えない...(m
はlinkdims
に対応するはず)
MPSで時間発展を計算する際に肝となる部分はMPO-MPS積でapply(A::MPO, x::MPS; kwargs...)
のところである.
apply
がcontract
を利用したaliasになっていてdocumentが分かりくかったので若干補足.
MPO-MPS積計算
apply(A::MPO, x::MPS; kwargs...)
-
apply(A::MPO, x::MPS; kwargs...)
=replaceprime(contract(A, x; kwargs...), 2 => 1)
- 説明のため返り値のMPSを
y
と呼ぶ.すなわちy = apply(A::MPO, x::MPS; kwargs...)
-
kwargs
は可変長引数で指定しなくても実行が可能で,指定しない場合は以下のdefault値が適用される.
apply(A, x, cutoff=1e-14, maxdim=maxlinkdim(A) * maxlinkdim(x), mindim=1, alg="zipup", truncate=true)
-
kwargs
にはcutoff
,maxdim
,mindim
,alg
,trunctate
がある.-
cutoff
:無視する特異値の大きさ.default値1e-14
はほぼ無視しないことに対応しているので,これより大きい何らかの値を指定することが推奨されている. -
maxdim
:考慮するMPSy
のbond次元の最大値.default値はy
が取りうるbond次元の最大値に対応しているので,これは最大bond次元に実質制限がないことを意味する. -
mindim
:考慮するMPSy
のbond次元の最小値.基本的にdefault値の1で問題ない. -
alg
: MPO-MPS計算を実行する際に使われるalgorithm.default値は"zipup"
.その名の通りzipup algorithmで,他の選択肢にはnaive
がある.- zip-up algorithmの詳細はarXiv:1901.05824のFig. 9などを参照.
-
[1]
TDVPITensorMPS.jl v0.3.1を参照しています.
今後の更新で情報が古くなっている場合があるので注意してください.
documentあんまりない
-
https://github.com/ITensor/ITensorTDVP.jl/blob/main/README.md
- packageとしては名前が変わって非推奨になっているが,引数などの書き方などの使用に関する情報はここが一番詳しそう
-
https://github.com/ITensor/ITensorMPS.jl にある
examples/solvers
directoryにあるのが動くcode例-
01_tdvp.jl
が一番簡単な使い方. Heisenberg鎖の基底状態を虚時間発展で計算しているS=1/2 -
03_tdvp_time_dependent.jl
は実時間発展
-
ITensorMPS.tdvp
のdocstringを読んで引数を確認する
ITensorMPS.tdvp
は
時間に依存しない演算子
時間
を計算しMPSとして返す函数です.ここで時間発展させる時間の長さ t
は一般に複素数で,実数の場合は虚時間発展を,純虚数の場合は実時間発展を実行することになります.
また,制約としてt
, nsteps
, time_step
を設定する必要があります.通常はnsteps
かtime_step
のいずれか一方を設定します.その場合,自動的に制約を満たすようにもう一方が設定されます.nsteps
およびtime_step
の両方を設定し,制約を満たさない場合errorとなります.
tdvp(operator, t::Number, init::MPS; time_step, nsteps, kwargs...) -> MPS
必須引数
-
operator
: 状態に作用させる指数函数の肩に乗せる演算子\hat{\mathcal{A}} -
t
: 時間発展させる時間t -
init
: 初期MPS\ket{\psi}
任意引数
-
time_step
: 時間の刻み幅\Delta t -
nsteps
: 時間の刻み数n -
kwargs...
: その他の可変長keyword引数
ITensorMPS.tdvp
のsource codeを読んで引数のdefault値を確認する
実際のsource codeを確認すると以下のようにdocstringに書かれていない引数を含めてdefault値を確認することができます.
examples
にある実行例のsource codeを読んで設定引数・値を確認する
ϕ = tdvp(
H,
-20.0,
ψ;
time_step=-1.0,
maxdim=30,
cutoff=1e-10,
normalize=true,
reverse_step=false,
outputlevel=1,
)
- 第1引数
operator
としてH
- 第2引数
t
として-20.0
- 実数なので虚時間発展
- 第3引数
init
としてψ
- keyword引数のうちtdvpの引数に定義されていたものとして
-
time_step=-1.0
-
t=-20.0
およびnsteps
が未設定であることよりnsteps=Int(t / time_step)=20
となる.- なお,
t
がtime_step
で割り切れない場合はerror
- なお,
-
-
reverse_step=false
- 調査中
-
-
maxdim
,cutoff
はapply
で使われているものと同様なので説明は省略 -
normalize=true
- 状態を規格化するか否か.
- 規格化していない状態が欲しいなど特別な理由がない限り
true
推奨[2]
-
nsweeps
,sweep_observer!
:steps
のaliasとして存在しているので基本的に無視して良い -
step_observer!
: 計算途中の状態を出力する形式を指定するobserverを自分で定義して渡す場合に用いる -
time_start=zero(t)
- 時間発展の開始時刻
を指定する.時間非依存演算子を用いた場合t_\mathrm{start} になるだけなので使うのは時間依存演算子の場合.t\to t-t_\mathrm{start}
- 時間発展の開始時刻
updater_backend
"exponentiate"
と"applyexp"
が指定可能.
厳密に言うと指定可能な引数は後述のupdater
に依存するためupdater
が受け付けられるStringが指定可能.
"exponentiate"
と"applyexp"
はdefaultのupdater
であるtdvp_updater
が受付可能なもの
-
"exponentiate"
:KrylovKit.jl
のexponentiate
が呼ばれる.default値 -
"applyexp"
:ITensors.jl
のapplyexp
が呼ばれる.test用のsolverで使う必要はないとされている[2:1]
updater_backend
にexponentiate
を指定した場合に呼び出されるexponentiate_updater
の仕様を確認する
outputlevel
-
outputlevel
は整数値を設定し実行中の情報出力の情報量を制御する- 数字が大きいほど情報量が多くなる
- 1より小さいと出力されない
- 値が小さいときに出力されているものは値をそれより大きくした場合にも出力される.
outputlevel<1
出力なし
outputlevel=1
step(sweep)単位での情報が出力される
After sweep 1: maxlinkdim=20 maxerr=6.94E-11 current_time=-1.0 time=7.409
outputlevel>=2
1step(sweep)中の各bondの情報が出力される
Sweep 1, direction Base.Order.ForwardOrdering(), bond (1,2)
Truncated using cutoff=1.0E-10 maxdim=3.0E+01 mindim=1 current_time=-0.5
Trunc. err=0.00E+00, bond dimension 2
03_tdvp_time_dependent.jl
には以下のように記載されているがoutputlevel=2
とoutputlevel>=3
の場合の出力差分が確認できなかった
-
Time Dependent Variational Principle ↩︎
-
https://itensor.discourse.group/t/best-practices-for-tdvp/1172 ↩︎ ↩︎