{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "dde95705",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Gestion des performances - Une fonction Qiskit par Q-CTRL Fire Opal\"\n",
        "description: \"Appliquez la suppression automatisée des erreurs à l'aide de Fire Opal Performance Management de Q-CTRL\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore fontsize, Mundada, Yamauchi, supersymmetric, Paterakis, Gharibyan */}\n",
        "\n",
        "<span id=\"performance-management-a-qiskit-function-by-q-ctrl-fire-opal\" />\n",
        "\n",
        "# Gestion des performances : une fonction Qiskit par Q-CTRL Fire Opal\n",
        "\n",
        "*Consultez la [documentation de l'API](/docs/api/functions/q-ctrl-performance-management)*\n",
        "\n",
        "<Admonition type=\"note\" title=\"Remarque\">\n",
        "  Les fonctions Qiskit sont une fonctionnalité expérimentale disponible uniquement pour IBM Quantum® Premium Plan, Flex Plan, et On-Prem (via IBM Quantum Platform API). Elles sont en cours de publication et peuvent être modifiées.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ace2ed13",
      "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 figurant sur cette page a été développé selon les exigences suivantes.\n",
        "    Nous recommandons d'utiliser ces versions ou des versions plus récentes.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.3.1\n",
        "    qiskit-ibm-runtime~=0.45.1\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c1732b45",
      "metadata": {},
      "source": [
        "<span id=\"overview\" />\n",
        "\n",
        "## Aperçu\n",
        "\n",
        "Fire Opal Performance Management permet à tout un chacun d'obtenir des résultats significatifs à partir d'ordinateurs quantiques à grande échelle sans avoir besoin d'être un expert en matériel quantique. Lors de l'exécution de circuits avec Fire Opal Performance Management, des techniques de suppression des erreurs pilotées par l'IA sont automatiquement appliquées, ce qui permet la mise à l'échelle de problèmes plus importants avec davantage de portes et de qubits. Cette approche réduit le nombre de tirs nécessaires pour obtenir la bonne réponse, sans frais généraux supplémentaires, ce qui se traduit par des économies significatives en termes de temps de calcul et de coûts.\n",
        "\n",
        "La gestion des performances supprime les erreurs et augmente la probabilité d'obtenir la bonne réponse sur du matériel bruyant. En d'autres termes, il augmente le rapport signal/bruit. L'image suivante montre comment la précision accrue permise par la gestion des performances peut réduire le besoin de prises de vue supplémentaires dans le cas d'un algorithme de transformée de Fourier quantique à 10 qubits. Avec seulement 30 tirs, Q-CTRL atteint le seuil de confiance de 99%, alors que la méthode par défaut (`QiskitRuntime` Sampler, `optimization_level`=3 et `resilience_level`=1, `ibm_sherbrooke`) nécessite 170 000 tirs. En obtenant la bonne réponse plus rapidement, vous économisez un temps de calcul considérable.\n",
        "\n",
        "![Visualisation de la durée d'exécution améliorée](https://quantum.cloud.ibm.com/docs/images/guides/qctrl-performance-management/achieve_more.svg)\n",
        "\n",
        "La fonction « Performance Management » peut être utilisée avec n'importe quel algorithme, et vous pouvez facilement l'utiliser à la place des [primitives standard d' IBM Quantum.](/docs/guides/primitives) En coulisses, plusieurs techniques de gestion des erreurs fonctionnent de concert pour empêcher les erreurs de se produire lors de l'exécution. Toutes les méthodes de pipeline de Fire Opal sont préconfigurées et indépendantes des algorithmes, ce qui signifie que vous bénéficiez toujours des meilleures performances dès l'installation.\n",
        "\n",
        "Pour accéder à la gestion de la performance, [contactez Q-CTRL](https://form.typeform.com/to/uOAVDnGg?typeform-source=q-ctrl.com).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5f761442",
      "metadata": {},
      "source": [
        "<span id=\"description\" />\n",
        "\n",
        "## Description\n",
        "\n",
        "Fire Opal Performance Management propose deux options d'exécution similaires aux primitives d' IBM Quantum, ce qui vous permet d'intégrer facilement l'échantillonneur et l'estimateur Q-CTRL. Le déroulement général de l'utilisation de la fonction « Gestion de la performance » est le suivant :\n",
        "\n",
        "1. Définissez votre circuit (et vos opérateurs dans le cas de l'Estimateur).\n",
        "2. Faire fonctionner le circuit.\n",
        "3. Récupérer les résultats.\n",
        "\n",
        "Pour réduire le bruit matériel, Fire Opal utilise une série de techniques de suppression d'erreurs pilotées par l'intelligence artificielle, comme le montre l'image suivante. Avec Fire Opal, l'ensemble du pipeline est entièrement automatisé et ne nécessite aucune configuration.\n",
        "\n",
        "Le pipeline de Fire Opal élimine le besoin de frais généraux supplémentaires, tels qu'un temps d'exécution quantique accru ou des qubits physiques supplémentaires. Notez que le temps de traitement classique reste un facteur (reportez-vous à la section [Benchmarks](#benchmarks) pour des estimations, où le \"temps total\" reflète à la fois le traitement classique et le traitement quantique). Contrairement à l'atténuation des erreurs, qui nécessite des frais généraux sous forme d'échantillonnage, la suppression des erreurs de Fire Opal agit à la fois au niveau des portes et des impulsions pour traiter les différentes sources de bruit et prévenir la probabilité qu'une erreur se produise. En évitant les erreurs, le besoin d'un post-traitement coûteux est éliminé.\n",
        "\n",
        "L'image suivante illustre les méthodes de suppression des erreurs automatisées par Fire Opal Performance Management.\n",
        "\n",
        "![Visualisation du pipeline de suppression des erreurs](https://quantum.cloud.ibm.com/docs/images/guides/qctrl-performance-management/error_suppression.svg)\n",
        "\n",
        "Cette fonction propose deux primitives, « Sampler » et « Estimator », dont les entrées et les sorties étendent la spécification mise en œuvre pour [les primitives « IBM Quantum » V2](/docs/guides/primitive-input-output#pubs).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "64534d1a",
      "metadata": {},
      "source": [
        "<span id=\"benchmarks\" />\n",
        "\n",
        "## Tests de performances\n",
        "\n",
        "Les résultats [publiés de l'évaluation comparative des algorithmes](https://journals.aps.org/prapplied/abstract/10.1103/PhysRevApplied.20.024034) démontrent une amélioration significative des performances de divers algorithmes, notamment Bernstein-Vazirani, la transformée de Fourier quantique, la recherche de Grover, l'algorithme d'optimisation approximative quantique et le résolveur d'équations quantiques variationnelles. Le reste de cette section fournit plus de détails sur les types d'algorithmes que vous pouvez exécuter, ainsi que sur les performances et les durées d'exécution attendues.\n",
        "\n",
        "Les études indépendantes suivantes montrent comment la gestion des performances de Q-CTRL permet de mener des recherches algorithmiques à une échelle record :\n",
        "\n",
        "* [Noyaux quantiques paramétrés et économes en énergie pour le diagnostic des défaillances des services de réseau](https://arxiv.org/abs/2405.09724v1) - apprentissage de noyaux quantiques jusqu'à 50 qubits\n",
        "* [Estimation de la différence de phase quantique basée sur un tenseur pour une démonstration à grande échelle](https://arxiv.org/abs/2408.04946) - estimation de la phase quantique jusqu'à 33 qubits\n",
        "* [Apprentissage hiérarchique pour la ML quantique : nouvelle technique d'entraînement pour les circuits quantiques variationnels à grande échelle](https://arxiv.org/abs/2311.12929) - chargement de données quantiques jusqu'à 21 qubits\n",
        "\n",
        "Le tableau suivant donne une indication approximative de la précision et de la durée d'exécution des analyses comparatives effectuées précédemment sur `ibm_fez`. Les performances sur d'autres appareils peuvent varier. Le temps d'utilisation est basé sur une hypothèse de 10 000 tirs par circuit. Le \"nombre de qubits\" indiqué n'est pas une limite absolue, mais représente des seuils approximatifs pour lesquels on peut s'attendre à une précision extrêmement constante des solutions. Des problèmes de plus grande taille ont été résolus avec succès, et les essais au-delà de ces limites sont encouragés.\n",
        "\n",
        "| Exemple                                                             | Nombre de qubits | Exactitude | Mesure de la précision                                                                                               | Durée totale (s)             | Utilisation du temps d'exécution (s) | Primitif (Mode) |\n",
        "| ------------------------------------------------------------------- | ---------------- | ---------- | -------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------ | --------------- |\n",
        "| Bernstein-Vazirani                                                  | 50Q              | 100 %      | Taux de réussite (pourcentage d'exécutions pour lesquelles la réponse correcte est la chaîne de bits la plus élevée) | 10                           | 8                                    | Echantillonneur |\n",
        "| Transformée de Fourier quantique                                    | 30Q              | 100 %      | Taux de réussite (pourcentage d'exécutions pour lesquelles la réponse correcte est la chaîne de bits la plus élevée) | 10                           | 8                                    | Echantillonneur |\n",
        "| Estimation quantique de la phase                                    | 30Q              | 99.9998%   | Précision de l'angle trouvé : `1- abs(real_angle - angle_found)/pi`                                                  | 10                           | 8                                    | Echantillonneur |\n",
        "| Simulation quantique : Modèle Ising (15 étapes)                     | 20Q              | 99.775%    | $A$ (défini ci-dessous)                                                                                              | 60 (par étape)               | 15 (par étape)                       | Estimateur      |\n",
        "| Simulation quantique 2 : dynamique moléculaire (20 points de temps) | 34Q              | 96.78%     | $A_{mean}$ (défini ci-dessous)                                                                                       | 10 (par point dans le temps) | 6 (par point dans le temps)          | Estimateur      |\n",
        "\n",
        "Définition de la précision de la mesure d'une valeur attendue - la métrique $A$ est définie comme suit :\n",
        "\n",
        "$$\n",
        "A = 1 - \\frac{|\\epsilon^{ideal} - \\epsilon^{meas}|}{\\epsilon^{ideal}_{max} - \\epsilon^{ideal}_{min}},\n",
        "$$\n",
        "\n",
        "où $\\epsilon^{ideal}$ = valeur idéale attendue, $\\epsilon^{meas}$ = valeur mesurée attendue, $\\epsilon^{ideal}_{max} $ = valeur maximale idéale et $\\epsilon^{ideal}_{min}$ = valeur minimale idéale. $A_{mean}$ est simplement la moyenne de la valeur de $A$ sur plusieurs mesures.\n",
        "\n",
        "Cette mesure est utilisée parce qu'elle est invariante par rapport aux changements globaux et aux échelles dans la gamme des valeurs réalisables. En d'autres termes, que l'on augmente ou diminue la fourchette des valeurs possibles de l'espérance ou que l'on augmente l'écart, la valeur de $A$ devrait rester cohérente.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "870af0fe",
      "metadata": {},
      "source": [
        "<span id=\"get-started\" />\n",
        "\n",
        "## Premiers pas\n",
        "\n",
        "Fire Opal Performance Management utilise Qiskit v`2.0.0`, qui est la version recommandée. Les versions prises en charge sont Qiskit >= v`2.0.0`.\n",
        "Authentifiez-vous à l'aide de votre [clé API IBM Quantum Platform](http://quantum.cloud.ibm.com/) et sélectionnez la fonction Qiskit comme suit. (Cet extrait de code part du principe que vous avez déjà [enregistré votre compte](/docs/guides/functions-get-started#install-qiskit-functions-catalog-client) dans votre environnement local.)\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "11af8fb4",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[QiskitFunction(qunova/hivqe-chemistry),\n",
              " QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),\n",
              " QiskitFunction(algorithmiq/tem),\n",
              " QiskitFunction(qedma/qesem),\n",
              " QiskitFunction(multiverse/singularity),\n",
              " QiskitFunction(ibm/circuit-function),\n",
              " QiskitFunction(q-ctrl/optimization-solver),\n",
              " QiskitFunction(colibritd/quick-pde),\n",
              " QiskitFunction(q-ctrl/performance-management),\n",
              " QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
        "\n",
        "catalog = QiskitFunctionsCatalog(channel=\"ibm_quantum_platform\")\n",
        "\n",
        "# verify that you have access to the function\n",
        "catalog.list()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "736255e4-1c1f-42a7-bf76-1487878c9e76",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Access Function\n",
        "perf_mgmt = catalog.load(\"q-ctrl/performance-management\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d4657810",
      "metadata": {},
      "source": [
        "<Admonition type=\"note\" title=\"Cette fonction prend-elle en charge tous les backends d' IBM?\">\n",
        "  Si vous souhaitez utiliser un backend qui n'est pas encore pris en charge par cette fonction, [contactez Q-CTRL](https://form.typeform.com/to/iuujEAEI?typeform-source=q-ctrl.com) pour qu'il soit ajouté.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2947b5c3",
      "metadata": {},
      "source": [
        "<span id=\"estimator-primitive\" />\n",
        "\n",
        "## Primitive d'estimation\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "df2788d5",
      "metadata": {},
      "source": [
        "<span id=\"estimator-example\" />\n",
        "\n",
        "### Exemple d'estimateur\n",
        "\n",
        "Utilisez la primitive Estimator de Fire Opal Performance Management pour déterminer la valeur attendue d'une seule paire circuit-observable.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "82932760",
      "metadata": {},
      "source": [
        "En plus des paquets `qiskit-ibm-catalog` et `qiskit` , vous utiliserez également le paquet `numpy` pour exécuter cet exemple. Vous pouvez installer ce paquet en décommentant la cellule suivante si vous exécutez cet exemple dans un ordinateur portable utilisant le noyau IPython.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "70bb93ef",
      "metadata": {},
      "outputs": [],
      "source": [
        "# %pip install numpy"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "02b2a79a",
      "metadata": {},
      "source": [
        "**1. Créer le circuit**\n",
        "\n",
        "Par exemple, générez un opérateur hermitien aléatoire et un observable à introduire dans la fonction de gestion des performances.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "32037218",
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import iqp\n",
        "from qiskit.quantum_info import random_hermitian, SparsePauliOp\n",
        "\n",
        "n_qubits = 50\n",
        "\n",
        "# Generate a random circuit\n",
        "mat = np.real(random_hermitian(n_qubits, seed=1234))\n",
        "circuit = iqp(mat)\n",
        "circuit.measure_all()\n",
        "\n",
        "# Define observables as a string\n",
        "observable = SparsePauliOp(\"Z\" * n_qubits)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "476fae6a",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Create PUB tuple\n",
        "estimator_pubs = [(circuit, observable)]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "09e64cd7",
      "metadata": {},
      "source": [
        "**2. Faire fonctionner le circuit**\n",
        "\n",
        "Exécutez le circuit et définissez éventuellement le backend et le nombre de tirs.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "26952e1f",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Run the circuit using Estimator\n",
        "qctrl_estimator_job = perf_mgmt.run(\n",
        "    primitive=\"estimator\",\n",
        "    pubs=estimator_pubs,\n",
        "    backend_name=backend_name,\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c07af9d0",
      "metadata": {},
      "source": [
        "Vous pouvez utiliser les [API](/docs/guides/serverless) familières d' Qiskit Serverless s pour vérifier l'état de votre charge de travail Qiskit Function :\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "2b309861",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "'QUEUED'"
            ]
          },
          "execution_count": 9,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qctrl_estimator_job.status()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "23556c8e",
      "metadata": {},
      "source": [
        "**3. Récupérer le résultat**\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "8be67088",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Retrieve the counts from the result list\n",
        "result = qctrl_estimator_job.result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7375fcad",
      "metadata": {},
      "source": [
        "Les résultats se présentent sous le même format que [ceux](/docs/guides/estimator-input-output) d'Estimator :\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 22,
      "id": "ef85a036",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The result of the submitted job had 1 PUB\n",
            "The result of the submitted job had 1 PUB and has a value:\n",
            " PubResult(data=DataBin(evs=0.0195, stds=0.9998098569228051), metadata={'precision': None})\n",
            "\n",
            "The associated PubResult of this job has the following DataBins:\n",
            "DataBin(evs=0.0195, stds=0.9998098569228051)\n",
            "\n",
            "And this DataBin has attributes: dict_keys(['evs', 'stds'])\n",
            "The expectation values measured from this PUB are:\n",
            "0.0195\n"
          ]
        }
      ],
      "source": [
        "import numpy\n",
        "\n",
        "result_str = str(result)\n",
        "\n",
        "with numpy.printoptions(threshold=200):\n",
        "    print(\n",
        "        f\"The result of the submitted job had {len(result)} PUB \"\n",
        "        f\"and has a value:\\n {result[0]}\\n\"\n",
        "    )\n",
        "\n",
        "print(\"The associated PubResult of this job has the following DataBins:\")\n",
        "print(f\"{result[0].data}\\n\")\n",
        "\n",
        "print(f\"And this DataBin has attributes: {result[0].data.keys()}\")\n",
        "\n",
        "print(\"The expectation values measured from this PUB are:\")\n",
        "print(f\"{result[0].data.evs}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a78ce8bd",
      "metadata": {},
      "source": [
        "<span id=\"sampler-primitive\" />\n",
        "\n",
        "## Primitive d'échantillonnage\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b1300f06",
      "metadata": {},
      "source": [
        "<span id=\"sampler-example\" />\n",
        "\n",
        "### Exemple d'échantillonneur\n",
        "\n",
        "Utilisez la primitive Sampler de Fire Opal Performance Management pour exécuter un circuit Bernstein-Vazirani. Cet algorithme, utilisé pour trouver une chaîne cachée à partir des sorties d'une fonction de boîte noire, est un algorithme d'évaluation commun car il n'y a qu'une seule réponse correcte.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "144e48f3",
      "metadata": {},
      "source": [
        "**1. Créer le circuit**\n",
        "\n",
        "Définissez la réponse correcte à l'algorithme, à la chaîne de bits cachée et au circuit de Bernstein-Vazirani. Vous pouvez ajuster la largeur du circuit en changeant simplement l'adresse `circuit_width`.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "2cd807b1",
      "metadata": {},
      "outputs": [],
      "source": [
        "import qiskit\n",
        "\n",
        "circuit_width = 35\n",
        "hidden_bitstring = \"1\" * circuit_width\n",
        "\n",
        "# Create circuit, reserving one qubit for BV oracle\n",
        "bv_circuit = qiskit.QuantumCircuit(circuit_width + 1, circuit_width)\n",
        "bv_circuit.x(circuit_width)\n",
        "bv_circuit.h(range(circuit_width + 1))\n",
        "for input_qubit, bit in enumerate(reversed(hidden_bitstring)):\n",
        "    if bit == \"1\":\n",
        "        bv_circuit.cx(input_qubit, circuit_width)\n",
        "bv_circuit.barrier()\n",
        "bv_circuit.h(range(circuit_width + 1))\n",
        "bv_circuit.barrier()\n",
        "for input_qubit in range(circuit_width):\n",
        "    bv_circuit.measure(input_qubit, input_qubit)\n",
        "\n",
        "# Create PUB tuple\n",
        "sampler_pubs = [(bv_circuit,)]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "85d3c00b",
      "metadata": {},
      "source": [
        "**2. Faire fonctionner le circuit**\n",
        "\n",
        "Exécutez le circuit et définissez éventuellement le backend et le nombre de tirs.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "id": "2595df84",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Run the circuit using Sampler\n",
        "qctrl_sampler_job = perf_mgmt.run(\n",
        "    primitive=\"sampler\",\n",
        "    pubs=sampler_pubs,\n",
        "    backend_name=backend_name,\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3c49fbba",
      "metadata": {},
      "source": [
        "Pour vérifier [l'état](/docs/guides/functions-get-started#check-job-status) de votre charge de travail Qiskit Function ou obtenir [les résultats, procédez](/docs/guides/functions-get-started#retrieve-results) comme suit :\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "id": "b7acbb7f",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "60fe2fa1-a860-43e4-8615-c6ac4180f93b\n"
          ]
        },
        {
          "data": {
            "text/plain": [
              "'QUEUED'"
            ]
          },
          "execution_count": 14,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Print the ID so you can use it later, if necessary\n",
        "print(qctrl_sampler_job.job_id)\n",
        "\n",
        "qctrl_sampler_job.status()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "35921605",
      "metadata": {},
      "source": [
        "**3. Récupérer le résultat**\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "id": "2d4f5f7d",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Retrieve the job results\n",
        "sampler_result = qctrl_sampler_job.result()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "id": "7a359d99",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Counts for the meas output register (limited to 30 results):\n",
            "  11111111111111111111111111111111111: 1661\n",
            "  11111111111111111111111111110111111: 60\n",
            "  11111111111111111111111111111101111: 54\n",
            "  11111111111111111111111111111110111: 54\n",
            "  11111111111111011111111111111111111: 46\n",
            "  11111111111111111110111111111111111: 44\n",
            "  11111111111111111111111101111111111: 42\n",
            "  11111111111111111111111110111111111: 42\n",
            "  11111111111111110111111111111111111: 41\n",
            "  11111111111111111111111111111111101: 39\n",
            "  11111111111111111111101111111111111: 38\n",
            "  11111111111111111111110111111111111: 38\n",
            "  11111111111111111111111111101111111: 37\n",
            "  11111111111111111111111111111111110: 36\n",
            "  11111111111110111111111111111111111: 35\n",
            "  11111111111111111111111111111011111: 32\n",
            "  11111111111111101111111111111111111: 32\n",
            "  01111111111111111111111111111111111: 27\n",
            "  11111111111111111011111111111111111: 23\n",
            "  11111111101111111111111111111111111: 22\n",
            "  11111111111111111111111111111111011: 21\n",
            "  11111111011111111111111111111111111: 20\n",
            "  00000000000000011111111111111111111: 18\n",
            "  11111111111111111111110101111111111: 18\n",
            "  00000001111111111111111111111111111: 17\n",
            "  11111111001111111111111111111111111: 16\n",
            "  11101111111111111111111111111111111: 16\n",
            "  11111111111101111111111111111111111: 16\n",
            "  00000101111111111111111111111111111: 13\n",
            "  11111111111111111111111011111111111: 13\n",
            "  11111111111111111111111110101111111: 13\n",
            "  11111111111111111101111111111111111: 12\n",
            "  10111111111111111111111111111111111: 12\n",
            "  11111111111111111111111110001111111: 12\n",
            "  00000000000000000011111111111111111: 11\n",
            "  11111111111111111111111111111110110: 10\n",
            "  00000000000000000000000001111111111: 10\n",
            "  11111111111011111111111111111111111: 9\n",
            "  11111111111111101011111111111111111: 9\n",
            "  00000000011111111111111111111111111: 8\n",
            "  10101111111111111111111111111111111: 8\n",
            "  00000000000000000000000001011111111: 8\n",
            "  11111111111111111111111111111111001: 8\n",
            "  00000111111111111111111111111111111: 7\n",
            "  11111111111111111111111111111101110: 7\n",
            "  11111111110111111111111111111111111: 7\n",
            "  00000000000001011111111111111111111: 6\n",
            "  00000000000000001111111111111111111: 6\n",
            "  00000000000000000001011111111111111: 6\n",
            "  11111111111111111111111111011111111: 6\n",
            "  ... (1050 more items)\n"
          ]
        }
      ],
      "source": [
        "# Get results for the first (and only) PUB\n",
        "pub_result = sampler_result[0]\n",
        "counts = pub_result.data.c.get_counts()\n",
        "\n",
        "print(\"Counts for the meas output register (limited to 30 results):\")\n",
        "for i, (bitstring, count) in enumerate(counts.items()):\n",
        "    if i >= 50:\n",
        "        print(f\"  ... ({len(counts) - 30} more items)\")\n",
        "        break\n",
        "    print(f\"  {bitstring}: {count}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d920922e",
      "metadata": {},
      "source": [
        "**3. Tracer les chaînes de bits supérieures**\n",
        "\n",
        "Tracer la chaîne de bits avec les comptes les plus élevés pour voir si la chaîne de bits cachée était le mode.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "id": "cefa2234",
      "metadata": {},
      "outputs": [],
      "source": [
        "import matplotlib.pyplot as plt\n",
        "\n",
        "\n",
        "def plot_top_bitstrings(counts_dict, hidden_bitstring=None):\n",
        "    # Sort and take the top 100 bitstrings\n",
        "    top_100 = sorted(counts_dict.items(), key=lambda x: x[1], reverse=True)[\n",
        "        :100\n",
        "    ]\n",
        "    if not top_100:\n",
        "        print(\"No bitstrings found in the input dictionary.\")\n",
        "        return\n",
        "\n",
        "    # Unzip the bitstrings and their counts\n",
        "    bitstrings, counts = zip(*top_100)\n",
        "\n",
        "    # Assign colors: purple if the bitstring matches hidden_bitstring,\n",
        "    # otherwise gray\n",
        "    colors = [\n",
        "        \"#680CE9\" if bit == hidden_bitstring else \"gray\" for bit in bitstrings\n",
        "    ]\n",
        "\n",
        "    # Create the bar plot\n",
        "    plt.figure(figsize=(15, 8))\n",
        "    plt.bar(\n",
        "        range(len(bitstrings)), counts, tick_label=bitstrings, color=colors\n",
        "    )\n",
        "\n",
        "    # Rotate the bitstrings for better readability\n",
        "    plt.xticks(rotation=90, fontsize=8)\n",
        "    plt.xlabel(\"Bitstrings\")\n",
        "    plt.ylabel(\"Counts\")\n",
        "    plt.title(\"Top 100 Bitstrings by Counts\")\n",
        "\n",
        "    # Show the plot\n",
        "    plt.tight_layout()\n",
        "    plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1d9d3b69",
      "metadata": {},
      "source": [
        "La chaîne de bits cachée est surlignée en violet et devrait être la chaîne de bits ayant le plus grand nombre de comptes.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "id": "8106d906",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/q-ctrl-performance-management/extracted-outputs/8106d906-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "plot_top_bitstrings(counts, hidden_bitstring)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d8104000b3d94c69",
      "metadata": {},
      "source": [
        "<span id=\"changelog\" />\n",
        "\n",
        "## Journal des modifications\n",
        "\n",
        "* 2026-02-20 : Avis de dépréciation - le champ `provider_job_ids` de métadonnées sera déprécié dans 30 jours dans la version 0.13.0. Les utilisateurs peuvent accéder à l'ID de tâche via `job_id()` la méthode du service d'exécution.\n",
        "* 11 février 2026 : Nous prenons désormais en charge `ibm_miami` et avons ajouté des métadonnées d'exécution au `PubResult`.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bb33258d",
      "metadata": {},
      "source": [
        "<span id=\"get-support\" />\n",
        "\n",
        "## Obtenir de l'aide\n",
        "\n",
        "Pour toute question ou problème, [contactez Q-CTRL](https://form.typeform.com/to/iuujEAEI).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2fe4a6ea",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Etapes suivantes\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recommandations\">\n",
        "  * Demander un accès à [Q-CTRL Performance Management](/functions?id=q-ctrl-performance-management).\n",
        "  * Consultez [la documentation de l'API](/docs/api/functions/q-ctrl-performance-management) relative à cette fonction Qiskit.\n",
        "  * Essayez le [modèle d'Ising à champ transversal avec](/docs/tutorials/transverse-field-ising-model) le tutoriel sur la gestion des performances de Q-CTRL.\n",
        "  * Essayez [l](/docs/tutorials/quantum-phase-estimation-qctrl) 'estimation de phase quantique avec le tutoriel « Qiskit Functions » (Estimation de phase quantique) de Q-CTRL\n",
        "  * Critique [Mundada P. S., et al. (2023). Évaluation expérimentale d'un flux de travail automatisé et déterministe de suppression des erreurs pour les algorithmes quantiques. Physical Review Applied, 20, 2](https://quantum-journal.org/papers/q-2023-07-25-1067/).\n",
        "  * Critique [Kanno, S., et al. (2025). Estimation de la différence de phase quantique basée sur les tenseurs pour une démonstration à grande échelle. arXiv prépublication arXiv:2408.04946](https://arxiv.org/abs/2408.04946).\n",
        "  * Critique [de l' SoftBank Corp, Expérience de démonstration d'un système de diagnostic des défaillances des services de communication utilisant l' Machine Learning e quantique (blog), 30 août 2024](https://www.softbank.jp/en/corp/technology/research/topics/102/).\n",
        "  * Critique [Yamauchi, H., et al. (2024). Noyaux quantiques paramétrés à haute efficacité énergétique pour le diagnostic des défaillances des services réseau. arXiv prépublication arXiv:2405.09724v1](https://arxiv.org/abs/2405.09724v1).\n",
        "  * Critique [Yamauchi, H., et al. (2025). Spectroscopie quantique de la dynamique topologique via un hamiltonien supersymétrique. arXiv prépublication arXiv:2511.23169v1](https://arxiv.org/abs/2511.23169v1).\n",
        "  * Critique [Wang, Y., et al. (2025).  Δ-Motif : isomorphisme de sous-graphes à grande échelle via le parallélisme centré sur les données. arXiv prépublication arXiv:2508.21287](https://arxiv.org/abs/2508.21287).\n",
        "  * Critique [Paterakis, N. G., et al. (2025).  L'informatique quantique dans le paysage informatique de l'électronique de puissance : vision et réalité. arXiv prépublication arXiv:2507.02577](https://arxiv.org/abs/2507.02577).\n",
        "  * Critique [Gharibyan, H., et al. (2023).  Apprentissage hiérarchique pour le ML quantique : nouvelle technique d'entraînement pour les circuits quantiques variationnels à grande échelle. arXiv prépublication arXiv:2311.12929](https://arxiv.org/abs/2311.12929).\n",
        "  * Consultez [l](https://q-ctrl.com/case-study/unlocking-new-performance-capability-in-quantum-chemistry) 'étude de cas Mitsubishi Chemical Corp.\n",
        "  * Consultez [l](https://q-ctrl.com/case-study/reducing-quantum-compute-costs-2-500x-with-fire-opal) 'étude de cas bancaire expurgée.\n",
        "  * Consultez [l](https://q-ctrl.com/case-study/enabling-data-loading-for-quantum-machine-learning-with-fire-opal) 'étude de cas sur l' BlueQubit.\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": 5
}