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つの目的を果たす:
- コネクティング
quimbの実装をqiskit_addon_mpf.backends. - 拡張
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_factory 。 IdentityStateFactory プロトコルと一致させなければならない。 そのためには 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))次に ExactEvolverFactory と ApproxEvolverFactory プロトコルを定義する前に、時間進化させたいハミルトニアンを定義しなければならない。 ここでは、単に quimbの便利なメソッドの一つを選ぶだけである。
>>> from quimb.tensor import ham_1d_heis
>>> hamil = ham_1d_heis(num_qubits, 0.8, 0.3, cyclic=False)これで、正確な時間発展インスタンスと近似的な時間発展インスタンス・ファクトリを構築することができる。 そのためには、単純に functools.partial() のあらかじめ定義された値をバインドする。 TEBDEvolver イニシャライザが期待する正しいインターフェイスに縮小する。 ExactEvolverFactory と ApproxEvolverFactory プロトコルで期待されるような正しいインターフェースに変換する。
>>> 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