5.4. tenes の入力ファイル

  • ファイルフォーマットは TOML 形式

  • parameter, tensor, evolution, observable, correlation の5つのセクションを持ちます。

5.4.1. parameter セクション

更新回数など、 計算にあらわれる種々のパラメータを記述します。 サブセクションとして general, simple_update, full_update, ctm, random を持ちます。

parameter.general

tenes の全般的な設定パラメータ

名前

説明

型

デフォルト

mode

計算モード

文字列

"ground state"

is_real

すべてのテンソルを実数に制限するかどうか

真偽値

false

fermion

フェルミオン系として扱うかどうか(実験的機能)

真偽値

false

iszero_tol

演算子テンソルの読み込みにおいてゼロとみなす絶対値カットオフ

実数

0.0

measure

基底状態計算において、物理量測定をするかどうか

真偽値

true

measure_interval

実時間発展・有限温度計算において物理量を測定する頻度

整数 or 整数のリスト

10

output

物理量などを書き込むディレクトリ

文字列

"output"

tensor_save

最適化後のテンソルを書き込むディレクトリ

文字列

""

tensor_load

初期テンソルを読み込むディレクトリ

文字列

""

  • mode

    • 計算モードを指定します

    • "ground state"

      • 基底状態計算

      • tenes_std は虚時間発展演算子 \(U(\tau) = \exp(-\tau \mathcal{H})\) を計算します

    • "time evolution"

      • 実時間発展計算

      • tenes_std は実時間発展演算子 \(U(t) = \exp(-it \mathcal{H})\) を計算します

    • "finite temperature"

      • 有限温度計算

      • tenes_std は虚時間発展演算子 \(U(\tau) = \exp(-\tau \mathcal{H})\) を計算します

  • is_real

    • true にするとテンソルの要素を実数に制限して計算を行います

    • 一つでも複素演算子があるとエラー終了します

  • fermion

    • 実験的機能です。 true にすると、サイトテンソルをフェルミオン(Z2 グレーディング付き)テンソルとして扱い、ボンド更新・測定時のフェルミオン交換符号を自動的に生成します

    • 実装は、フェルミオン系のテンソルネットワークの Z2 グレード付き(超ベクトル空間)の定式化に基づきます。各脚がパリティを持ち、転置・縮約・分解のたびに交換符号を生成します。定式化については Q. Mortier et al., SciPost Phys. 18, 012 (2025); N. Bultinck, D. J. Williamson, J. Haegeman, and F. Verstraete, Phys. Rev. B 95, 075108 (2017); N. Bultinck, D. J. Williamson, J. Haegeman, and F. Verstraete, J. Phys. A: Math. Theor. 51, 025202 (2018) を参照してください。測定で bra と ket の層が交差する箇所の符号は、等価な定式化である swap gate ( P. Corboz, R. Orús, B. Bauer, and G. Vidal, Phys. Rev. B 81, 165104 (2010) ) にあたります

    • 各サイトの物理基底のパリティを tensor.unitcell セクションの parity キーで指定する必要があります。パリティはサイト内の生成演算子順序を固定した上で定義します(tensor.unitcell セクション参照)

    • 演算子・ゲートの行列要素: 2サイト演算子の elements (i1 i2 o1 o2) は、順序付き2サイト Fock 基底

      \[|i_1 i_2\rangle = A^\dagger_1(i_1)\, A^\dagger_2(i_2)\, |0\rangle\]

      (\(A^\dagger(i)\) は固定した内部順序による局所基底 \(i\) の生成演算子列、サイト1 = source_site)における行列要素 \(\langle o_1 o_2 | O | i_1 i_2 \rangle\) です。この行列要素は フェルミオンの反交換関係込みで 評価してください。

      • 例: スピンあり電子では \(\langle \uparrow\downarrow, 0 |\, c^\dagger_{1\uparrow} c_{2\uparrow} \,| \downarrow, \uparrow \rangle = -1\) となります。符号を手で書くのではなく、関与するモードの2サイト Fock 空間を数値的に構成(Jordan-Wigner)して行列要素を読み出すことを推奨します

      \[\langle \uparrow\downarrow, 0 |\, c^\dagger_{1\uparrow} c_{2\uparrow} \,| \downarrow, \uparrow \rangle = \langle 0 |\, c_{1\downarrow} c_{1\uparrow} c^\dagger_{1\uparrow} c_{2\uparrow} c^\dagger_{1\downarrow} c^\dagger_{2\uparrow} \,| 0 \rangle = \langle 0 |\, c_{1\downarrow} c_{1\uparrow} c^\dagger_{1\uparrow} \left(- c^\dagger_{1\downarrow} c_{2\uparrow}\right) c^\dagger_{2\uparrow} \,| 0 \rangle = -1\]
    • サイト 間 の交換符号(2次元幾何由来のものを含む)はすべて TeNeS が生成します。ユーザーが与えるのは上記の符号込み局所行列のみです

    • 時間発展ゲートと2サイト演算子はフェルミオンパリティを保存する必要があります。1サイト観測量はパリティ奇でも定義できますが、その1サイト期待値は厳密に 0 になります。パリティ奇の1サイト演算子は、 ops 形式の2サイト物理量や [correlation] の因子として使えます

      • 例えば1粒子生成消滅演算子の期待値は 0 として出力されます。

    • 現バージョンでは基底状態計算と実時間発展(mode = "time evolution")に対応しています(simple update および full update)。simple update の環境は CTM または平均場、full update は CTM 環境のみです。2サイト物理量は明示的な elements 形式と ops = [A, B] 形式のどちらでも指定でき、4 x 4 の窓(|dx| <= 3 かつ |dy| <= 3)で測定できます。 [correlation] も利用でき、左または下の演算子を \(A\) とした \(\langle A_s B_t\rangle\) を出力します。パリティが異なる演算子の組は 0 として出力されます。 meanfield_env = true での長距離2サイト物理量と相関関数は、測定窓または相関鎖の外側を simple update の \(\lambda\) で閉じて評価します。最近接を超えるハミルトニアンボンドは fermion モードの simple update で利用できますが、 full_update.num_step > 0 のとき full update はそのようなボンドを拒否します。4 x 4 の窓の外にあるハミルトニアンボンドは、fermion モードではエネルギーを測定できないため拒否されます。 Use_RSVD 、 Simple_Gauge_Fix 、有限温度計算、マルチサイト演算子、サイトが自分自身と最近接になるユニットセル(LX = 1 、または LY = 1 かつ skew = 0)は非対応で、入力読み込み時にエラーになります。相関長も非対応で、 tenes_simple はフェルミオン模型に対する [correlation_length] をエラーとし、ソルバーは測定時に警告を出して測定を無効化します

    • fermion モードの実時間発展は、偶パリティのサイトだけからなる直積状態(真空や、二重占有と空のサイトの組み合わせなど)、偶パリティのランダム状態、または tensor_load で読み込んだ状態(基底状態からのクエンチなど)から始められます。奇パリティのサイトを含む直積状態は、基底状態計算と同じく拒否されます。大きいボンド次元(例えば D = 8)で直積状態から直接 full update を始めると、仮想空間のほとんどがまだ空のため、最初の数ステップのパリティ射影で止まることがあります。小さい D から始めるか、simple update を使ってください。

    • 最近接を超えるハミルトニアンボンドを含む場合、小さいボンド次元、例えば D = 2 では、ランダム初期状態が真空に落ちてそのまま残ることがあります。最近接項だけで収束させた状態から tensor_save と tensor_load で始めるか、より大きい D を使ってください。

    • fermion モードでは、出力添字に非ゼロ要素を一つも持たない2サイトゲートは、最近接ボンドであっても入力読み込み時に拒否されます。射影演算子のような非可逆なゲートがこの形になりえますが、 \(\exp(-\tau h)\) の形のゲートは影響を受けません。

  • iszero_tol

    • 各種演算子テンソル要素の実部・虚部の読み込みにおいて、絶対値が iszero_tol 以下はゼロとみなします

  • measure

    • 基底状態計算において、 false にすると物理量計算・保存をスキップします

    • 実行時間 time.dat は常に保存されます

  • measure_interval

    • 実時間発展計算および有限温度計算において、 物理量を測定する頻度を指定します

    • measure_interval ステップ計算した後に物理量を測定します

  • output

    • 物理量などの計算結果をこのディレクトリ以下に保存します

    • 空文字列の場合はカレントディレクトリに保存します

  • tensor_save

    • 最適化後のテンソルをこのディレクトリ以下に保存します

    • 空文字列の場合は保存しません

    • 保存の仕組みと、保存が中断されたときの対処は、下の「チェックポイントのファイル」を参照してください

  • tensor_load

    • 初期テンソルをこのディレクトリ以下から読み込みます

    • 空文字列の場合は読み込みません

    • tensor_save と同じディレクトリを指定できます。下の「チェックポイントのファイル」を参照してください

チェックポイントのファイル(tensor_save と tensor_load)

計算はテンソルをチェックポイントとして tensor_save のディレクトリへ保存し、後の計算が tensor_load から読み込みます。両方に同じディレクトリを指定すると、各計算が前の計算のチェックポイントから続きを行い、それを置き換えます。

  • 保存

    • 保存は、<保存先>/.tenes-save-tmp/ という作業用ディレクトリへ書き込み、完成してから1ファイルずつ保存先へ移す形で行われます。書き込み中にジョブが強制終了しても、保存先には直前のチェックポイントがそのまま残ります。作業用ディレクトリは保存の完了時に削除され、異常終了した run が残したものは次回の保存で削除されます

    • 移動の直前は作業用ディレクトリとチェックポイントが同時に存在するため、ディスク使用量が一時的にチェックポイント 2 個分になります

    • その保存が書かなかったチェックポイントのファイルは保存先から削除されます。サイト数や並列数を減らした計算で同じディレクトリへ保存しても、以前の計算のファイルは残りません。チェックポイント以外のファイルには手を触れません

    • 複数の計算を同時に走らせる場合、同じ tensor_save を指定しないでください。互いの作業用ディレクトリを上書きします

    • 保存できなかった場合、``tenes`` は非ゼロの終了コードで終わります。 測定量のファイルはそれまでどおり書き出されます。チェックポイントのファイルは、各 MPI プロセスが書くテンソルのデータも含めて書き終えた後にすべて確かめるので、ディスク満杯やクォータで途中までしか書けなかったファイルも失敗として扱います。保存の失敗で計算を捨てるのは惜しいものの、終了コードが 0 のままだと、前段の保存を後段が読む形の連鎖(tenes A && tenes B)で、後段が古いチェックポイントから黙ってやり直してしまうためです。ファイルシステムが後になって報告するエラーや、保存後にファイルが壊れたことは検出できません

  • ファイルの移動中に保存が中断された場合

    • チェックポイントを保存先へ移している途中で計算が終了したり、ファイルを移せなかったりすると、<保存先>/.tenes-save-incomplete が残ります。このとき保存先には新しいチェックポイントと直前のチェックポイントが混ざっている可能性があるため、tensor_load はそのチェックポイントの読み込みを拒否し、このファイルの内容を表示します

    • 手で直すには、<保存先>/.tenes-save-tmp/ に残っているファイルをすべて保存先へ移し、.tenes-save-incomplete を削除してください。このファイルにも同じ手順が、作業用ディレクトリの絶対パスとともに書かれています

    • 同じ保存先へ次に保存するときは、書き込みを始める前にこの修復を自動で行います。そこでもファイルを移せなかった場合は、そのファイルで止まり、何も保存せずに非ゼロの終了コードで終わります。まだ移していないファイルは作業用ディレクトリに、.tenes-save-incomplete も保存先に残っているので、上の手順で手で直せます

    • 保存の最後、またはこの自動修復の後で .tenes-save-incomplete だけを削除できなかった場合も、その旨を表示して非ゼロの終了コードで終わります。このときファイルはすべて移し終えているので、このファイルを手で削除すれば読み込めます

  • 読み込み

    • チェックポイントのサイト数が入力と異なる場合や、チェックポイントと入力の一方だけがフェルミオン系である場合は、すべての MPI プロセスで読み込みを拒否します

    • 実数の計算(is_real = true)で保存したテンソルは、基底状態から始める実時間発展のような複素数の計算で読み込めます。読み込み時に複素数へ変換されます。複素数の計算で保存したテンソルは is_real = true の計算では読み込めず、読み込みを拒否します。ヘッダに要素型(value_type)が記録されていないテンソルファイルも、読み込みを拒否します。リリース版の TeNeS が保存したファイルには必ず記録されています

    • 元のテンソルからボンド次元を変更することが可能です。大きくする場合にはゼロ埋めされ、小さくする場合には単純に切り捨てられます。ただしフェルミオン系では、仮想ボンドのパリティ台帳を矛盾無く切り捨てる必要があるため、現在のバージョンでは小さくすることができません。

    • ボンド次元を大きくした場合、拡張された成分はゼロなので、広げた空間を実際に使うには読み込み後に simple update あるいは full update を回す必要があります。測定するだけでは広がりません。

parameter.simple_update

simple update に関するパラメータ

名前

説明

型

デフォルト

tau

(虚)時間発展演算子における(虚)時間刻み \(\tau\)

実数 or 実数のリスト

0.01

num_step

simple update の回数

整数 or 整数のリスト

0

lambda_cutoff

simple update において平均場 \(\lambda\) の切り捨て閾値

実数

1e-12

gauge_fix

テンソルのゲージを固定するかどうか

真偽値

false

gauge_maxiter

ゲージ固定操作のループ最大数

整数

100

gauge_convergence_epsilon

ゲージ固定操作の収束判定値

実数

1e-2

  • tau

    • (虚)時間発展演算子における(虚)時間刻み \(\tau\) を指定します

      • tenes_std では時間発展演算子を計算するために用いられます

      • tenes では各ステップでの経過時間・逆温度を求めるために用いられます

        • For finite temperature calculation, note that the inverse temperature increase \(2\tau\) at a step because \(\rho(\beta + 2\tau) = U(\tau)\rho(\beta)\bar{U}(\tau)\)

        • 有限温度計算の場合、 \(\rho(\beta + 2\tau) = U(\tau)\rho(\beta)\bar{U}(\tau)\) なので、 ステップごとに逆温度は \(2\tau\) だけ増加することに注意してください。

    • リストを指定すると、時間発展演算子のグループごとに刻み幅を変えることができます

  • num_step

    • simple update の回数を指定します

    • リストを指定すると、時間発展演算子のグループごとに回数を変えることができます

parameter.full_update

full update に関するパラメータ

名前

説明

型

デフォルト

tau

(虚)時間発展演算子における(虚)時間刻み \(\tau\)

実数 or 実数のリスト

0.01

num_step

full update の回数

整数 or 整数のリスト

0

env_cutoff

full update で環境テンソルを計算する際にゼロとみなす特異値のcutoff

実数

1e-12

inverse_precision

full update で擬似逆行列を計算する際にゼロとみなす特異値のcutoff

実数

1e-12

convergence_epsilon

full update でtruncationの最適化を行う際の収束判定値

実数

1e-6

iteration_max

full update でtruncationの最適化を行う際のiterationの最大回数

整数

100

gauge_fix

テンソルのゲージを固定するかどうか

真偽値

true

fastfullupdate

Fast full update にするかどうか

真偽値

true

  • 諸注意

    • full update は CTM 環境のみ対応しており、meanfield_env = true との組み合わせはエラーになります

    • 非高速版(fastfullupdate = false)ではボンドごとに CTM を再収束するため、fast full update より遅くなります(自由フェルミオン D = 3、chi = 12 で約 9 倍)。フェルミオン系ではこの再収束を直前の環境を初期値として行います(warm start)。ボソン系の非高速版は従来どおり毎回一様ベクトルから収束させます

    • full update が forbidden parity ガードで停止するのは CTM が収束していないためで、多くの場合は状態に対して dimension (chi) が小さすぎます(CTM が落ち着かずに周期的に振れ続けます)。まず [parameter.ctm] の dimension を上げ、次に iteration_max を増やしてください。状態そのものが収束していなければ simple update も長くしてください

    • full update の環境(2サイト環境テンソル)はフェルミオンパリティを保存する必要があり、CTM の収束不足などで破れが閾値(1e-8 と [parameter.ctm] の convergence_epsilon の 100 倍の大きい方)を超えるとエラーで停止します。その場合は [parameter.ctm] の iteration_max を増やすか convergence_epsilon を小さくしてください

    • ボンド次元が小さいとき(例: 自由フェルミオンの D = 2)、simple update で収束した状態から full update を始めるとエネルギーが 上がる ことがあります。これは射影虚時間発展の固定点が、表現力不足の状態空間では simple update の固定点より高くなりうるためです。

parameter.ctm

角転送行列 (CTM) に関するパラメータ

名前

説明

型

デフォルト

dimension

CTM のボンド次元 \(\chi\)

整数

4

projector_cutoff

CTMのprojectorを計算する際にゼロとみなす特異値のcutoff

実数

1e-12

convergence_epsilon

CTMの収束判定値

実数

1e-6

use_onesite_rdm_convergence

CTMの収束判定に1サイト縮約密度行列の反復間距離も用いる

真偽値

true

iteration_max

CTMの収束iterationの最大回数

整数

100

projector_corner

CTMのprojector計算で1/4角のテンソルのみを使う

真偽値

true

use_rsvd

SVD を 乱択SVD で置き換えるかどうか

真偽値

false

rsvd_oversampling_factor

乱択SVD 中に計算する特異値の数の、最終的に用いる数に対する比率

実数

2.0

meanfield_env

CTM ではなく simple update で得られる平均場環境を用いる。フェルミオン系でも使用でき、測定窓または相関鎖の外側を simple update の lambda で閉じて評価するため CTM 版より大幅に軽いが、精度は simple update 相当

真偽値

false

use_onesite_rdm_convergence が true の場合、角転送行列の特異値スペクトルに加えて、1サイト縮約密度行列の反復間距離を用いて CTM の収束を判定します。 距離は全サイト・全行列要素に対する max 要素ノルムを、その密度行列のトレースで割ったものです(密度行列の形の変化とノルムの相対変化の両方が含まれます)。 次元1の仮想ボンドによってテンソルネットワークが独立な部分に分解する構成、例えば横方向の仮想ボンド次元を1とした擬一次元的な計算では、角スペクトルだけでは収束を誤検知することがあるため、その対策として使われます(アルゴリズムの説明も参照してください)。 (なお、そのような擬一次元的な計算を推奨しているわけではないことに注意してください。TeNeS が対象としているのは2次元格子です。) false にすると、従来の角スペクトルのみの収束判定に戻ります。 収束時の観測量の残差はおおむね convergence_epsilon 程度のスケールになるため、より高精度が必要な場合は convergence_epsilon を小さくしてください。

乱拓SVDを用いたテンソル繰り込み群の手法については、 S. Morita, R. Igarashi, H.-H. Zhao, and N. Kawashima, Phys. Rev. E 97, 033310 (2018) を参照してください。

parameter.random

疑似乱数生成器に関するパラメータ

名前

説明

型

デフォルト

seed

テンソルの初期化や乱択SVD に用いる疑似乱数生成器のシード

整数

11

MPI 並列において、各プロセスは seed にプロセス番号を足した数を実際のシードとして持ちます。

例

[parameter]
[parameter.general]
is_real = true
[parameter.simple_update]
num_step = 100
tau = 0.01
[parameter.full_update]
num_step = 0  # No full update
tau = 0.01
[parameter.ctm]
iteration_max = 10
dimension = 9 # CHI

5.4.2. tensor セクション

「ユニットセル」の情報を記述します(ボンドの情報は hamiltonian (tenes_std) や evolution (tenes) で与えます)。 ユニットセルは Lx かける Ly の大きさをもつ長方形の形をしています。 また、サブセクション unitcell を持ちます。

名前

説明

型

デフォルト

L_sub

ユニットセルの大きさ

整数または整数のリスト

--

skew

skew 境界条件におけるシフト値

整数

0

L_sub として2つの整数からなるリストを渡した場合、はじめの要素が Lx に、もう片方が Ly になります。 3つ以上の要素からなるリストを渡した場合にはエラー終了します。 L_sub として整数を渡した場合、 Lx と Ly とが等しくなります。

ユニットセル内のサイトは0から順番に番号付けされます。 x 方向から順に並びます。

../_images/tensor_sec_fig1.png

図 5.8 L_sub = [2,3] としたときの例

skew は y 方向にユニットセル1つ分動いたときのx 方向のズレです。 -Lx < skew < Lx の範囲で指定します。 skew と skew ± Lx は同じ格子を表すので、範囲外の値はエラーになります。

../_images/tensor_sec_fig2.png

図 5.9 L_sub = [3,2], skew = 1 としたときの例 (罫線はユニットセルの区切り)

tensor.unitcell サブセクション

サイトテンソル \(T_{ijkl\alpha}^{(n)}\) の情報を指定します。 ここで \(i,j,k,l\) は virtual bond のインデックス、 \(\alpha\) は physical bond のインデックス、 \(n\) はサイト番号を意味します。

名前

説明

型

index

サイト番号

整数 or 整数のリスト

physical_dim

サイトテンソルの physical bond の次元

整数

virtual_dim

サイトテンソルの virtual bond の次元 \(D\)

整数 or 整数のリスト

initial_state

初期状態

実数のリスト

noise

初期テンソルのゆらぎの大きさ

実数

parity

物理基底のフェルミオンパリティ(fermion モード時のみ)

整数のリスト

index にリストを渡すことによって、複数のサイトを同時に指定できます。 空のサイト [] は全サイトを意味します。

virtual_dim にリストを渡すことで、4方向のボンド次元を個別に指定できます。 順番は、左(-x)、上(+y)、右(+x)、下(-y) の順番です。

parity は parameter.general.fermion = true のとき必須で、 physical_dim 個の 0(偶)または 1(奇)を並べます。 parity[i] は物理基底の第 i 状態に含まれるフェルミオン数の偶奇です。 たとえばスピンレスフェルミオンの基底 \(\{|0\rangle, |1\rangle\}\) は parity = [0, 1] です。

1サイトに複数のフェルミオンモードがある場合(例: スピンあり電子、 physical_dim = 4)は、 サイト内の生成演算子の順序を1つ固定し、 以後すべてで同じ順序を使ってください 。 各基底状態は、固定した内部順序で生成演算子を真空に作用させたものとして定義します。 たとえば内部順序を \((\uparrow, \downarrow)\) とすると

\[|0\rangle,\quad |{\uparrow}\rangle = c^\dagger_\uparrow |0\rangle,\quad |{\downarrow}\rangle = c^\dagger_\downarrow |0\rangle,\quad |{\uparrow\downarrow}\rangle = c^\dagger_\uparrow c^\dagger_\downarrow |0\rangle\]

であり、 parity = [0, 1, 1, 0] となります。 選んだ生成演算子順序は parity のリスト自体には現れませんが、 演算子・ゲートの行列要素の符号を決めます (parameter.general セクションの fermion の項を参照)。 正しく計算するためには、すべての演算子・ゲート・初期状態を同一の規約で書く必要があります。

初期プロダクト状態は各サイトでパリティ偶である必要があり、 パリティ奇の initial_state はエラーになります。

系全体の初期状態 \(|\Psi\rangle\) は、各サイト \(i\) の初期状態 \(|\Psi_i\rangle\) の直積で与えられます。

\[|\Psi\rangle = \otimes_i |\Psi_i\rangle\]

サイトテンソルはこの直積状態を表現するように初期化されます。 initial_state では各サイト \(i\) の初期状態 \(|\Psi_i\rangle = \sum_\alpha A_\alpha |\alpha\rangle_i\) における実展開係数 \(A_\alpha\) の値を指定します。 係数は自動的に規格化されます。 テンソル自体は、 すべてのvirtual ボンドインデックスが0 である要素が、 \(T_{0000\alpha} = A_\alpha\) のように初期化されます。 他の要素には [-noise, noise) の一様乱数が互いに独立に入力されます。 たとえば、 \(S=1/2\) のとき、 \(S^z\) 方向に向いた状態 \(|\Psi_i\rangle = |\uparrow\rangle = |0\rangle\) を初期値にしたい場合には initial_state = [1.0, 0.0] に、 \(S^x\) 方向に向いた状態 \(|\Psi_i\rangle = \left(|\uparrow\rangle + |\downarrow\rangle\right)/\sqrt{2}\) を初期値にしたい場合には initial_state = [1.0, 1.0] とします。

initial_state にゼロのみからなる配列を渡した場合、テンソルのすべての要素が独立に [-noise, noise) で乱数初期化されます。

5.4.3. observable セクション

物理量測定に関する諸々を記述します。 onesite, twosite と multisite の3種類のサブセクションを持ちます。

observable.onesite

ひとつのサイト上で定義される物理量を示す一体演算子を定義します。

名前

説明

型

name

演算子の名前

文字列

group

演算子の識別番号

整数

sites

サイト番号

整数 or 整数のリスト

dim

演算子の次元

整数

elements

演算子の非ゼロ要素

文字列

coeff

演算子にかかる係数(実部)

実数

coeff_im

演算子にかかる係数(虚部)

実数

name は演算子の名前です。

group はonesite 演算子の識別番号です。

sites は演算子が作用するサイト番号です。 リストを渡すことで複数同時に定義できます。 空リスト [] は全サイトを意味します。

dim は演算子の次元です。

elements は演算子の非ゼロ要素を指定する文字列です。 1つの要素は、空白で区切られた2つの整数と2つの浮動小数点数からなる1つの行で表されます。

  • 最初の2つはそれぞれ演算子が作用する前と後の状態番号を示します。

  • あとの2つはそれぞれ演算子の要素の実部と虚部を示します。

coeff, coeff_im は演算子にかかる係数の実部と虚部です。 省略した場合はそれぞれ 1.0, 0.0 になります。

例

S=1/2 のSz 演算子

\[\begin{split}S^z = \left(\begin{array}{cc} 0.5 & 0.0 \\ 0.0 & -0.5 \end{array}\right)\end{split}\]

を具体例として説明します。

まず、名前は name = "Sz" として、識別番号は group = 0 としておきます。

次に、演算子の作用するサイトですが、すべてのサイトで同一の演算子を用いる場合には sites = [] とします。 そうではない場合、例えばスピンの大きさが異なるサイトがある場合には、 sites = [0,1] などと具体的なサイト番号を指定します。

演算子の次元は、上に示した行列表示のサイズなので、 dim = 2 です。

最後に演算子の要素です。 非ゼロ要素について、そのインデックス(ゼロ始まり)と要素を順番に並べれば良いので、

elements = """
0 0   0.5 0.0
1 1  -0.5 0.0
"""

となります。

結果として、 S=1/2 の Sz 演算子は次のように定義されます。

[[observable.onesite]]
name = "Sz"
group = 0
sites = []
dim = 2
elements = """
0 0  0.5 0.0
1 1  -0.5 0.0
"""

observable.twosite

ふたつのサイト上で定義される物理量を示す演算子を定義します。

名前

説明

型

name

演算子の名前

文字列

group

演算子の識別番号

整数

bonds

ボンド

文字列

dim

演算子の次元

整数のリスト

elements

演算子の非ゼロ要素

文字列

ops

onesite 演算子の識別番号

整数のリスト

coeff

演算子にかかる係数(実部)

実数

coeff_im

演算子にかかる係数(虚部)

実数

name は演算子の名前です。

group は twosites 演算子の識別番号です。

bonds は演算子が作用するサイト対の集合を表す文字列です。 3つの整数からなる1行が1つのサイト対を意味します。

  • 最初の整数は 始点サイト (source) の番号です。

  • あとの2つの整数は source site からみた終点サイト (target) の座標 (dx, dy) です。

    • dx, dy ともに \(-3 \le dx \le 3\) の範囲に収まる必要があります。

dim は演算子の次元、すなわち作用するサイトの取りうる状態数です。 例として、2つの \(S=1/2\) スピンの相互作用の場合は、 dim = [2,2] です。

elements は演算子の非ゼロ要素を指定する文字列です。 1つの要素は4つの整数と2つの浮動小数点数を空白区切りからなる1つの行からなります。

  • 最初の2つは演算子が作用する 前 の source site, target site の状態番号を示します。

  • つぎの2つは演算子が作用した 後 の source site, target site の状態番号を示します。

  • 最後の2つはそれぞれ演算子の要素の実部と虚部を示します。

ops を使うと observable.onesite で定義した1体演算子の直積として2体演算子を定義できます。 例えば observable.onesite の group=0 として \(S^z\) を定義していた場合には、 ops = [0,0] として \(S^z_iS^z_j\) を表現できます。

elements と ops を同時に定義した場合にはエラー終了します。

coeff, coeff_im は演算子にかかる係数の実部と虚部です。 省略した場合はそれぞれ 1.0, 0.0 になります。

例

ここでは具体例として、Lsub=[2,2] の正方格子 S=1/2 ハイゼンベルグ模型のボンドハミルトニアンのエネルギーを求めるため、 ハミルトニアン

\[\mathcal{H}_{ij} = S_i^z S_j^z + \frac{1}{2} \left[S_i^+ S_j^- + S_i^- S_j^+ \right]\]

を2体演算子として設定する例を説明します。

まず、名前と識別番号はそれぞれ name = "hamiltonian" と group = 0 としておきます。 それぞれのサイトの状態は \(|\uparrow\rangle\) と \(|\downarrow\rangle\) の2状態の重ね合わせとなるため、次元は 2 となり、 dim = [2,2] となります。

次にボンドです。サイトは 図 5.7 のように並んでいます。 0 番と 1 番をつなぐボンドは、 1番は 0 番から見て (1,0) の位置にあるので 0 1 0 と表現されます。 同様に 1 番と 3 番をつなぐボンドは、 3 番が 1 番から見て (0,1) の位置にあるので 1 0 1 と表現されます。

../_images/obs_sec_fig1.png

図 5.10 Lsub=[2,2] の正方格子 S=1/2 ハイゼンベルグ模型のサイトの並び順

最後に演算子の要素です。 まずはサイトの基底を番号付ける必要がありますが、ここでは \(|\uparrow\rangle\) を0, \(|\downarrow\rangle\) を 1 とします。 この基底と番号を用いると、 例えば対角項の1つ \(\left\langle \uparrow_i \uparrow_j | \mathcal{H}_{ij} | \uparrow_i \uparrow_j \right\rangle = 1/4\) は 0 0 0 0 0.25 0.0 と表現されます。 他に、非対角項の1つ \(\left\langle \uparrow_i \downarrow_j | \mathcal{H}_{ij} | \downarrow_i \uparrow_j \right\rangle = 1/2\) は 1 0 0 1 0.5 0.0 と表現されます。

結果として、 S=1/2 のハイゼンベルグハミルトニアンは次のように定義されます。

[[observable.twosite]]
name = "hamiltonian"
group = 0
dim = [2, 2]
bonds = """
0 0 1
0 1 0
1 0 1
1 1 0
2 0 1
2 1 0
3 0 1
3 1 0
"""
elements = """
0 0 0 0  0.25 0.0
1 0 1 0  -0.25 0.0
0 1 1 0  0.5 0.0
1 0 0 1  0.5 0.0
0 1 0 1  -0.25 0.0
1 1 1 1  0.25 0.0
"""

observable.multisite

みっつ以上のサイト上で定義される物理量を示す演算子を定義します。 サイトごとの1体演算子の直積として定義されます。

名前

説明

型

name

演算子の名前

文字列

group

演算子の識別番号

整数

multisites

サイトの組み合わせ

文字列

ops

onesite 演算子の識別番号

整数のリスト

coeff

演算子にかかる係数(実部)

実数

coeff_im

演算子にかかる係数(虚部)

実数

name は演算子の名前です。

group は multisites 演算子の識別番号です。

multisites は演算子が作用するサイト群の集合を表す文字列です。 整数からなる1行が1つのサイト群を意味します。

  • 最初の整数は 始点サイト (source) の番号です。

  • のこりの整数は source site からみた他サイト (target) の座標の組 (dx, dy) を並べたものです。

    • Nサイトの場合、 source_site dx2 dy2 dx3 dy3 ... dxN dyN という形式です。

    • \(4 \times 4\) の正方形内に収まる必要があります。

ops を用いて observable.onesite で定義した1体演算子の直積として演算子を定義します。 例えば observable.onesite の group=0 として \(S^z\) を定義していた場合には、 ops = [0,0,0] として \(S^z_iS^z_jS^z_k\) を表現できます。

coeff, coeff_im は演算子にかかる係数の実部と虚部です。 省略した場合はそれぞれ 1.0, 0.0 になります。

5.4.4. evolution セクション

simple update, full update で使う(虚)時間発展演算子を記述します。 1サイトおよび隣接2サイトに関する(虚)時間発展を定義できます。 次のようなフィールドを持つ simple, full の2つのサブセクションを持ちます。

名前

説明

型

group

演算子のグループ

整数 (0-)

site

site の番号

整数 (0-)

source_site

source site の番号

整数 (0-)

source_leg

source site から見た target site の方向

整数 (0-3)

dimensions

虚時間発展演算子テンソルの次元

整数のリスト

elements

虚時間発展演算子テンソルの非ゼロ要素

文字列

group は時間発展演算子のグループを指定します。 parameter.simple_update および parameter.full_update における tau や num_steps で刻み幅やステップ数をリストを用いて複数指定したときに、そのインデックスに対応します。

site は1サイト演算子に、 source_site と source_leg は2サイト演算子に使用します。

source_leg は 0 から3までの整数で指定します。 -x 方向から順番に時計回りに、 0:-x, 1:+y, 2:+x, 3:-y として定義されています。

dimensions は observable の dim と異なり、すべての足の次元を指定する必要があります。 足の順番は elements と同様に、 source_initial, target_initial, source_final, target_final の順番です。 長距離ボンドでは、 [[evolution.simple]] は最近接ゲートの鎖として与えます。 鎖の途中のサイトは、一時的に異なる物理次元を持ちます。 そのようなゲートでは、太った足は target 側の出力 target_final で、消費される太った足は source 側の入力 source_initial です。 fermion モードでは太った足のパリティは非ゼロ要素から推定されるため、その足の各添字は一意のパリティを持つ必要があります。

例

[evolution]

# One site
[[evolution.simple]]
site = 0
dimensions = [2, 2]
elements = """
0 0  1.0012507815756226 0.0
1 1  0.9987507809245809 0.0
"""

# Two site
[[evolution.simple]]
source_site = 0
source_leg = 2
dimensions = [2, 2, 2, 2]
elements = """
0 0 0 0  0.9975031223974601 0.0
1 0 1 0  1.0025156589209967 0.0
0 1 1 0  -0.005012536523536871 0.0
1 0 0 1  -0.005012536523536871 0.0
0 1 0 1  1.0025156589209967 0.0
1 1 1 1  0.9975031223974601 0.0
"""

5.4.5. correlation セクション

サイト演算子の相関関数 \(C = \left\langle A(\boldsymbol{r}_0)B(\boldsymbol{r}_0+\boldsymbol{r})\right\rangle\) に関する情報を指定するセクションです。 本セクションを省略した場合、相関関数は計算されません。

座標は正方格子TNS の座標系で測られます。すなわち、右隣のテンソルは \(\boldsymbol{r} = (1,0)\) で、真上は \(\boldsymbol{r} = (0,1)\) です。 中心座標 \(\boldsymbol{r}_0\) として、ユニットセル内のすべてのサイトが用いられます。 また、\(\boldsymbol{r}\) は \(x\) ないし \(y\) 軸に平行な方向に、正の向きにのみ動きます。すなわち、

\[\boldsymbol{r} = (0,0), (1,0), (2,0), \dots, (r_\text{max}, 0), (0,1), (0,2), \dots, (0, r_\text{max})\]

です。

名前

説明

型

r_max

相関関数の距離 \(r\) の最大値

整数

operators

相関関数を測る1体演算子 A, B を表す番号

整数のリストのリスト

演算子は observable.onesite セクションで指定したものが用いられます。

例

例えば \(S^z\) が0 番で、 \(S^x\) が1 番として定義されている場合、

[correlation]
r_max = 5
operators = [[0,0], [0,1], [1,1]]

では相関関数 \(S^z(0)S^z(r), S^z(0)S^x(r), S^x(0)S^x(r)\) が、 \(0 \le r \le 5\) の範囲で測定されます。

5.4.6. correlation_length セクション

相関長 \(\xi\) の計算に関する情報を指定するセクションです。

名前

説明

型

デフォルト

measure

相関長を測るかどうか

真偽値

true

num_eigvals

計算する転送行列の固有値の数

整数

4

maxdim_dense_eigensolver

密行列の対角化手法を用いる最大行列サイズ

整数

200

arnoldi_maxdim

Arnoldi 法で生成する Hessenberg 行列の次元

整数

0 (自動)

arnoldi_restartdim

Arnoldi 法のリスタートで生成する初期ベクトルの本数

整数

0 (自動)

arnoldi_maxiterations

Arnoldi 法の最大イテレーション回数

整数

0 (自動)

arnoldi_rtol

Arnoldi 法で目指す相対残差

実数

1e-10

eigensolver

転送行列の固有値ソルバ(auto / arpack / builtin)

文字列

auto

相関長は転送行列の固有値から計算されます。 行列サイズが maxdim_dense_eigensolver 以下のときには密行列対角化(?geev ルーチン)による対角化を、 そうでない場合は Implicit Restart Arnoldi (IRA)法による対角化を用いて固有値を計算します。

IRA 法では、 Arnoldi 過程によって大きさ arnoldi_maxdim のHessenberg 行列を生成し、その固有値を計算します。 収束していない場合は、新たに arnoldi_restartdim 本の初期ベクトルを作成し、 Arnodi 過程をやり直します (restart)。

arnoldi_maxdim ・ arnoldi_restartdim ・ arnoldi_maxiterations に 0 以下の値を指定すると(デフォルト)、使用するソルバに応じた値が自動的に使われます。

  • ARPACK-NG: arnoldi_maxdim は \(\max(2 \times \text{num\_eigvals} + 1, 25)\) 、 arnoldi_maxiterations は 10。ARPACK-NG は restart により小さい部分空間でも 確実に収束できるため、小さめの部分空間と多めの restart 回数が効率的です。

  • 組み込みソルバ: arnoldi_maxdim は \(\max(2 \times \text{num\_eigvals} + 1, 50)\) 、 arnoldi_maxiterations は 1。restart に頼らず 1 回の Arnoldi 過程で 収束する大きさの部分空間を使います。

  • arnoldi_restartdim は \(\max(\text{num\_eigvals} + 1, \text{arnoldi\_maxdim} / 2)\) です。

収束に必要な部分空間の次元は固有値の分布(ギャップ)で決まり、行列サイズには ほとんど依存しません。相関長が大きい(臨界点に近い)系では転送行列のスペクトルが 密になり収束が遅くなるため、 arnoldi_maxdim を増やすか、restart 回数 arnoldi_maxiterations を増やしてください。 ARPACK-NG 使用時に部分空間が不足すると、 arnoldi_maxdim が自動(0 以下)の 場合は部分空間を 2 倍(上限は行列サイズ)にしながら収束するまで自動的に再試行します。 arnoldi_maxdim を明示的に指定した場合は再試行せず、未収束の固有値は NaN として 出力され、相関長 \(\xi\) の列も NaN になります (組み込みソルバは未収束でも近似値をそのまま返します)。

行列サイズが maxdim_dense_eigensolver より大きい場合に使う反復固有値ソルバは eigensolver で選べます。

  • "auto" (デフォルト): ARPACK-NG 付きでビルドされていれば ARPACK-NG を、 そうでなければ組み込みの IRA 法を使います。

  • "arpack": ARPACK-NG を使います。ARPACK-NG なしでビルドされたバイナリでは 入力エラーになります(CMake オプション -DENABLE_ARPACK=ON でビルドしてください)。

  • "builtin": 組み込みの IRA 法を使います。

ARPACK-NG を使う場合、 arnoldi_maxdim は Krylov 部分空間の次元 (ncv)、 arnoldi_maxiterations は implicit restart の最大回数、 arnoldi_rtol は Ritz 値の相対残差の許容値として引き継がれます。 arnoldi_restartdim は組み込みソルバでのみ意味を持ちます。