Aller au contenu principal

Compilation quantique approchée avec les réseaux de tenseurs (AQC-Tensor)

L'addon Qiskit de compilation quantique approchée avec les réseaux de tenseurs (AQC-Tensor) permet aux utilisateurs de compiler la partie initiale d'un circuit en une approximation quasi-équivalente de ce circuit, mais avec beaucoup moins de couches. Cela est réalisé à l'aide de réseaux de tenseurs en utilisant la méthode décrite dans [1]. Son utilité première concerne les circuits qui simulent l'évolution temporelle, mais il peut s'appliquer à toute classe de circuits ayant accès à :

  1. Un excellent état intermédiaire, connu sous le nom d'« état cible », qui peut être obtenu par simulation de réseaux de tenseurs ; et,
  2. Un bon circuit qui prépare une approximation de l'état cible, mais avec moins de couches une fois compilé sur le dispositif matériel cible.

La technique génère un circuit ansatz basé sur un circuit cible plus grand qu'un utilisateur souhaite finalement exécuter sur un QPU. Cela est accompli en simulant d'abord une partie du circuit cible par des méthodes de réseaux de tenseurs et en obtenant une description précise d'un état intermédiaire que le circuit ansatz va approximer. Une fois cet état intermédiaire trouvé, il est utilisé comme fonction de coût afin d'optimiser les paramètres du circuit ansatz. Une fois l'optimisation terminée, la partie restante du circuit cible est ajoutée à l'ansatz, puis exécutée sur du matériel quantique.

Installer le package AQC-Tensor

Il existe deux façons d'installer le package AQC-Tensor : via PyPI ou en compilant depuis les sources. Il est recommandé d'installer ces packages dans un environnement virtuel pour assurer la séparation entre les dépendances des packages.

Installer depuis PyPI

La façon la plus simple d'installer le package AQC-Tensor est via PyPI. Pour utiliser le package, tu dois également installer au moins un backend de réseau de tenseurs. L'extrait de code suivant installera l'addon, ainsi que quimb (pour la prise en charge des réseaux de tenseurs) et jax (pour la différentiation automatique). Si tu es intéressé, consulte le package sur GitHub

pip install 'qiskit-addon-aqc-tensor[quimb-jax]'

Installer depuis les sources

Clique ici pour savoir comment installer ce package manuellement.

Si tu souhaites contribuer à ce package ou l'installer manuellement, commence par cloner le dépôt :

git clone git@github.com:Qiskit/qiskit-addon-aqc-tensor.git

et installe le package via pip. Si tu prévois d'exécuter les tutoriels présents dans le dépôt du package, installe également les dépendances notebook. Si tu prévois de développer dans le dépôt, tu pourrais aussi vouloir installer les dépendances dev.

pip install tox jupyterlab -e '.[notebook-dependencies,dev]'

Contexte théorique

La procédure AQC-Tensor est expliquée en détail dans [1]. Cette section donne un aperçu de la technique.

Diagramme illustrant la procédure de compilation quantique approchée

En général, AQC-Tensor nécessite trois éléments en entrée :

  1. Une description de l'état cible sous forme de réseau de tenseurs. Cela peut être généré en simulant un circuit sur un simulateur de réseau de tenseurs, ou être généré d'une autre manière (par exemple, en effectuant une évolution temporelle sur un état produit matriciel en utilisant le principe variationnel dépendant du temps).
  2. Un circuit ansatz paramétré. Idéalement, un circuit qui contient une connectivité efficace pour le matériel, de sorte qu'il aura une profondeur raisonnable sur le matériel cible.
  3. Des paramètres initiaux à injecter dans le circuit ansatz, de telle sorte que l'état résultant soit déjà une bonne approximation de l'état cible. (Ce n'est pas, en principe, requis pour AQC, mais cela aide à fournir à l'optimiseur un point de départ sensé.)

La technique consiste ensuite à optimiser itérativement les paramètres du circuit ansatz, de sorte que l'état qu'il génère soit aussi proche que possible de l'état cible.

Génération de l'ansatz

Pour générer (2) et (3) de la liste ci-dessus, le package qiskit-addon-aqc possède une fonction, generate_ansatz_from_circuit(), qui prend un circuit en entrée et produit un ansatz paramétré et un ensemble initial de paramètres. Les paramètres retournés par la fonction sont tels que, lorsqu'ils sont injectés dans l'ansatz, ils génèrent un état exactement équivalent au circuit d'entrée, à une phase globale près.

L'ansatz généré par cette fonction utilise 9 paramètres par bloc à deux qubits et est basé sur la décomposition KAK, qui paramétrise toute porte à deux qubits en termes de trois paramètres, à des rotations sur un seul qubit près. Les rotations sur un seul qubit sont ensuite décomposées comme ZXZZXZ, chacune ayant trois paramètres. Il en résulte que le circuit ansatz contient 3 paramètres pour chaque bloc à deux qubits du circuit original, plus 3 paramètres pour une rotation sortante sur un seul qubit pour chacun des deux qubits (soit un total de 9 paramètres). Après avoir ajouté ces blocs, l'ansatz est complété par l'ajout d'une couche de rotations sur un seul qubit à chaque qubit actif au début du circuit.

Simulation par réseau de tenseurs

Pour obtenir une description de l'état cible souhaité, cet addon utilise un état produit matriciel (la forme la plus simple d'un réseau de tenseurs) et prend en charge les simulateurs de réseaux de tenseurs suivants :

Le paramètre le plus important d'un réseau de tenseurs est sa dimension de liaison maximale, χ\chi. Ce paramètre limite la quantité d'enchevêtrement pouvant être représentée avec un réseau de tenseurs, et donc jusqu'à quelle profondeur un circuit donné peut être simulé fidèlement.

Pour un circuit avec LL qubits, un état produit matriciel a besoin d'au maximum une dimension de liaison de χexact=2L/2\chi_{exact} = 2^{L/2} pour simuler exactement le circuit à n'importe quelle profondeur. Cela est hors de portée pour les circuits à l'échelle utilitaire générale agissant sur 100+ qubits. Pour cette raison, si tu essaies d'expérimenter avec cet addon pour un problème jouet avec peu de qubits, il est important de s'assurer que χ<2L/2\chi < 2^{L/2}. De cette façon, lorsque tu passes à l'échelle du problème vers un circuit plus grand, l'état cible reste classiquement simulable.

Prochaines étapes

Recommandations

Références

[1] Robertson, Niall F., et al. "Approximate Quantum Compiling for Quantum Simulation: A Tensor Network based approach" arXiv preprint arXiv:2301.08609 (2023).