{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "0be36083-7bf5-48b7-9241-7979d6853d0c",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Exemples d'échantillons\"\n",
        "description: \"Exemples pratiques d'utilisation de la primitive « Sampler » d' IBM Quantum.\"\n",
        "---\n",
        "\n",
        "<span id=\"sampler-examples\" />\n",
        "\n",
        "# Exemples d'échantillons\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ef0ce9e6-eee0-4b4b-a068-52e8cbd69115",
      "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 tenant compte des exigences suivantes.\n",
        "    Nous vous recommandons d'utiliser ces versions ou des versions plus récentes.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.1\n",
        "    qiskit-ibm-runtime~=0.47.0\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ab973ab2-72aa-4a57-9132-b46002738489",
      "metadata": {},
      "source": [
        "Générer des distributions de quasi-probabilités complètes, à risque atténué, échantillonnées à partir des sorties de circuits quantiques. Tirez parti des fonctionnalités de Sampler pour les algorithmes de recherche et de classification tels que Grover et QVSM.\n",
        "\n",
        "<span id=\"run-a-single-experiment\" />\n",
        "\n",
        "## Lancer une seule expérience\n",
        "\n",
        "Utilisez Sampler pour renvoyer les résultats de mesure sous forme de chaînes de bits ou de nombres d'impulsions pour un circuit donné.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "fffb9af3-e122-4ca9-93e3-79edd6112ff8",
      "metadata": {
        "scrolled": true
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > First ten results: ['1111010010110011001010101100010100001010110000100110111000000000100011100000001101110110001010000100000000010000000011000110101', '1001001111111001011011011011001010100101010000001101000010101101010000011100000000100100010000001000010000001010001001010101111', '0100001101111001110000000001000101101010001000010110111100011000100000010101101110001000010001111110001000100010011110000001100', '1000101001100101010000100001000101101010000011001110101111100010111011010110001010101010011011000001100000000010100100010100111', '1100011110101010000000011000100000100001110101011011100011011000111111110010000101000000000101011100001000100101000000000100001', '0000001100000000101100000000110100101011110100101101100110000000100110001110100000010010100000011101011001000000001011000100101', '1000001100110111001110100011101000111111101100110011100000000000000100001000100101100110000000100101000101001001110000001110000', '1100001000101000101100010011010101001010110010101000110111010100000100000011110000110011010110011010110010000000000000000000101', '0111010011101111010010000011010010001000000000010100000001001010001111100000100101000101000111110010101010100000101000100101011', '0100001000101010110010100111110100101001011111000011111010100110011000100001100000111101100101000000010010010000011110001011000']\n"
          ]
        }
      ],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import iqp\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit.quantum_info import random_hermitian\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler\n",
        "\n",
        "n_qubits = 127\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(\n",
        "    operational=True, simulator=False, min_num_qubits=n_qubits\n",
        ")\n",
        "\n",
        "mat = np.real(random_hermitian(n_qubits, seed=1234))\n",
        "circuit = iqp(mat)\n",
        "circuit.measure_all()\n",
        "\n",
        "pm = generate_preset_pass_manager(backend=backend, optimization_level=1)\n",
        "isa_circuit = pm.run(circuit)\n",
        "\n",
        "sampler = Sampler(backend)\n",
        "job = sampler.run([isa_circuit])\n",
        "result = job.result()\n",
        "\n",
        "# Get results for the first (and only) PUB\n",
        "pub_result = result[0]\n",
        "\n",
        "print(f\" > First ten results: {pub_result.data.meas.get_bitstrings()[:10]}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6b1cd3d9-8487-4889-9cd6-638a13fc7127",
      "metadata": {},
      "source": [
        "<span id=\"run-multiple-experiments-in-a-single-job\" />\n",
        "\n",
        "## Exécuter plusieurs expériences dans un seul travail\n",
        "\n",
        "Utilisez Sampler pour renvoyer les résultats de mesure sous forme de chaînes de bits ou de nombres de circuits dans une seule tâche.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "4f68f509-7965-41f7-9f5e-7922a45ba22d",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > First five results for pub 0: ['0101000101101010001010110001000101011010001000011001101011100011010001000000011001010110011001100000010001000001000100001111011', '0001010011100000101110011011110001110001000101000101011100101101010001000110101000001000101010000001000001000101101100000101000', '0100100110010110000000101011101100011000000101111110111111010001010000000010000010101110100101100111000101100010100111000010100', '1001011100111110000100011111110001011001100100001010000101010000111010000001100111110001101101001010110100000001010000010110000', '0001101101111010100001110101000011100001100001011101110100000110100001001101011110111011001011000101010110000010000111000001100']\n",
            " > First five results for pub 1: ['1111011001010000011101010001110000011000100000000001101010100000001100001001011010000100110100110111000001011000010010000000110', '0100111011011010011111101001110101101000100000000011111101011000100010000001110110010011000111010000100010101001011001001101110', '0110001000111101001000101000101000010010100010010000011011110001111010000000011010100000110000010000111101000010001001000100100', '1110110111110000010111101000111000100011110110011001100011000101000111110001001010000110100000011001100011101100000000000101010', '1000010011110101101101111100011000100101001011110010000101011100010111101100111001101111111111010100011010110100011000100100001']\n",
            " > First five results for pub 2: ['0100010111001111010001100100111010110000001000110000111010111001000011101110000110110010010000001000100100000010101000000001100', '0000110110001001100000001000101000001101010100011010111000101011011110000101011010000110000000000100000001010110010010000000001', '0001000111100100110100101100011011000010100001000100100000010001101110000000010101100111100100111101010111111001100101100010010', '0011110010110101011001111100000101000010001111000101100000001100110011111000000100010010101110111001011100000000001010000001001', '1110000001000100001010011100110100011110101010100100111111000110010111000001001100111000101001001100011011010010111000101000011']\n"
          ]
        }
      ],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import iqp\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit.quantum_info import random_hermitian\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler\n",
        "\n",
        "n_qubits = 127\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(\n",
        "    operational=True, simulator=False, min_num_qubits=n_qubits\n",
        ")\n",
        "\n",
        "rng = np.random.default_rng()\n",
        "mats = [np.real(random_hermitian(n_qubits, seed=rng)) for _ in range(3)]\n",
        "circuits = [iqp(mat) for mat in mats]\n",
        "for circuit in circuits:\n",
        "    circuit.measure_all()\n",
        "\n",
        "pm = generate_preset_pass_manager(backend=backend, optimization_level=1)\n",
        "isa_circuits = pm.run(circuits)\n",
        "\n",
        "sampler = Sampler(mode=backend)\n",
        "job = sampler.run(isa_circuits)\n",
        "result = job.result()\n",
        "\n",
        "for idx, pub_result in enumerate(result):\n",
        "    print(\n",
        "        f\" > First five results for pub {idx}: \"\n",
        "        f\"{pub_result.data.meas.get_bitstrings()[:5]}\"\n",
        "    )"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f6298621-8160-4e8b-8f43-316c5e388dd0",
      "metadata": {},
      "source": [
        "<span id=\"run-parameterized-circuits\" />\n",
        "\n",
        "## Exécuter des circuits paramétrés\n",
        "\n",
        "Effectuez plusieurs expériences au sein d'un même travail, en exploitant les valeurs des paramètres pour améliorer la réutilisabilité des circuits.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "b8633a12-3cbc-42a2-85db-4ea1a2d7bda7",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " >> First five results for the meas output register: ['1001010001111101000000100001100110000001110001011100011001110011101111001110110100110101011001100100011001110001110011011100011', '1000101001000011110100010010001111101110000001111100001010100000100000100110101111110011000000111001010100110001011011101001111', '0110111100011101011000100011000011000010110110000100101100010101111001101011111110011111100000100011111001101101001111011110101', '0110111011101011011111000100000011110011010000010000100110000011101000111100011100100110111000110100111000101011111100010100111', '0000001110100110101011011110110011111100011111001011010101111100000010111110010100001110001001110000001011110011001001000001111']\n"
          ]
        }
      ],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import real_amplitudes\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler\n",
        "\n",
        "n_qubits = 127\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(\n",
        "    operational=True, simulator=False, min_num_qubits=n_qubits\n",
        ")\n",
        "\n",
        "# Step 1: Map classical inputs to a quantum problem\n",
        "circuit = real_amplitudes(num_qubits=n_qubits, reps=2)\n",
        "circuit.measure_all()\n",
        "\n",
        "# Define three sets of parameters for the circuit\n",
        "rng = np.random.default_rng(1234)\n",
        "parameter_values = [\n",
        "    rng.uniform(-np.pi, np.pi, size=circuit.num_parameters) for _ in range(3)\n",
        "]\n",
        "\n",
        "# Step 2: Optimize problem for quantum execution.\n",
        "\n",
        "pm = generate_preset_pass_manager(backend=backend, optimization_level=1)\n",
        "isa_circuit = pm.run(circuit)\n",
        "\n",
        "# Step 3: Execute using IBM Quantum primitives.\n",
        "sampler = Sampler(backend)\n",
        "job = sampler.run([(isa_circuit, parameter_values)])\n",
        "result = job.result()\n",
        "# Get results for the first (and only) PUB\n",
        "pub_result = result[0]\n",
        "# Get counts from the classical register \"meas\".\n",
        "print(\n",
        "    f\" >> First five results for the meas output register: \"\n",
        "    f\"{pub_result.data.meas.get_bitstrings()[:5]}\"\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "06bf761a-e9b7-47ca-911e-01b126090466",
      "metadata": {},
      "source": [
        "<span id=\"use-batches-and-advanced-options\" />\n",
        "\n",
        "## Utiliser les traitements par lots et les options avancées\n",
        "\n",
        "Découvrez le [mode d'exécution](/docs/guides/execution-modes) par lots et les options avancées pour optimiser les performances des circuits sur les QPU.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "536ac5b5-00cf-42bf-a114-28144008d744",
      "metadata": {
        "scrolled": true
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > The first five measurement results of job 1: ['1001001101100100001000001111101111001011010010010110110001110000000101010010001101001111000010110010101011001110110111001000100', '0100000111100101000010001110100001000011000011010000100001011000001001010111110100010000111101011100000100001110010110110001010', '1100011001000001101101000000000111001011110101110100001001000001001001100000101010010000000000110011000000011010011011100001111', '0011111111110001010010101111110111000010100001010000011101100010011011110001001000001100101000010100101010100010001001010001010', '1001111101110101010101110110011101111010011101000101110100011011110100000100100100110001001110101000000100101001001111000001010']\n"
          ]
        }
      ],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import iqp\n",
        "from qiskit.quantum_info import random_hermitian\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import Batch, SamplerV2 as Sampler\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "n_qubits = 127\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(\n",
        "    operational=True, simulator=False, min_num_qubits=n_qubits\n",
        ")\n",
        "\n",
        "rng = np.random.default_rng(1234)\n",
        "mat = np.real(random_hermitian(n_qubits, seed=rng))\n",
        "circuit = iqp(mat)\n",
        "circuit.measure_all()\n",
        "mat = np.real(random_hermitian(n_qubits, seed=rng))\n",
        "another_circuit = iqp(mat)\n",
        "another_circuit.measure_all()\n",
        "\n",
        "pm = generate_preset_pass_manager(backend=backend, optimization_level=1)\n",
        "isa_circuit = pm.run(circuit)\n",
        "another_isa_circuit = pm.run(another_circuit)\n",
        "\n",
        "# The context manager automatically closes the batch.\n",
        "with Batch(backend=backend) as batch:\n",
        "    sampler = Sampler(mode=batch)\n",
        "    job = sampler.run([isa_circuit])\n",
        "    another_job = sampler.run([another_isa_circuit])\n",
        "    result = job.result()\n",
        "    another_result = another_job.result()\n",
        "\n",
        "# first job\n",
        "\n",
        "print(\n",
        "    f\" > The first five measurement results of job 1: \"\n",
        "    f\"{result[0].data.meas.get_bitstrings()[:5]}\"\n",
        ")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "44b4c746-232b-4876-87c4-002cf6d11db7",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > The first five measurement results of job 2: ['1111111110000001000111010010010101010010111001110111001000100000010011101110101101001010001010000000000100011000010001000010000', '1110011100110100100100111001000101010011110001010110100100001110010010011100000000000100000010001001010100011110010000001011100', '1111101001010011110011011010000111000010001101100101000100000110000011001110001101100100100100100010011100001000000000100111010', '1100010101000011101000110100000101001000110110010100000000001000010110100110000111010101010010001101010010100000100111010110000', '1010100100100110011100010010100000101101101101000111000010101110010111010100001111000001100010100011110000000011101000101001100']\n"
          ]
        }
      ],
      "source": [
        "# second job\n",
        "print(\n",
        "    \" > The first five measurement results of job 2:\",\n",
        "    another_result[0].data.meas.get_bitstrings()[:5],\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d5c423e4-7586-4fdf-8452-3c62a705c955",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Etapes suivantes\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recommandations\">\n",
        "  * [Spécifiez les options d'exécution avancées](runtime-options-overview).\n",
        "  * Entraînez-vous avec les primitives en suivant la [leçon](/learning/courses/variational-algorithm-design/cost-functions) sur la fonction « Cost » dans « IBM Quantum Learning ».\n",
        "  * Découvrez comment effectuer une transpilation en local dans la section «[ Transpilation](/docs/guides/transpile/) ».\n",
        "  * Consultez le guide [sur la comparaison des paramètres du transcompilateur](/docs/guides/circuit-transpilation-settings).\n",
        "  * Comprendre [les limites des](/docs/guides/job-limits) tâches lors de l'envoi d'une tâche vers une unité de traitement de calcul (QPU) d' 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
}