Skip to main content
IBM Quantum Platform

Quimb TEBD バックエンド

qiskit_addon_mpf.backends.quimb_tebd

A quimb-ベースのTEBDバックエンド。

警告

このバックエンドは、オプションの依存関係がインストールされている場合にのみ利用可能です:

pip install "qiskit-addon-mpf[quimb]"
TEBDEvolver内部MPOを進化させるためのTEBDアルゴリズム。
MPOStateビダルゲージを施行するMPO。

基礎となる方法

このモジュールは、テンソルネットワークライブラリに実装されているTEBD(time-evolving block decimation)アルゴリズム [1に基づいて]、動的MPF係数を計算するための時間発展バックエンドを提供します。 quimb テンソルネットワークライブラリに実装されています。

このモジュールが提供するクラスは2つの目的を果たす:

  1. コネクティング quimbの実装を qiskit_addon_mpf.backends.
  2. 拡張 quimbTEBDの実装を拡張し、(MPSではなく)内部のMPO状態を扱えるようにした(詳しくは State を参照)。

最も単純な意味では、このモジュールは、内部MPO状態を進化させるために、TEBDアルゴリズムをストレートに拡張したものである。 そのため、動的MPFアルゴリズムにこのバックエンドを使いたい場合は、時間進化させたいハミルトニアンを quimb-ネイティブな形で より具体的には TEBDEvolver クラス(これは quimb.tensor.TEBDのサブクラスです)。 quimb.tensor.LocalHam1D. Quimbでは、このようなハミルトニアンを構築するための便利なメソッドが quimb.tensor.tensor_builder モジュールで提供されています。 これらのどれもあなたのニーズを満たさない場合、Qiskitネイティブオブジェクトからの変換メソッドを実装した LayerModel クラスを使うことを検討できます。


コード例

このセクションでは、このバックエンドを使い始めるための簡単な例を示します。 この例では、以下の3つのファクトリー関数を作成する方法を示しています。 setup_dynamic_lse().

まず、 identity_factoryIdentityStateFactory プロトコルと一致させなければならない。 そのためには quimb.tensor.MPO_identity() 関数を使い、結果の quimb.tensor.MatrixProductOperator をカスタム MPOState インターフェイスでラップします。

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

次に ExactEvolverFactoryApproxEvolverFactory プロトコルを定義する前に、時間進化させたいハミルトニアンを定義しなければならない。 ここでは、単に quimbの便利なメソッドの一つを選ぶだけである。

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

これで、正確な時間発展インスタンスと近似的な時間発展インスタンス・ファクトリを構築することができる。 そのためには、単純に functools.partial() のあらかじめ定義された値をバインドする。 TEBDEvolver イニシャライザが期待する正しいインターフェイスに縮小する。 ExactEvolverFactoryApproxEvolverFactory プロトコルで期待されるような正しいインターフェースに変換する。

>>> from functools import partial
>>> from qiskit_addon_mpf.backends.quimb_tebd import TEBDEvolver
>>> exact_evolver_factory = partial(
...     TEBDEvolver,
...     H=hamil,
...     dt=0.05,
...     order=4,
... )

dt の値を小さな時間ステップに固定し、上記の正確な時間発展を模倣するために高次のスズキ・トロッター分解を使っていることに注目してほしい。

以下では、 dt の値を固定せず、2次のSuzuki-Trotter式のみを用いて近似的な時間発展を行う。 さらに、いくつかの切り捨て設定も指定する。

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

もちろん、ここに示した例に限定されるものではない。 quimb.tensor.TEBD の実装が提供する他の設定を試してみることをお勧めする。


制限

最後に、このバックエンドで扱えるハミルトニアンの種類について、いくつかの既知の制限を指摘する:

  • すべての相互作用は1次元でなければならない
  • 相互作用はアシリックでなければならない

リソース

[1]: https://en.wikipedia.org/wiki/Time-evolving _block_decimation

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