Travaux sur les circuits fermioniques
Les concepts présentés dans ce guide ne sont actuellement disponibles que dans l'API « Python ». Une fonctionnalité équivalente sera disponible dans l'API C dans une prochaine version.
Ce guide explique comment utiliser le FermionicCircuit pour mettre en œuvre des algorithmes quantiques directement dans l'espace fermionique, plutôt que de passer d'abord par une conversion en qubits.
Pourquoi utiliser des circuits fermioniques?
Considérons le déroulement classique de la mise en œuvre de l'évolution temporelle d'un hamiltonien fermionique sur une architecture basée sur des qubits :
- Définissez l'hamiltonien fermionique (par exemple, ).
- L'associer à un opérateur de qubit (par exemple, en utilisant la transformation de Jordan-Wigner).
- Mettre en œuvre l'évolution temporelle dans l'espace des qubits (à l'aide de la méthode de Trotter ou d'autres méthodes).
Cette approche présente une limite fondamentale : la mise en correspondance précoce avec les qubits fait perdre les connaissances, issues de l'étude du problème, concernant la structure fermionique. Les étapes d'optimisation standard ne permettent pas d'exploiter les symétries fermioniques ni les réorganisations autorisées des termes, ce qui se traduit par des circuits sous-optimaux présentant une profondeur et un nombre de portes inutiles.
Cela permet FermionicCircuit d'optimiser le flux de travail :
- Définissez l'hamiltonien fermionique (par exemple, ).
- Mettre en œuvre l'évolution temporelle directement dans l'espace fermionique à l'aide de portes fermioniques.
- Représentation dans l'espace des qubits dans le cadre du processus de transpilation.
Cette approche remédie à cette limite en conservant les connaissances relatives au problème dans l'espace fermionique, où les étapes d'optimisation peuvent exploiter la structure fermionique et les relations de commutation pour réduire la profondeur du circuit. Le circuit fermionique définit les calculs à effectuer, tandis que la transpilation se charge de les mapper aux qubits, ce qui permet une séparation plus claire des préoccupations.
Indexation en mode générique
Le module operators et la fonction FermionicCircuit utilisent tous deux un système d'indexation générique basé sur les modes, qui ne repose sur aucune hypothèse concernant la nature de ces modes. Un mode est simplement un indice abstrait désignant un degré de liberté fermionique, sans sémantique intrinsèque. Ce choix de conception s'inspire du module des opérateurs et garantit une flexibilité maximale. Par exemple, vous pouvez implémenter l'évolution temporelle pour n'importe quel opérateur implémentant le protocole OperatorTrait , quelle que soit sa représentation mathématique.
Construire un circuit fermionique
L'exemple ci-dessous met en œuvre l'évolution temporelle décrite dans la section précédente. Il construit un FermionicCircuit en spécifiant le nombre de modes fermioniques, puis ajoute des portes fermioniques issues du qiskit_fermions.circuit.library pour mettre en œuvre l'évolution temporelle.
Cet exemple montre également comment intégrer des connaissances métier dans un opérateur grâce au regroupement des termes de l'opérateur. En attribuant des indices de groupe aux termes de l'hamiltonien, vous préservez des informations structurelles que les étapes d'optimisation peuvent exploiter tout au long de la chaîne de transpilation.
[x] Python
>>> from qiskit_fermions.circuit import FermionicCircuit
>>> from qiskit_fermions.circuit.library import Evolution
>>> from qiskit_fermions.operators import FermionOperator, cre, ann
>>>
>>> # Create a circuit with 4 fermionic modes
>>> circuit = FermionicCircuit(4)
>>>
>>> # Define a simple fermionic Hamiltonian
>>> 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),
... ])
>>> # Add some problem structure by grouping our Hamiltonian terms
>>> hamiltonian.groups = [0, 0, 1, 1]
>>>
>>> # Add an evolution gate to implement exp(-i * t * H)
>>> evolution = Evolution(4, hamiltonian, time=1.0)
>>> circuit.append(evolution, circuit.register)[] C
// The C API for FermionicCircuit is not available yet.
Remarquez que le regroupement des termes des opérateurs est conservé, même dans des opérations simples telles que la décomposition. Cela illustre la manière dont les informations structurelles circulent à travers la pile de circuits. Pour comprendre l'intégralité du processus de transpilation vers les qubits, consultez le guide « Transpilation des circuits fermioniques ».
Transpiler des circuits fermioniques
Pour implémenter l'algorithme quantique représenté par votre, il FermionicCircuit faut le transcompiler en un QuantumCircuit. Vous trouverez des instructions à ce sujet dans le guide « Transpiler des circuits fermioniques ».
Etapes suivantes
- Pour en savoir plus sur les portes fermioniques disponibles, consultez la documentation
qiskit_fermions.circuit.library. - Consultez le guide explicatif des opérateurs pour comprendre comment construire des hamiltoniens fermioniques que vous pourrez utiliser avec des circuits fermioniques.
- Consultez le guide de prise en main de SQDRIFT pour découvrir un exemple concret de bout en bout.
- Consultez le guide des relations ffsim pour comprendre comment un
FermionicCircuitpeut être simulé directement, et comment ces indices de mode génériques n'acquièrent une sémantique de spin qu'au moment de la simulation.