Skip to main content
IBM Quantum Platform

Transpiler des circuits fermioniques

Important

Les fonctionnalités décrites dans ce guide ne sont actuellement disponibles que dans l'API « Python ». Une fonctionnalité équivalente sera disponible dans l'API C lors d'une prochaine version.

Ce guide explique comment transcompiler un en FermionicCircuit un standard QuantumCircuit. L'article poursuit avec le même exemple d'évolution temporelle tiré du guide sur les circuits fermioniques.


Étapes de la transpilation

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


Entrée

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


Optimisation

Maintient le circuit dans l'espace fermionique. Ces itérations exploitent la structure fermionique et les relations de commutation, tout en conservant l'intégralité des connaissances spécifiques au problème. FermionicTrotterization et sont QDriftTrotterization les étapes qui permettent de « trotteriser » une porte Evolution ici; voir la section « Étapes d'optimisation » pour l'ensemble complet et « Synthèse d'une porte d'évolution dans l'espace fermionique » pour savoir comment une formule de produit est choisie.


Présentation

Associe les registres de mode fermionique aux registres quantiques. Dans les correspondances basées sur l’occupation, comme celle de Jordan-Wigner, chaque mode fermionique correspond à un seul qubit. Cette étape permet également de traiter des correspondances plus générales, dans lesquelles le nombre de qubits diffère du nombre de modes fermioniques.


Synthèse

Convertit les portes fermioniques en opérations sur les qubits à l'aide de la correspondance fermion-qubit choisie. FermionicGate Les instances sont transformées en séquences de portes quantiques standard.


Qubit

Compile le circuit de qubits obtenu à l'aide des méthodes standard de Qiskit, notamment l'optimisation, la disposition et le routage pour votre matériel cible.


sortie

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


Un exemple concret : la transpilation à l'aide de Jordan-Wigner

Utilisez le gestionnaire de passes prédéfini pour transpilier votre circuit fermionique à l'aide de la correspondance fermion-qubit de Jordan-Wigner :

[x] Python

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

[] C

// The C API for transpilation will be made available in a future release.
QuantumCircuit, après transpilation, de l'évolution temporelle des fermions.

Comparez avec le processus de travail traditionnel

Le guide sur les circuits fermioniques explique comment le workflow traditionnel procède au codage des fermions en qubits avant de construire le QuantumCircuit. Comparez 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 ...>
QuantumCircuit, construite directement à partir de l'évolution temporelle des fermions.

Ces deux méthodes permettent d'obtenir des circuits équivalents. Cependant, le flux de travail traditionnel vous oblige à mettre en œuvre manuellement les étapes d'optimisation, alors qu'avec l'approche « fermionic-first », vous pouvez intégrer des optimisations adaptées au problème dans le processus de transpilation.


Flux de travail avancés

Le gestionnaire de passes prédéfinies constitue un point de départ pratique. Pour des cas d'utilisation plus avancés, vous pouvez procéder comme suit :

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.