{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "0be36083-7bf5-48b7-9241-7979d6853d0c",
      "metadata": {},
      "source": [
        "---\n",
        "title: Sampler examples\n",
        "description: Practical examples of using the IBM Quantum Sampler primitive.\n",
        "---\n",
        "\n",
        "# Sampler examples\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=\"Package versions\">\n",
        "    The code on this page was developed using the following requirements.\n",
        "    We recommend using these versions or newer.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.2\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": [
        "Generate entire error-mitigated quasi-probability distributions sampled from quantum circuit outputs. Leverage Sampler’s capabilities for search and classification algorithms like Grover’s and QVSM.\n",
        "\n",
        "## Run a single experiment\n",
        "\n",
        "Use Sampler to return the measurement outcome as bitstrings or counts of a single circuit.\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: ['0111010010000101000101110000000101010000100111110000110011101100001100101111100100010110000110101001100010100001111010000110000', '0010001000101011111011110111001100101010110111001101100111100000011010010000100000011101010011101010000100101001101100000110001', '0010100110101011001001010111010110111011000101110001001011111010011010001000010010010001110010000001100000100110010000110010001', '1111000001010000010111000010100111001110101000100101000001110110001110010100010100010110001000001000100001101100100001101010100', '1100111010001011001011001010111100011100110010110011110010100001011101100110111000010000011110101010110101100001011000000000000', '0010111110001001110000001110001110010001111110100111100001001011000010000111000010011000100100000001001100001110000001100000110', '0110010101111101101111001101011100111000101110101101010100101010010000010000011000000100101110001010010110101001110001010000110', '0000001111111000001101101010111011010001111101101001111110100101100001110010000111011000000010101000100000000001101110000000001', '1011001100100101111000001000100100001011001001100001001010111011001000001010100111010001001110010101110000100001000100101111001', '1111100010100111000011010101000110011011110111011000000010101000100011000001000100000101000110001000000001001011101101110011000']\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": [
        "## Run multiple experiments in a single job\n",
        "\n",
        "Use Sampler to return the measurement outcome as bitstrings or counts of multiple circuits in one job.\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: ['0000111110010100100011101001111111000010000000100001011110000101000111100110000000000110010000001001000001100000101101000000011', '1000001101000100111010110001100100100011111100001000011010100001001011001110000100100011100010010101000100001110001110000101000', '1010001100001101011000000110100001101000010101000000110010100001100010010000001000011100100101011001000001110101100000100010001', '0010010011001100001001111111001100001011010010010111011010111000010010100011011101101100110000101001001101000000001010000001000', '0000101100100011000111100010110010111000000101010101010101011010010010011011000110011010011001011110010101000111000111000100000']\n",
            " > First five results for pub 1: ['1011011001010100010010111001111100011000110010000110000000100101101111100000010000011000100011101000101101001100000000011011000', '1110000000100001100111000010110011101110110010001011100001000000000100110011010010100010000100001111001101001000001000000011000', '0100000010010100010011000011111011010011010111110111110011101100110011111010111101011000110000001111110001110111001110000000001', '1110011011010111110110111000010111101010000110001101001000100000001010001001010000001000001110000000000110001101001010000010000', '1110010111110110100100100010100110101000001000100011100101001001110011001001011101000000000000110101010000100111010100010011000']\n",
            " > First five results for pub 2: ['0011110001000000010000101101010100011011101101001111001000011011101010011010011000010001000001010101100100010000011100010000000', '1010110011100101001111110000110111110011101101100011000100001111001001101011000010100001000000100011110001101001001000101100001', '1111000011001100000101010110100010110001000000000111100111100011011101101001100110001010010000000101001000011100100001000011100', '0100101011111000010100001001001110001100001001100111011100010010000001000010100101101000001001101000110011010000001010101000000', '1101011000010000010011001111111011110111011101000011010001000000100010000110001010000101110000111101000110100000100011110110000']\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": [
        "## Run parameterized circuits\n",
        "\n",
        "Run several experiments in a single job, leveraging parameter values to increase circuit reusability.\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: ['0110001001111000110000000111110011100111100001110100111011011011001111100011011010110011111000000110111000110000001110100110111', '1110001011100111100000001110010100010110001011110100111111110111100001100010010000011111100010000100000111100010011000000010111', '0111100101110001001011010111111110111010001001100011000111001101101010001011101101000010110010000011010101001011101110010100101', '0110110010001000010010000110000010000100111111101011111000010111010101000110001010100110100010110000000010101011000011111110110', '0001010111110100001010000011010010101110000101100011001000111111000010101111110100000011010000101111110110111110011010001001101']\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": [
        "## Use batches and advanced options\n",
        "\n",
        "Explore the batch [execution mode](/docs/guides/execution-modes) and advanced options to optimize circuit performance on QPUs.\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: ['0110100010111000010001000100100011111000100001010001000110010101011000100101000111010000110001010000001001101110101101000100000', '1001100000101110011000000101010000001100110110000101100011010001000000001001001000000011110000001110000000001001000000010000010', '0110000001010111011110011100010101101010011100000100001000110100010110100101111111000000010010001110100000000000000001100001100', '0000010011100000010111010111010100100100010000110110111111010111001010111101100010000100101011000000000010101110000011010001000', '0110000101011001001001111101011001111001100101000111010000001100111001000111111100000010001001110110010100110011000000000110110']\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: ['1001111000100001101101011000000001101101100101110001010110100000100111001011011110011010101001001010100100110001010000001000001', '1000111101000111011110110000000100010100011111110110001001101000001111111010001101010010111010000101101000001110100000110010001', '0101001101000011011000010101100101011110010010011000111100000000010010010010000001100000001001001000000010011110100011111100100', '0010110010110011100011001010100100011100001010001100110100000000111100111000000100011101111011011000101001000010100010101111000', '0011110001100010010111010010100110110010011000010000100100100000111011000011001001110100000110001010101000011000110001001101100']\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": [
        "## Next steps\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recommendations\">\n",
        "  * [Specify advanced runtime options](runtime-options-overview).\n",
        "  * Practice with primitives by working through the [Cost function lesson](/learning/courses/variational-algorithm-design/cost-functions) in IBM Quantum Learning.\n",
        "  * Learn how to transpile locally in the [Transpile](/docs/guides/transpile/) section.\n",
        "  * Try the [Compare transpiler settings](/docs/guides/circuit-transpilation-settings) guide.\n",
        "  * Understand the [Job limits](/docs/guides/job-limits) when sending a job to an IBM® QPU.\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
}