{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "f560a2bd-78d2-45fd-8f1b-9f0a4c5e178d",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Introduction aux primitives\"\n",
        "description: \"Introduction aux primitives dans Qiskit et présentation des primitives disponibles\"\n",
        "---\n",
        "\n",
        "<span id=\"introduction-to-primitives\" />\n",
        "\n",
        "# Introduction aux primitives\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7bfc257f-69c5-4fb1-8042-b62efa8cf64e",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "{/*\n",
        "  DO NOT EDIT THIS CELL!!!\n",
        "  This cell's content is generated automatically by a script. Anything you add\n",
        "  here will be removed next time the notebook is run. To add new content, create\n",
        "  a new cell before or after this one.\n",
        "  */}\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"Versions de package\">\n",
        "    Le code de cette page a été développé en tenant compte des exigences suivantes.\n",
        "    Nous recommandons d'utiliser ces versions ou des versions plus récentes.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.3.0\n",
        "    qiskit-ibm-runtime~=0.43.1\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3ac7f2c2-1541-49f1-9f8f-4c0a8e3a149a",
      "metadata": {},
      "source": [
        "<span id=\"qpu-access-patterns\" />\n",
        "\n",
        "<span id=\"why-did-qiskit-introduce-primitives\" />\n",
        "\n",
        "## Pourquoi Qiskit a-t-il introduit les primitives?\n",
        "\n",
        "À l'instar des premiers jours des ordinateurs classiques, lorsque les développeurs devaient manipuler directement les registres de l'unité centrale, la première interface avec les QPU renvoyait simplement les données brutes de l'électronique de contrôle.\n",
        "Ce n'était pas un gros problème lorsque les QPU se trouvaient dans des laboratoires et que seuls les chercheurs pouvaient y accéder directement.\n",
        "Reconnaissant que la plupart des développeurs ne seraient pas et ne devraient pas être familiarisés avec la distillation de ces données brutes dans 0s et 1s, Qiskit a introduit `backend.run`, une première abstraction pour l'accès aux QPU dans le nuage. Cela a permis aux développeurs de travailler sur un format de données familier et de se concentrer sur la situation dans son ensemble.\n",
        "\n",
        "Au fur et à mesure que l'accès aux QPU s'est généralisé et que de plus en plus d'algorithmes quantiques ont été développés, le besoin d'une abstraction de plus haut niveau s'est à nouveau fait sentir, le besoin d'une abstraction de plus haut niveau s'est à nouveau fait sentir. En réponse, Qiskit a introduit l'interface des primitives, qui est optimisée pour deux tâches essentielles dans le développement d'algorithmes quantiques : l'estimation de la valeur d'espérance (`Estimator`) et l'échantillonnage du circuit (`Sampler`). L'objectif est une fois de plus d'aider les développeurs à se concentrer davantage sur le développement des algorithmes quantiques l'objectif est une fois de plus d'aider les développeurs à se concentrer davantage sur l'innovation et moins sur la conversion des données. L'interface primitive remplace l'interface `backend.run` , puisque `Sampler` fournit le même accès direct au matériel que `backend.run`.\n",
        "\n",
        "<span id=\"what-is-a-primitive\" />\n",
        "\n",
        "## Qu'est-ce qu'une primitive?\n",
        "\n",
        "Les systèmes informatiques sont construits sur plusieurs couches d'abstraction. Les abstractions vous permettent de vous concentrer sur un niveau de détail pertinent pour la tâche à accomplir. Plus vous vous rapprochez du matériel, plus le niveau d'abstraction dont vous avez besoin est faible (par exemple, vous pouvez avoir besoin de déplacer ou de manipuler des données au niveau des instructions du processeur). Plus la tâche à accomplir est complexe, plus les abstractions seront de haut niveau, plus les abstractions seront de haut niveau (par exemple, vous pourriez utiliser une bibliothèque de programmation pour effectuer des des calculs algébriques).\n",
        "\n",
        "Dans ce contexte, une *primitive* est la plus petite instruction de traitement, le bloc de construction le plus simple à partir duquel on peut créer quelque chose d'utile pour un niveau d'abstraction donné à partir de laquelle on peut créer quelque chose d'utile pour un niveau d'abstraction donné.\n",
        "\n",
        "Les progrès récents de l'informatique quantique ont accru la nécessité de travailler à des niveaux d'abstraction plus élevés.\n",
        "À mesure que le domaine évolue vers des unités de traitement quantique (QPU) plus grandes et des flux de travail plus complexes, l'accent est mis non plus sur l'interaction avec des signaux de qubits individuels, mais sur la vision des dispositifs quantiques en tant que systèmes exécutant les tâches nécessaires qubits individuels pour considérer les dispositifs quantiques comme des systèmes qui effectuent les tâches nécessaires.\n",
        "\n",
        "Les deux tâches les plus courantes des ordinateurs quantiques sont l'échantillonnage d'états quantiques et le calcul des valeurs d'espérance.\n",
        "Ces tâches ont motivé la conception du site Qiskit primitives : **Estimator** and **Sampler**.\n",
        "\n",
        "* L'estimateur calcule les valeurs d'espérance des observables par rapport aux états préparés par les circuits quantiques.\n",
        "* L'échantillonneur échantillonne le registre de sortie de l'exécution du circuit quantique.\n",
        "\n",
        "En bref, le modèle de calcul introduit par Qiskit primitives rapproche la programmation quantique de la programmation classique, où l'accent est mis moins sur les détails matériels que sur les résultats de la programmation classique, où l'accent est mis moins sur les détails matériels et plus sur les résultats que l'on essaie d'obtenir que sur les résultats que vous essayez d'obtenir.\n",
        "\n",
        "<span id=\"primitive-definition-and-implementations\" />\n",
        "\n",
        "## Définition primitive et implémentations\n",
        "\n",
        "Il existe deux types d' Qiskit primitives : les classes de base et leurs implémentations. Les primitives « Estimator » et « Sampler » sont définies par des classes de base open source situées dans le répertoire « Qiskit SDK » (dans le module [`qiskit.primitives`](/docs/api/qiskit/primitives) ). Les fournisseurs (tels que le service de calcul d' IBM Quantum ) peuvent utiliser ces classes de base pour dériver leurs propres implémentations de Sampler et d'Estimator.  La plupart des utilisateurs interagiront avec les implémentations des fournisseurs, et non avec les primitives de base.\n",
        "\n",
        "<span id=\"base-classes\" />\n",
        "\n",
        "### classes de base\n",
        "\n",
        "Les `Base` primitives sont des classes abstraites qui définissent une interface commune pour la mise en œuvre des primitives. Toutes les autres classes du [`qiskit.primitives`](/docs/api/qiskit/primitives) module héritent de ces classes de base. Les développeurs devraient les utiliser s'ils souhaitent créer leur propre modèle d'exécution basé sur des primitives pour un fournisseur spécifique. Ces classes pourraient également s'avérer utiles pour ceux qui souhaitent effectuer des traitements hautement personnalisés et trouvent que les implémentations des primitives existantes sont trop simples pour leurs besoins. Les utilisateurs lambda n'utiliseront pas directement les classes de base.\n",
        "\n",
        "[`BaseEstimatorV1`](/docs/api/qiskit/qiskit.primitives.BaseEstimatorV1) et [`BaseSamplerV1`](/docs/api/qiskit/qiskit.primitives.BaseSamplerV1) - Bien que les primitives de l' V1 soient toujours utilisables, ces guides se concentrent sur les primitives de l' V2, car elles sont les plus récentes et les plus couramment utilisées.\n",
        "\n",
        "[`BaseEstimatorV2`](/docs/api/qiskit/qiskit.primitives.BaseEstimatorV2) et [`BaseSamplerV2`](/docs/api/qiskit/qiskit.primitives.BaseSamplerV2) - Les primitives de référence de Qiskit respectent ces spécifications d'interface.\n",
        "\n",
        "<span id=\"implementations\" />\n",
        "\n",
        "<span id=\"implementations\" />\n",
        "\n",
        "### Implémentations\n",
        "\n",
        "Toutes les classes primitives sont dérivées des classes de base; elles présentent donc la même structure générale et s'utilisent de la même manière.  Par exemple, le format des données d'entrée est identique pour toutes les primitives d'Estimator.  Il existe toutefois des différences dans leur mise en œuvre qui les rendent uniques.\n",
        "\n",
        "Il s'agit d'implémentations des classes de base des primitives :\n",
        "\n",
        "* Les solutions [IBM Quantum primitives](/docs/guides/qiskit-runtime-primitives), et [`EstimatorV2`](/docs/api/qiskit-ibm-runtime/estimator-v2) [`SamplerV2`](/docs/api/qiskit-ibm-runtime/sampler-v2)proposent une mise en œuvre plus sophistiquée (notamment grâce à l'intégration de mécanismes d'atténuation des erreurs) sous la forme d'un service cloud. Cette implémentation des primitives de base sert à accéder au matériel d' IBM Quantum®.\n",
        "\n",
        "* [`StatevectorEstimator`](/docs/api/qiskit/qiskit.primitives.StatevectorEstimator) et [`StatevectorSampler`](/docs/api/qiskit/qiskit.primitives.StatevectorSampler#statevectorsampler) - Implémentations de référence des primitives qui utilisent le simulateur intégré à Qiskit. Ils sont développés à l'aide du module [`quantum_info`](/docs/api/qiskit/quantum_info#quantum-information) Qiskit et produisent des résultats basés sur des simulations de vecteurs d'état idéaux.  On y accède via Qiskit. Pour plus de détails sur son utilisation, consultez la section « [Simulation exacte avec les primitives d’ Qiskit SDK](/docs/guides/simulate-with-qiskit-sdk-primitives) ».\n",
        "\n",
        "* [`BackendEstimatorV2`](/docs/api/qiskit/qiskit.primitives.BackendEstimatorV2) et [`BackendSamplerV2`](/docs/api/qiskit/qiskit.primitives.BackendSamplerV2) - Vous pouvez utiliser ces classes pour « encapsuler » n'importe quelle ressource de calcul quantique dans une primitive. Cela vous permet d'écrire du code de type « primitif » pour les fournisseurs qui ne disposent pas encore d'une interface basée sur les primitives. Ces classes s'utilisent exactement comme les classes Sampler et Estimator classiques, à la différence qu'elles doivent être initialisées avec un argument `backend` supplémentaire permettant de choisir l'ordinateur quantique sur lequel les exécuter. On y accède à l'aide de Qiskit. Pour plus d'informations, consultez le guide [des primitives backend](/docs/guides/get-started-with-backend-primitives).\n",
        "\n",
        "<span id=\"options\" />\n",
        "\n",
        "## Options\n",
        "\n",
        "Vous pouvez passer des options aux types primitifs afin de les personnaliser en fonction de vos besoins. Si l'interface de la méthode `run()` des primitives est commune à toutes les implémentations, leurs options, elles, ne le sont pas. Consultez la documentation de l'API relative à une implémentation de primitive spécifique pour connaître les options qu'elle prend en charge.\n",
        "\n",
        "Par exemple, consultez les rubriques « [Options de](/docs/guides/estimator-options) l'estimateur » et « [Options de l'échantillonneur ](/docs/guides/sampler-options)» pour en savoir plus sur les options des primitives « IBM Quantum », ou consultez les [références](https://qiskit.github.io/qiskit-aer/apidocs/aer_primitives.html) de l'API Qiskit Aer pour connaître les options des primitives Qiskit Aer.\n",
        "\n",
        "<span id=\"benefits-of-qiskit-primitives\" />\n",
        "\n",
        "## Avantages de l' Qiskit primitives\n",
        "\n",
        "Grâce aux primitives, les utilisateurs de Qiskit peuvent écrire du code quantique destiné à un QPU spécifique sans avoir à\n",
        "gérer explicitement chaque détail. De plus, grâce à ce niveau d'abstraction supplémentaire, vous pourriez accéder plus facilement\n",
        "aux fonctionnalités matérielles avancées d'un fournisseur donné. Par exemple, avec les primitives de la bibliothèque « IBM Quantum »,\n",
        "vous pouvez tirer parti des dernières avancées en matière d'atténuation et de suppression des erreurs en activant ou désactivant certaines options, telles que celles proposées par la primitive [`resilience_level`](/docs/api/qiskit-ibm-runtime/options-estimator-options#resilience_level), plutôt que de développer votre propre implémentation de ces techniques.\n",
        "\n",
        "Pour les fournisseurs de matériel, la mise en œuvre de primitives en mode natif signifie que vous pouvez fournir à vos utilisateurs un moyen plus \"prêt à l'emploi\" d'accéder aux fonctions de votre matériel, telles que les techniques avancées de post-traitement d'accéder aux fonctionnalités de votre matériel, telles que les techniques avancées de post-traitement. Il est donc plus facile pour vos utilisateurs de bénéficier des meilleures capacités de votre matériel.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "02dbbc7d-76e7-4a89-8739-ba7f3a5a05b8",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Etapes suivantes\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recommandations\">\n",
        "  * Comprendre les opérations [d'entrée et de sortie de base](/docs/guides/primitive-input-output).\n",
        "  * Consultez [des exemples](/docs/guides/simulate-with-qiskit-sdk-primitives) détaillés.\n",
        "  * Entraînez-vous à utiliser les primitives en suivant la [leçon sur la fonction de coût à](/learning/courses/variational-algorithm-design/cost-functions) l'adresse IBM Quantum Learning.\n",
        "  * Consultez la section «[ Créer un fournisseur](/docs/guides/create-a-provider) » pour découvrir comment implémenter vos propres primitives Sampler et Estimator.\n",
        "  * Consultez [la documentation de l'API](/docs/api/qiskit/primitives).\n",
        "  * Lire [Migrate to V2 primitives](/docs/guides/v2-primitives).\n",
        "  * Découvrez les [primitives IBM Quantum](/docs/guides/qiskit-runtime-primitives), utilisées pour exécuter des circuits sur les QPU IBM.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}