Fermionische Circuits transpilieren
Die Konzepte in diesem Leitfaden sind derzeit nur in der Python-API verfügbar. Äquivalente Funktionalität wird in einem zukünftigen Release in der C-API bereitgestellt.
Dieser Leitfaden erklärt, wie du einen FermionicCircuit in einen Standard-QuantumCircuit transpilierst. Er setzt das Zeitentwicklungsbeispiel aus dem Leitfaden zu fermionischen Circuits fort.
Transpilationsstufen
Wie in qiskit_fermions.transpiler erklärt, teilen die Preset-Pass-Manager in diesem Projekt die Transpilation in die folgenden Stufen auf:
Eingabe
Wandelt den Eingabe-Circuit in eine Datenstruktur eines gerichteten azyklischen Graphen (DAG) um.
Optimierung
Behält den Circuit im fermionischen Raum. Diese Passes nutzen fermionische Struktur und Kommutationsrelationen, während problembezogenes Wissen vollständig verfügbar bleibt. F2FSynthesis ist der Pass, der hier ein Evolution-Gate trotterisiert, mit einer Produktformel oder mit FermionicQDrift, und QDriftTrotterization seine besetzungsbewusste Variante; siehe Optimization Passes für die vollständige Menge und Ein Evolution-Gate im fermionischen Raum synthetisieren, wie eine Produktformel gewählt wird.
Layout
Bildet fermionische Moduslregister auf Quantenregister ab. Bei Abbildungen in der Besetzungsbasis wie Jordan-Wigner wird jeder fermionische Modus auf ein einzelnes Qubit abgebildet. Diese Stufe unterstützt auch allgemeinere Abbildungen, bei denen sich die Anzahl der Qubits von der Anzahl der fermionischen Modi unterscheidet.
Synthese
Wandelt fermionische Gates mithilfe der gewählten Fermion-zu-Qubit-Abbildung in Qubit-Operationen um. FermionicGate-Instanzen werden in Folgen von Standard-Quantengates umgewandelt. Eine Barrier wird auf jedes Qubit jedes Registers übertragen, das sie berührt hat, sodass sie die Gates auf beiden Seiten während der Qubit-Stufe weiterhin trennt.
Qubit
Transpiliert den resultierenden Qubit-Circuit mit Standard-Qiskit-Methoden, einschließlich Optimierung, Layout und Routing für deine Zielhardware.
Ausgabe
Wandelt die interne DAG-Datenstruktur in das gewünschte Ausgabeformat um.
Ein praktisches Beispiel: Transpilation mit Jordan-Wigner
Verwende den Preset-Pass-Manager, um deinen fermionischen Circuit mit der Jordan-Wigner-Fermion-zu-Qubit-Abbildung zu transpilieren:
- 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.
Vergleich mit dem traditionellen Workflow
Der Leitfaden zu fermionischen Circuits beschreibt, wie der traditionelle Workflow die Fermion-zu-Qubit-Kodierung durchführt, bevor der QuantumCircuit gebaut wird. Vergleiche die beiden Ansätze:
>>> 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 ...>
Beide Workflows erzeugen äquivalente Circuits. Der traditionelle Workflow verlangt jedoch, dass du Optimierungsschritte manuell implementierst, während du beim Fermion-first-Ansatz problembezogene Optimierungen in den Transpilationsprozess integrieren kannst.
Fortgeschrittene Workflows
Der Preset-Pass-Manager bietet einen bequemen Ausgangspunkt. Für fortgeschrittenere Anwendungsfälle kannst du Folgendes tun:
-
Die in jeder Stufe ausgeführten Transpiler-Passes anpassen.
-
Die Produktformel wählen, die ein
Evolution-Gate im fermionischen Raum trotterisiert, entweder pro Gate oder für eine ganze Pipeline mitF2FSynthesis(siehe Ein Evolution-Gate im fermionischen Raum synthetisieren). -
Eigene Fermion-zu-Qubit-Abbildungen implementieren, indem du Synthese-Plugins erstellst (siehe
F2QSynthesisPlugin). -
Eigene Transpiler-Passes bauen.