{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "2d6582ed-04c1-44bb-9dd8-042d46bd8a7b",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Guide de démarrage rapide d'Executor\"\n",
        "description: \"Comment utiliser la primitive « Executor » dans qiskit-ibm-runtime.\"\n",
        "\n",
        "---\n",
        "\n",
        "<span id=\"executor-quickstart\" />\n",
        "\n",
        "# Guide de démarrage rapide d'Executor\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b91b019e-f1d9-4a7f-9c5a-68ead8bf2a6d",
      "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 présenté sur cette page a été développé en respectant les exigences suivantes.\n",
        "    Nous vous recommandons d'utiliser ces versions ou des versions plus récentes.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.4.0\n",
        "    qiskit-ibm-runtime~=0.46.1\n",
        "    samplomatic~=0.18.0\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e82a5b3c-eed9-41fe-8940-e88838101ca3",
      "metadata": {},
      "source": [
        "Tout comme la primitive [Sampler](/docs/guides/get-started-with-sampler), Executor échantillonne les registres de sortie issus de l'exécution de circuits quantiques, mais il ne dispose d'aucun mécanisme intégré de suppression ou d'atténuation des erreurs. Au contraire, cela s'inscrit dans le cadre [du modèle d'exécution dirigée](/docs/guides/directed-execution-model), qui fournit les éléments nécessaires pour saisir les intentions de conception côté client et transfère la génération coûteuse des variantes de circuits vers le côté serveur. L'exécuteur suit les directives fournies dans les annotations et les options des circuits, génère et associe les valeurs des paramètres, exécute les circuits associés sur le matériel, puis renvoie les résultats d'exécution et les métadonnées. Il ne prend aucune décision à votre place et vous offre un contrôle total ainsi qu'une transparence totale.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Le package Qiskit ne dispose pas encore d'une classe de base pour la primitive Executor.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"before-you-begin\" />\n",
        "\n",
        "## Avant de commencer\n",
        "\n",
        "Certains des exemples de code présentés sur cette page utilisent `samplex`, qui fait partie du package Samplomatic.  Par conséquent, avant d'exécuter ces blocs de code, vous devez installer Samplomatic, comme indiqué dans le bloc de code suivant.  Pour plus d'informations, consultez la [documentation de Samplomatic](https://qiskit.github.io/samplomatic).\n",
        "\n",
        "```python\n",
        "pip install samplomatic\n",
        "\n",
        "# For visualization support, include the visualization dependencies.\n",
        "# pip install samplomatic[vis]\n",
        "```\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9112ddbd-7101-4cac-a53f-5ecf492bc8d4",
      "metadata": {},
      "source": [
        "<span id=\"steps-to-use-the-executor-primitive\" />\n",
        "\n",
        "## Étapes pour utiliser la primitive Executor\n",
        "\n",
        "<span id=\"1-initialize-the-account\" />\n",
        "\n",
        "### 1. Créer le compte\n",
        "\n",
        "IBM Quantum Compute Service étant un service géré, vous devez d'abord initialiser votre compte. Vous pouvez ensuite sélectionner le QPU que vous souhaitez utiliser pour calculer la valeur attendue.\n",
        "\n",
        "Si vous n'avez pas encore de compte, suivez les étapes décrites dans la section «[ Créer votre compte IBM Cloud®](/docs/guides/cloud-setup) ».\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "c0b08867-a635-481e-ac4f-52359382c94d",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService, Executor\n",
        "from qiskit_ibm_runtime.quantum_program import QuantumProgram\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from samplomatic.transpiler import generate_boxing_pass_manager\n",
        "from samplomatic import build\n",
        "\n",
        "# Initialize the service and choose a backend\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(operational=True, simulator=False)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "ec105ea7-d806-4333-92af-2d7c578c67d9",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "<IBMBackend('ibm_fez')>\n"
          ]
        }
      ],
      "source": [
        "print(backend)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "89c4ffd9-acde-4b1f-8ada-fc39b7a708ed",
      "metadata": {},
      "source": [
        "<span id=\"2-create-and-transpile-a-circuit\" />\n",
        "\n",
        "### 2. Créer et compiler un circuit\n",
        "\n",
        "Il faut au moins un circuit pour pouvoir utiliser la primitive Executor.  Elle peut éventuellement comporter des paramètres.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "7671b4dd-b031-44b7-bd4a-48dd39fb93f4",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Generate the circuit\n",
        "circuit = QuantumCircuit(2)\n",
        "circuit.h(0)\n",
        "circuit.h(1)\n",
        "circuit.cz(0, 1)\n",
        "circuit.h(1)\n",
        "\n",
        "# Using `measure_all` automatically creates the necessary\n",
        "# classical registers.\n",
        "circuit.measure_all()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "127d6de9-084e-47d5-82d6-f2197c0bd74c",
      "metadata": {},
      "source": [
        "Le circuit doit être modifié afin de n'utiliser que les instructions prises en charge par le QPU (ce que l'on appelle les circuits *d'architecture de jeu d'instructions, ou ISA* ). Pour ce faire, utilisez le transcompilateur.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "7a98fb20-8731-43f3-a81c-fb2bc8cba9db",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Transpile the circuit\n",
        "preset_pass_manager = generate_preset_pass_manager(\n",
        "    backend=backend, optimization_level=0\n",
        ")\n",
        "isa_circuit = preset_pass_manager.run(circuit)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "172b3622-adbb-43f6-9cec-b70dc72094e0",
      "metadata": {},
      "source": [
        "<span id=\"3-initialize-a-quantumprogram\" />\n",
        "\n",
        "### 3. Initialiser un objet de type ` `QuantumProgram` `\n",
        "\n",
        "Initialisez un `QuantumProgram` avec votre charge de travail. A `QuantumProgram` est constitué de `QuantumProgramItems`. En général, chaque élément se compose d'un circuit, d'un ensemble de valeurs de paramètres et, éventuellement, d'un mécanisme `samplex` permettant de randomiser le contenu du circuit. Pour plus de détails, consultez [la section « Entrées et sorties de l'exécuteur](/docs/guides/executor-input-output) ».\n",
        "\n",
        "La cellule suivante initialise un `QuantumProgram` et spécifie d'effectuer 25 tirs. Ensuite, il ajoute le circuit cible transpilé.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "eb6719cf-c7f1-4265-8602-9a65071a2dd5",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Initialize an empty program\n",
        "program = QuantumProgram(shots=25)\n",
        "\n",
        "# Append the circuit to the program\n",
        "program.append_circuit_item(isa_circuit)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "da542e9b-f143-4651-ab3d-86fb54c066ab",
      "metadata": {},
      "source": [
        "<span id=\"4-optional-group-gates-and-measurements-into-annotated-boxes\" />\n",
        "\n",
        "### 4. Facultatif : regroupez les portes et les mesures dans des encadrés annotés\n",
        "\n",
        "Le regroupement des instructions dans des blocs et leur annotation constituent le principal moyen d'exprimer votre intention. Dans l'exemple suivant, nous utilisons `generate_boxing_pass_manager` et ses paramètres de rotation pour regrouper des portes à deux qubits et des mesures dans des cases, puis nous appliquons une annotation de rotation.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "245a4574-3ce9-4f77-98c8-af32cde8ac01",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/get-started-with-executor/extracted-outputs/245a4574-3ce9-4f77-98c8-af32cde8ac01-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Generate a boxing pass manager to group gates\n",
        "# and measurements into boxes and add\n",
        "# a`Twirl` annotation.\n",
        "boxes_pm = generate_boxing_pass_manager(\n",
        "    # Add gate twirling\n",
        "    enable_gates=True,\n",
        "    # Add measurement twirling\n",
        "    enable_measures=True,\n",
        ")\n",
        "\n",
        "boxed_circuit = boxes_pm.run(isa_circuit)\n",
        "boxed_circuit.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2b2fe4a7-2a1c-489e-9063-3084edfc2517",
      "metadata": {},
      "source": [
        "<span id=\"5-optional-build-a-template-circuit-and-samplex-and-add-them-to-the-program\" />\n",
        "\n",
        "### 5. Facultatif : Créez un circuit type et un exemple, puis ajoutez-les au programme\n",
        "\n",
        "Ensuite, utilisez la méthode [de construction](https://qiskit.github.io/samplomatic/api/auto/samplomatic.build.html#samplomatic.build) Samplomatic pour générer le *circuit modèle* et la paire *de samplex*. Le circuit modèle est structurellement équivalent au circuit d'origine. Cependant, ses portes à un qubit sont remplacées par des portes paramétrées afin de mettre en œuvre les annotations prescrites (rotation des portes et des mesures, dans cet exemple). Le samplex contient toutes les informations nécessaires pour générer des paramètres aléatoires pour le circuit modèle.\n",
        "\n",
        "Une fois le circuit modèle et la paire de samplex générés, utilisez la `append_samplex_item` méthode pour ajouter la paire au programme.\n",
        "\n",
        "Consultez la documentation [de l'API](https://qiskit.github.io/samplomatic/api/index.html) Samplomatic pour obtenir tous les détails concernant `samplomatic.samplex.Samplex` et ses arguments.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "47bbeef2-2d85-4495-b740-2e64eb9066b7",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Build the template circuit and the samplex\n",
        "template_circuit, samplex = build(boxed_circuit)\n",
        "\n",
        "# Append the template circuit and samplex as a `samplex_item`\n",
        "program.append_samplex_item(\n",
        "    template_circuit,\n",
        "    samplex=samplex,\n",
        "    shape=(num_randomizations := 20,),\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3733cce7-15d5-4c04-a1cd-0bf83e94aeaf",
      "metadata": {},
      "source": [
        "<span id=\"6-invoke-executor-and-get-results\" />\n",
        "\n",
        "### 6. Lancer Executor et obtenir les résultats\n",
        "\n",
        "Exécutez le `QuantumProgram` sur un backend IBM® en utilisant la `Executor` primitive avec les options par défaut. Consultez [la section « Options de l'exécuteur](/docs/guides/executor-options) » pour en savoir plus sur les options disponibles.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "b767050c-0299-4100-8be4-b73b0587e088",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<RuntimeJobV2('d8286580bvlc73d1vmsg', 'executor')>"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Initialize an Executor with the default options\n",
        "executor = Executor(mode=backend)\n",
        "\n",
        "# Submit the job\n",
        "job = executor.run(program)\n",
        "job"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "a341681d-0704-4800-af65-e49b7627bb36",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Retrieve the result\n",
        "result = job.result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e649245b-633d-4123-ad55-9971b9366433",
      "metadata": {},
      "source": [
        "Le résultat est de type [`QuantumProgramResult`](/docs/api/qiskit-ibm-runtime/results-quantum-program-result). Consultez [la section « Entrées et sorties de l'exécuteur](/docs/guides/executor-input-output) » pour en savoir plus sur l'objet résultat.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a6e149b1-de4f-41bb-b972-0781f082fa45",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Etapes suivantes\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recommandations\">\n",
        "  * Essayez quelques [exemples d'Executor](/docs/guides/executor-examples).\n",
        "  * Comprendre [les entrées et les sorties de l'exécuteur](/docs/guides/executor-input-output).\n",
        "  * Découvrez [la sémantique de diffusion d'Executor](/docs/guides/executor-broadcasting).\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
}