Zum Hauptinhalt springen
Dieses Projekt befindet sich in der Beta-Phase. Einen Fehler gefunden? GitHub Issue erstellen. Frage oder Idee? In Discussions fragen — wir freuen uns über dein Feedback!
Wie ist die Übersetzungsqualität auf dieser Seite?

Fermionische Circuits transpilieren

Wichtig

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:

>>> 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 transpiled QuantumCircuit of the fermionic time evolution.

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 ...>

The directly constructed QuantumCircuit of the fermionic time evolution.

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: