Open4

ITensors.jl

ultimatileultimatile

randomMPO

In src/mps/mpo.jl

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)
ultimatileultimatile

MPSで時間発展を計算する際に肝となる部分はMPO-MPS積でapply(A::MPO, x::MPS; kwargs...)のところである.
applycontractを利用した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がある.

https://itensor.github.io/ITensors.jl/stable/MPSandMPO.html#ITensors.apply-Tuple{MPO, MPS}

ultimatileultimatile

TDVP[1]

ITensorMPS.jl v0.3.1を参照しています.
今後の更新で情報が古くなっている場合があるので注意してください.

documentあんまりない

ITensorMPS.tdvpのdocstringを読んで引数を確認する

ITensorMPS.tdvp
時間に依存しない演算子\hat{\mathcal{A}}の場合は

\exp \left( t \hat{\mathcal{A}} \right) \ket{\psi},

時間tに依存する演算子\hat{\mathcal{A}(t)}の場合は

\hat{\mathcal{T}}\int^t_{t_\mathrm{start}}\mathrm{d}t'\exp \left(\hat{\mathcal{A}}(t') \right) \ket{\psi}

を計算しMPSとして返す函数です.ここで時間発展させる時間の長さ tは一般に複素数で,実数の場合は虚時間発展を,純虚数の場合は実時間発展を実行することになります.
また,制約としてt=n \Delta tとなるように後述するt, nsteps, time_stepを設定する必要があります.通常はnstepstime_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値を確認することができます.

https://github.com/ITensor/ITensorMPS.jl/blob/8896bb17f8a797f8e058df257168317df0c3cc16/src/solvers/tdvp.jl#L65-L79

examplesにある実行例のsource codeを読んで設定引数・値を確認する

01_tdvp.jlのtdvpを呼び出している部分
  ϕ = 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となる.
        • なお,ttime_stepで割り切れない場合はerror
    • reverse_step=false
      • 調査中
  • maxdim, cutoffapplyで使われているものと同様なので説明は省略
  • 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.jlexponentiateが呼ばれる.default値
  • "applyexp": ITensors.jlapplyexpが呼ばれる.test用のsolverで使う必要はないとされている[2:1]

updater_backendexponentiateを指定した場合に呼び出されるexponentiate_updaterの仕様を確認する
https://github.com/ITensor/ITensorMPS.jl/blob/8896bb17f8a797f8e058df257168317df0c3cc16/src/solvers/tdvp.jl#L4-L7


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=2outputlevel>=3の場合の出力差分が確認できなかった

https://github.com/ITensor/ITensorMPS.jl/blob/8896bb17f8a797f8e058df257168317df0c3cc16/examples/solvers/03_tdvp_time_dependent.jl#L37-L40

脚注
  1. Time Dependent Variational Principle ↩︎

  2. https://itensor.discourse.group/t/best-practices-for-tdvp/1172 ↩︎ ↩︎