フェルミオン回路をトランスパイルする
このガイドの概念は、現在Python APIでのみ利用できます。同等の機能は、将来のリリースでC APIでも利用可能になる予定です。
このガイドでは、FermionicCircuitを標準のQuantumCircuitにトランスパイルする方法を説明します。フェルミオン回路のガイドと同じ時間発展の例を引き続き使います。
トランスパイルのステージ
qiskit_fermions.transpilerで説明されているように、このプロジェクトのプリセット・パスマネージャーは、トランスパイルを次のステージに分割します。
入力
入力回路を有向非巡回グラフ(DAG)のデータ構造に変換します。
最適化
回路をフェルミオン空間に保ちます。これらのパスは、問題を意識した知識が完全に利用可能なまま、フェルミオンの構造と交換関係を使います。F2FSynthesisは、ここでEvolutionゲートを、積公式またはFermionicQDriftでトロッター化するパスであり、QDriftTrotterizationはその占有数を考慮する変種です。完全なパスの一覧は最適化パスを、積公式の選び方はフェルミオン空間でEvolutionゲートを合成するを参照してください。
レイアウト
フェルミオンモードのレジスターを量子レジスターにマッピングします。Jordan-Wignerのような占有数基底のマッピングでは、各フェルミオンモードが単一の量子ビットにマッピングされます。このステージは、量子ビット数がフェルミオンモード数と異なる、より一般的なマッピングにも対応しています。
合成
選択したフェルミオン-量子ビット・マッピングを使って、フェルミオン・ゲートを量子ビット操作に変換します。FermionicGateのインスタンスは、標準の量子ゲートの列に変換されます。バリアは、それが触れていた各レジスターのすべての量子ビットに引き継がれるため、量子ビット・ステージの間も、その両側のゲートを引き続き分離します。
量子ビット
結果として得られた量子ビット回路を、ターゲット・ハードウェア向けの最適化、レイアウト、ルーティングを含む標準的なQiskitの手法でトランスパイルします。
出力
内部のDAGデータ構造を、目的の出力形式に変換します。
実践例: Jordan-Wignerを使ったトランスパイル
プリセット・パスマネージャーを使って、Jordan-Wignerのフェルミオン-量子ビット・マッピングでフェルミオン回路をトランスパイルします。
- Python
- C
>>> from qiskit_fermions.circuit import FermionicCircuit
>>> from qiskit_fermions.circuit.library import Evolution
>>> from qiskit_fermions.operators import FermionOperator, cre, ann
>>> from qiskit_fermions.transpiler.presets import generate_preset_jw_pass_manager
>>>
>>> # Create the same fermionic circuit from the previous guide
>>> circuit = FermionicCircuit(4)
>>> hamiltonian = FermionOperator.from_terms([
... ([cre(0), ann(2)], 0.5),
... ([cre(2), ann(0)], 0.5),
... ([cre(1), ann(3)], 0.5),
... ([cre(3), ann(1)], 0.5),
... ])
>>> hamiltonian.groups = [0, 0, 1, 1]
>>> evolution = Evolution(4, hamiltonian, time=1.0)
>>> circuit.append(evolution, circuit.register)
>>>
>>> # Generate the Jordan-Wigner transpilation pipeline
>>> pm = generate_preset_jw_pass_manager()
>>>
>>> # Transpile the fermionic circuit to a qubit circuit
>>> qubit_circuit = pm.run(circuit)
>>>
>>> # The result is a standard QuantumCircuit
>>> print(type(qubit_circuit))
<class 'qiskit.circuit.quantumcircuit.QuantumCircuit'>
// The C API for transpilation will be made available in a future release.
従来のワークフローとの比較
フェルミオン回路のガイドでは、従来のワークフローがQuantumCircuitを構築する前にフェルミオン-量子ビット符号化を行う方法を説明しています。2つのアプローチを比較します。
>>> from qiskit_fermions.mappers.library import jordan_wigner
>>> from qiskit.circuit import QuantumCircuit
>>> from qiskit.circuit.library import PauliEvolutionGate
>>>
>>> # Map the fermionic Hamiltonian to a qubit operator
>>> qubit_hamiltonian = jordan_wigner(hamiltonian, 4).simplify()
>>>
>>> # Build the QuantumCircuit directly
>>> quantum_circuit = QuantumCircuit(4)
>>> pauli_evolution = PauliEvolutionGate(qubit_hamiltonian, time=1.0)
>>> quantum_circuit.append(pauli_evolution, quantum_circuit.qubits)
<qiskit.circuit.instructionset.InstructionSet object at ...>
どちらのワークフローも等価な回路を生成します。ただし、従来のワークフローでは最適化の手順を手動で実装する必要がありますが、フェルミオン優先のアプローチでは、問題を意識した最適化をトランスパイル処理に組み込めます。
高度なワークフロー
プリセット・パスマネージャーは便利な出発点となります。より高度なユースケースでは、次のことができます。
-
各ステージで実行されるトランスパイラー・パスをカスタマイズする。
-
フェルミオン空間で
Evolutionゲートをトロッター化する積公式を、ゲートごと、またはF2FSynthesisによるパイプライン全体に対して選択する(フェルミオン空間でEvolutionゲートを合成するを参照)。 -
合成プラグインを作成して、カスタムのフェルミオン-量子ビット・マッピングを実装する(
F2QSynthesisPluginを参照)。 -
カスタムのトランスパイラー・パスを構築する。