Skip to main content
IBM Quantum Platform

動的MPF

qiskit_addon_mpf.dynamic

ダイナミックMPF係数。

このモジュールは、動的(つまり時間依存)MPF係数を計算するための一次方程式系(LSE)の生成関数を提供します。

setup_dynamic_lse

setup_dynamic_lse(trotter_steps, time, identity_factory, exact_evolver_factory, approx_evolver_factory, initial_state)

GitHub

動的 MPF 係数を計算するための一次方程式系を返す。

この関数は DynamicMPF グラム行列の成分を計算するアルゴリズム(LSE.A、 [1] と [2] の MM )と重なりベクトル(LSE.b提供された時間発展パラメータについては、 [1] と [2] の LL

グラム行列の要素、 MijM_{ij}、およびオーバーラップベクトル、 LiL_i は以下のように定義される

Mij=Tr(ρki(t)ρkj(t)),Li=Tr(ρ(t)ρki(t)),\begin{split}M_{ij} &= \text{Tr}(\rho_{k_i}(t)\rho_{k_j}(t)) \, , \\ L_i &= \text{Tr}(\rho(t)\rho_{k_i}(t)) \, ,\end{split}

ここで、 ρ(t)\rho(t) は時刻 tt における正確な時間発展状態であり、 ρki(t)\rho_{k_i}(t)kik_i トロッターステップを用いて近似された時間発展状態である。

MMLL、動的な(つまり、時間に依存する)MPF係数を計算することは、次式の解を見つけることに等しい。 LSE (の解を求めることになる(MPF係数の計算方法と同様)。 static MPF係数の計算方法と同様)の解を求めることになります。一方、すべての係数の和は1でなければならないという制約( ixi=1\sum_i x_i = 1 )を強制します。この制約は、(静的な場合とは異なり)このLSEの一部として強制されるものではありません。 この追加制約を含む最適化問題は costs モジュールに記述されている。 [1] と [2] で示唆されているのは setup_frobenius_problem()

すべての要素 MijM_{ij}LiL_i を評価するには、2つの時間発展状態の重なりを計算する必要がある。 この DynamicMPF アルゴリズムは、オプションの依存関係の1つによって提供されるテンソルネットワーク計算によってこれを行う。 利用可能なバックエンドの一覧と詳細については backends モジュールにあります。

以下に quimb_tebd を使った例を示します。 各要素について簡単に説明する。

まず、時間発展させたい単純なハイゼンベルグ・ハミルトニアンを初期化する。 に基づくタイム・エボルバを使っているので、ハミルトニアンもそのライブラリを使って初期化する。 quimbをベースにしているので、ハミルトニアンもそのライブラリを使って初期化する。

>>> from quimb.tensor import ham_1d_heis
>>> num_qubits = 10
>>> hamil = ham_1d_heis(num_qubits, 0.8, 0.3, cyclic=False)

次に、MPFを構成するトロッターステップ数、目標進化時間、初期状態を定義する( ψin\psi_{in} in [1], ψ0\psi_0 in [2], resp) を基準にして、時間発展状態間の重なりを計算する。 ここでは、単にネール状態を使用する。 quimb:

>>> trotter_steps = [3, 4]
>>> time = 0.9
>>> from quimb.tensor import MPS_neel_state
>>> initial_state = MPS_neel_state(num_qubits)

すべての要素を計算するために DynamicMPFMijM_{ij} LiL_i の各要素を計算するための完全なアルゴリズムを実行しなければならないので、インスタンスの入力引数を初期化するためのファクトリーメソッドを提供しなければならない。 DynamicMPF インスタンスの入力引数を初期化する そのためには、3つの機能を提供しなければならない。 これらを構築するには functools.partial() 関数を使う。

>>> from functools import partial

まず、空の時間発展状態を初期化する関数が必要だ(詳細は DynamicMPF.evolution_state も参照)。 このコンストラクタ関数は、位置引数やキーワード引数を取ることはできず、必ず State オブジェクトを返さなければなりません。

>>> from qiskit_addon_mpf.backends.quimb_tebd import MPOState
>>> from quimb.tensor import MPO_identity
>>> identity_factory = lambda: MPOState(MPO_identity(num_qubits))

2番目と3番目の関数は、左辺と右辺の時間進化エンジンを構築しなければならない(以下も参照のこと DynamicMPF.lhsDynamicMPF.rhs を参照)。 これらの関数は ExactEvolverFactoryApproxEvolverFactory プロトコルに従うべきである。

この ExactEvolverFactory 関数は State この関数は、唯一の位置引数として Evolver オブジェクトを返さなければならない。このオブジェクトは LiL_i 要素のLHSを計算するのに使われる(つまり、正確な時間発展状態、 ρ(t)\rho(t) を生成しなければならない)。

ここでは、4次のSuzuki-Trotter式を用いて、 0.05 の小さな時間ステップで正確な時間発展状態を近似する。 また quimb-また、基礎となるテンソルネットワークの最大結合次元と、分割されたテンソルネットワークの結合の最小特異値を制限するために、いくつかの特定の切り捨てオプションを指定する。

>>> from qiskit_addon_mpf.backends.quimb_tebd import TEBDEvolver
>>> exact_evolver_factory = partial(
...     TEBDEvolver,
...     H=hamil,
...     dt=0.05,
...     order=4,
...     split_opts={"max_bond": 10, "cutoff": 1e-5},
... )

この ApproxEvolverFactory 関数はまた、唯一の位置引数として State オブジェクトを唯一の位置引数として取り、さらに dt というキーワード引数を取り、時間発展の時間ステップを指定する。 また Evolverρki(t)\rho_{k_i}(t) ここで、 kik_i は、選択された時間ステップ、 dt によって決定されます。 これらのインスタンスは、 LiL_i のRHSと MijM_{ij} 要素の両辺の計算に使われる。

ここでは、前回と同じ切り捨て設定で2次のSuzuki-Trotter式を使用する。

>>> approx_evolver_factory = partial(
...     TEBDEvolver,
...     H=hamil,
...     order=2,
...     split_opts={"max_bond": 10, "cutoff": 1e-5},
... )

最後に setup_dynamic_lse() 関数を実行して LSE を得る。

>>> from qiskit_addon_mpf.dynamic import setup_dynamic_lse
>>> lse = setup_dynamic_lse(
...     trotter_steps,
...     time,
...     identity_factory,
...     exact_evolver_factory,
...     approx_evolver_factory,
...     initial_state,
... )
>>> print(lse.A)  
[[1.         0.99998513]
 [0.99998513 1.        ]]
>>> print(lse.b)  
[1.00001585 0.99998955]

パラメーター

  • trotter_steps (list[int]) – 使用するトロッターステップの順序。
  • time (float) – ターゲットの総進化時間。
  • identity_factory (IdentityStateFactory) – 空の State オブジェクトを生成する。
  • exact_evolver_factory (ExactEvolverFactory) – インスタンスを初期化する関数。 Evolverρ(t)\rho(t) インスタンスを初期化する関数である。
  • approx_evolver_factory (ApproxEvolverFactory) – インスタンスを初期化する関数。 Evolver インスタンスを初期化する関数である。この関数は、提供された時間ステップ、 dt に応じて、 kik_i の異なる値に対して、近似的な時間発展状態、 ρki(t)\rho_{k_i}(t) を生成する。
  • initial_state (Any) – の要素 MijM_{ij} および ψ0\psi_0 を計算するための初期状態 ( ψin\psi_{in} または )。 LSE.A および LiL_i LSE.b. このオブジェクトの型は、前の引数で選んだテンソルネットワークバックエンドと一致しなければならない。

戻り値

LSE を使って、前述のようにダイナミックMPF係数を求める。

戻りの型

LSE

参考文献

[1] : S. Zhukら、 フィジーク。 Rev. Research 6, 033309 (2024).

https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.6.033309

[2] : N. ロバートソンら arXiv:2407.17405v2 (2024).

https://arxiv.org/abs/2407.17405v2


工場プロトコル

以下のプロトコルは、様々なオブジェクトファクトリの引数に対する関数シグネチャを定義している。

IdentityStateFactory

class IdentityStateFactory(*args, **kwargs)

GitHub

ベース: Protocol

ID インスタンスを構築するためのファクトリ関数プロトコル。 State インスタンスを作成します。

で詳しく説明されているように、このファクトリー関数は setup_dynamic_lse()で詳しく説明しているように、このファクトリー関数は DynamicMPF.evolution_state を初期化するために呼び出されます。 この関数は引数を取らず State インスタンスを返します。

ExactEvolverFactory

class ExactEvolverFactory(*args, **kwargs)

GitHub

ベース: Protocol

正確な Evolver インスタンスを生成します。

で詳しく説明されているように、このファクトリー関数は setup_dynamic_lse()で詳しく説明しているように、このファクトリー関数は DynamicMPF.lhs のインスタンスを初期化するために呼び出される。 Evolver のインスタンスを初期化し、要素 LiL_i を計算するときに正確な時間発展状態 ρ(t)\rho(t) を生成する。

ApproxEvolverFactory

class ApproxEvolverFactory(*args, **kwargs)

GitHub

ベース: Protocol

ファクトリー関数のプロトコルは Evolver インスタンスを作成します。

で詳しく説明しているように、このファクトリー関数は setup_dynamic_lse()で詳しく説明しているように、このファクトリー関数は DynamicMPF.rhs のインスタンスを初期化するために呼び出される。 EvolverLiL_i のインスタンスを初期化するために呼び出される。DynamicMPF.lhsDynamicMPF.rhsMijM_{ij} ) のインスタンスを初期化するために呼び出されます。これらの近似時間発展状態はトロッターステップ( ρki(t)\rho_{k_i}(t) )に依存するため、この関数は時間発展の時間ステップをキーワード引数 dt として与える必要がある。


コアアルゴリズム

DynamicMPF

class DynamicMPF(evolution_state, lhs, rhs)

GitHub

ベース: object

動的MPFアルゴリズム。

LHSとRHSでインスタンス化された Evolver このアルゴリズムは evolve() 共有された State される。 その後 DynamicMPF.overlap() を計算することができる。 State を計算することができる。 を参照されたい。 setup_dynamic_lse() を構成する要素 MijM_{ij}LiL_i を計算するためにどのように使用されるかについてのより詳細な説明は、こちらを参照してください。 LSE を構成する要素を計算する。

参考文献

[1] : S. Zhukら、 フィジーク。 Rev. Research 6, 033309 (2024).

https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.6.033309

[2] : N. ロバートソンら arXiv:2407.17405 (2024).

https://arxiv.org/abs/2407.17405

インスタンスを構築する。 DynamicMPF インスタンスを構築する。

パラメーター

  • evolution_state (State) – LHSとRHSの時間進化エンジンが共有する状態。
  • lhs (Evolver) – LHSの時間進化エンジン。
  • rhs (Evolver) – RHSの時間進化エンジン。

時間_小数点以下桁数

タイプ: int

デフォルト値: 8

進化時間の丸めに使用する小数点以下の桁数。

の時間進化中に、LHSエンジンとRHSエンジンの進化時間を互いに比較することがよくある。 evolution_stateLHSエンジンとRHSエンジンの進化時間を互いに比較したり、目標進化時間と比較したりする。 これらのチェックは浮動小数点数を比較するもので、この設定は丸める小数点以下の桁数を指定する。

evolution_state

LHSとRHSの時間進化エンジンの間で共有される状態。

evolve

evolve(time)

GitHub

動的MPFアルゴリズムを与えられた時間まで進化させる。

これは、LHSとRHSを使用して指定された時間まで時間発展させることで、実際に動的MPFアルゴリズムを実行する。 DynamicMPF.evolution_state を時間発展させて実行する。 Evolver インスタンスで実行される。

パラメーター

time (float) – ターゲットの総進化時間。

レイズ

RuntimeError - LHSとRHSの進化した時間が最後に等しくない場合。

戻りの型

なし

lhs

LHSの時間進化エンジン。

overlap

overlap(initial_state)

GitHub

のオーバーラップを計算する。 DynamicMPF.evolution_state を計算する。

警告

提供される initial_state のタイプは、選択されたバックエンドの StateEvolver インスタンスに使われるバックエンドに依存します。 DynamicMPF インスタンスに使われるバックエンドに依存します。 言い換えれば、バックエンドはこのオーバーラップ計算のために、特定のタイプの initial_state オブジェクトしかサポートしないかもしれない。 の initial_state 引数の説明も参照してください。 setup_dynamic_lse() の説明も参照のこと。

パラメーター

initial_state (Any) – オーバーラップを計算するための初期状態。

レイズ

TypeError - 提供された初期状態が互換性のない型を持っている場合。

戻り値

の重なりは DynamicMPF.evolution_state が提供されたものと重なる。

戻りの型

複合

rhs

RHSの時間進化エンジン。

このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。