Aller au contenu principal
Ce projet est en phase bêta. Tu as trouvé un bug ? Ouvrir un ticket GitHub. Une question ou une idée ? Pose ta question dans Discussions — tes retours sont les bienvenus !
Quelle est la qualité de la traduction sur cette page ?

Transpiler des circuits fermioniques

Important

Les concepts de ce guide ne sont actuellement disponibles que dans l'API Python. Des fonctionnalités équivalentes seront disponibles dans l'API C dans une prochaine version.

Ce guide explique comment transpiler un FermionicCircuit en un QuantumCircuit standard. Il poursuit avec le même exemple d'évolution temporelle que le guide des circuits fermioniques.

Étapes de transpilation​

Comme expliqué dans qiskit_fermions.transpiler, les gestionnaires de passes prédéfinis de ce projet divisent la transpilation en les étapes suivantes :

Entrée​

Convertit le circuit d'entrée en une structure de données de graphe orienté acyclique (DAG).

Optimisation​

Conserve le circuit dans l'espace fermionique. Ces passes utilisent la structure fermionique et les relations de commutation tandis que les connaissances propres au problème restent pleinement disponibles. F2FSynthesis est la passe qui Trotterise ici une porte Evolution, avec une formule de produit ou avec FermionicQDrift, et QDriftTrotterization sa variante sensible à l'occupation ; consulte Passes d'optimisation pour l'ensemble complet et Synthétiser une porte Evolution dans l'espace fermionique pour savoir comment une formule de produit est choisie.

Disposition​

Fait correspondre les registres de modes fermioniques à des registres quantiques. Pour les mappings en base d'occupation comme Jordan-Wigner, chaque mode fermionique correspond à un seul qubit. Cette étape prend aussi en charge des mappings plus généraux où le nombre de qubits diffère du nombre de modes fermioniques.

Synthèse​

Convertit les portes fermioniques en opérations sur qubits en utilisant le mapping fermion-vers-qubit choisi. Les instances de FermionicGate sont transformées en séquences de portes quantiques standard. Une barrière est reportée sur chaque qubit de chaque registre qu'elle touchait, de sorte qu'elle continue de séparer les portes de part et d'autre pendant l'étape sur les qubits.

Qubit​

Transpile le circuit de qubits obtenu en utilisant les méthodes standard de Qiskit, y compris l'optimisation, la disposition et le routage pour ton matériel cible.

Sortie​

Convertit la structure de données DAG interne vers le format de sortie souhaité.

Un exemple pratique : transpilation avec Jordan-Wigner​

Utilise le gestionnaire de passes prédéfini pour transpiler ton circuit fermionique avec le mapping fermion-vers-qubit de Jordan-Wigner :

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

Comparaison avec le workflow traditionnel​

Le guide des circuits fermioniques décrit comment le workflow traditionnel effectue l'encodage fermion-vers-qubit avant de construire le QuantumCircuit. Compare les deux approches :

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

Les deux workflows produisent des circuits équivalents. Cependant, le workflow traditionnel exige que tu implémentes manuellement les étapes d'optimisation, alors qu'avec l'approche fermionique d'abord tu peux intégrer des optimisations propres au problème dans le processus de transpilation.

Workflows avancés​

Le gestionnaire de passes prédéfini offre un point de départ pratique. Pour des cas d'usage plus avancés, tu peux faire ce qui suit :