Quimb回路ベースのバックエンド
qiskit_addon_mpf.backends.quimb_circuit
回路を用いた時間発展バックエンド quimb.
このバックエンドは、オプションの依存関係がインストールされている場合にのみ利用可能です:
pip install "qiskit-addon-mpf[quimb]"CircuitEvolver | 量子回路に基づく時間進化エンジン。 |
CircuitState | 量子回路に基づく時間発展状態のMPO的表現。 |
基礎となる方法
Quimbは、テンソル・ネットワーク・ベースの表現という形で、量子回路のシミュレーションを直接サポートしている。 quimb.tensor.Circuit 表現である。 これを利用して、明示的な時間発展アルゴリズムを回避し、代わりに時間発展を直接 QuantumCircuit で時間発展を直接エンコードし quimb を使って2つの回路の重なりを計算することができる。 詳しくは、 量子回路のガイドをご覧ください。
コード例
このセクションでは、このバックエンドを使い始めるための簡単な例を示します。 この例では、以下の3つのファクトリー関数を作成する方法を示しています。 setup_dynamic_lse().
この IdentityStateFactory プロトコルは CircuitState コンストラクタによってすでに満たされており、 identity_factory の引数は些細なものである:
>>> from qiskit_addon_mpf.backends.quimb_circuit import CircuitState
>>> identity_factory = CircuitStateのセットアップは少し複雑だ。 CircuitEvolver のセットアップは少し複雑だ。 **パラメータ化された **QuantumCircuit オブジェクトを入力として必要とする。 Parameter はトロッター法の時間ステップ(dt)の代わりとなる。
このようなパラメータ化されたトロッター回路テンプレートがどのように構築されるかを示すために、以下と同じハミルトニアンと2次の鈴木-トロッター式を再利用する。 quimb_layers.
>>> from qiskit.quantum_info import SparsePauliOp
>>> hamil = SparsePauliOp.from_sparse_list(
... [("ZZ", (i, i+1), 1.0) for i in range(0, 9, 2)] +
... [("Z", (i,), 0.5) for i in range(10)] +
... [("ZZ", (i, i+1), 1.0) for i in range(1, 9, 2)] +
... [("X", (i,), 0.25) for i in range(10)],
... num_qubits=10,
... )しかし今回は、実際の回路を構成する際の引数として Parameter を time 。
>>> from functools import partial
>>> from qiskit.circuit import Parameter
>>> from qiskit.synthesis import SuzukiTrotter
>>> from qiskit_addon_mpf.backends.quimb_circuit import CircuitEvolver
>>> from qiskit_addon_utils.problem_generators import generate_time_evolution_circuit
>>> dt = Parameter("dt")
>>> suzuki_2 = generate_time_evolution_circuit(hamil, time=dt, synthesis=SuzukiTrotter(order=2))
>>> approx_evolver_factory = partial(CircuitEvolver, circuit=suzuki_2)の名前は Parameter は dt!
exact_evolver_factory に高次のトロッター式を選ぶことができる。 しかし、 partial 関数を構築するときにパラメータをすぐにバインドしたとしても、再びパラメータ化された回路を使わなければならないことに注意してほしい。
>>> suzuki_4 = generate_time_evolution_circuit(hamil, time=dt, synthesis=SuzukiTrotter(order=4))
>>> exact_evolver_factory = partial(CircuitEvolver, circuit=suzuki_4, dt=0.05)これらのファクトリー関数は、次のように使用することができる。 setup_dynamic_lse(). 詳しくはドキュメントを参照してほしい。