{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "dde95705",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Gestione delle prestazioni - Una funzione Qiskit di Q-CTRL Fire Opal\"\n",
        "description: \"Applicare la soppressione automatica degli errori utilizzando Fire Opal Performance Management di 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",
        "# Gestione delle prestazioni: una funzione Qiskit di Q-CTRL Fire Opal\n",
        "\n",
        "*Consulta la [documentazione dell'API](/docs/api/functions/q-ctrl-performance-management)*\n",
        "\n",
        "<Admonition type=\"note\" title=\"Nota\">\n",
        "  Le funzioni Qiskit sono una funzione sperimentale disponibile solo per gli utenti di IBM Quantum® Premium Plan, Flex Plan e On-Prem (tramite IBM Quantum Platform API) Plan. Sono in stato di anteprima e sono soggetti a modifiche.\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=\"Versioni del pacchetto\">\n",
        "    Il codice presente in questa pagina è stato sviluppato utilizzando i seguenti requisiti.\n",
        "    Si consiglia di utilizzare queste versioni o versioni più recenti.\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",
        "## Panoramica\n",
        "\n",
        "Fire Opal Performance Management rende semplice per chiunque ottenere risultati significativi dai computer quantistici su scala, senza dover essere esperti di hardware quantistico. Quando si eseguono circuiti con Fire Opal Performance Management, le tecniche di soppressione degli errori guidate dall'intelligenza artificiale vengono applicate automaticamente, consentendo di scalare problemi più grandi con un numero maggiore di porte e qubit. Questo approccio riduce il numero di scatti necessari per ottenere la risposta corretta, senza alcun costo aggiuntivo, con un notevole risparmio in termini di tempo di calcolo e di costi.\n",
        "\n",
        "La gestione delle prestazioni elimina gli errori e aumenta la probabilità di ottenere la risposta corretta su hardware rumoroso. In altre parole, aumenta il rapporto segnale/rumore. L'immagine seguente mostra come la maggiore precisione consentita dal Performance Management possa ridurre la necessità di ulteriori scatti nel caso di un algoritmo di Trasformata di Fourier Quantistica a 10 qubit. Con soli 30 scatti, Q-CTRL raggiunge la soglia di confidenza del 99%, mentre il default (`QiskitRuntime` Sampler, `optimization_level`=3 e `resilience_level`=1, `ibm_sherbrooke`) richiede 170.000 scatti. Ottenendo più rapidamente la risposta giusta, si risparmia un tempo di esecuzione significativo.\n",
        "\n",
        "![Visualizzazione del tempo di esecuzione migliorato](https://quantum.cloud.ibm.com/docs/images/guides/qctrl-performance-management/achieve_more.svg)\n",
        "\n",
        "La funzione Performance Management può essere utilizzata con qualsiasi algoritmo ed è possibile impiegarla facilmente al posto delle [primitive standard di IBM Quantum.](/docs/guides/primitives) Dietro le quinte, diverse tecniche di soppressione degli errori operano in sinergia per impedire che si verifichino errori durante l'esecuzione. Tutti i metodi di pipeline di Fire Opal sono preconfigurati e indipendenti dall'algoritmo, il che significa che si ottengono sempre le migliori prestazioni fin da subito.\n",
        "\n",
        "Per accedere alla Gestione delle prestazioni, [contattate 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",
        "## Descrizione\n",
        "\n",
        "Fire Opal Performance Management offre due opzioni di esecuzione simili alle primitive di “ IBM Quantum ”, consentendo di sostituire facilmente il campionatore e lo stimatore di Q-CTRL. Il flusso di lavoro generale per l'utilizzo della funzione \"Gestione delle prestazioni\" è il seguente:\n",
        "\n",
        "1. Definire il circuito (e gli operatori nel caso dell'Estimatore).\n",
        "2. Eseguire il circuito.\n",
        "3. Recuperare i risultati.\n",
        "\n",
        "Per ridurre il rumore dell'hardware, Fire Opal impiega una serie di tecniche di soppressione degli errori guidate dall'intelligenza artificiale, illustrate nell'immagine seguente. Con Fire Opal, l'intera pipeline è completamente automatizzata e non richiede alcuna configurazione.\n",
        "\n",
        "La pipeline di Fire Opal elimina la necessità di ulteriori spese generali, come l'aumento del tempo di esecuzione quantistica o l'aggiunta di qubit fisici. Si noti che il tempo di elaborazione classica rimane un fattore (per le stime si rimanda alla sezione [Benchmark](#benchmarks), dove \"Tempo totale\" riflette sia l'elaborazione classica che quella quantistica). A differenza della mitigazione degli errori, che richiede un overhead sotto forma di campionamento, la soppressione degli errori di Fire Opal agisce sia a livello di gate che di impulsi per affrontare le varie fonti di rumore e prevenire la probabilità che si verifichi un errore. Prevenendo gli errori, si elimina la necessità di una costosa post-elaborazione.\n",
        "\n",
        "L'immagine seguente illustra i metodi di soppressione degli errori automatizzati da Fire Opal Performance Management.\n",
        "\n",
        "![Visualizzazione della pipeline di soppressione degli errori](https://quantum.cloud.ibm.com/docs/images/guides/qctrl-performance-management/error_suppression.svg)\n",
        "\n",
        "La funzione offre due primitive, Sampler ed Estimator, e gli input e gli output di entrambe estendono le specifiche implementate per [le primitive IBM Quantum V2](/docs/guides/primitive-input-output#pubs).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "64534d1a",
      "metadata": {},
      "source": [
        "<span id=\"benchmarks\" />\n",
        "\n",
        "## Benchmark\n",
        "\n",
        "I risultati [dei benchmark algoritmici pubblicati](https://journals.aps.org/prapplied/abstract/10.1103/PhysRevApplied.20.024034) dimostrano un significativo miglioramento delle prestazioni di vari algoritmi, tra cui Bernstein-Vazirani, la trasformata di Fourier quantistica, la ricerca di Grover, l'algoritmo di ottimizzazione approssimativo quantistico e l'eigensolver variazionale quantistico. Il resto di questa sezione fornisce maggiori dettagli sui tipi di algoritmi che è possibile eseguire, nonché sulle prestazioni e sui tempi di esecuzione previsti.\n",
        "\n",
        "I seguenti studi indipendenti dimostrano come la gestione delle prestazioni di Q-CTRL consenta la ricerca algoritmica su scala record:\n",
        "\n",
        "* [Kernel quantistici parametrati ad alta efficienza energetica per la diagnosi dei guasti dei servizi di rete](https://arxiv.org/abs/2405.09724v1) - apprendimento di kernel quantistici fino a 50-qubit\n",
        "* [Stima della differenza di fase quantistica basata su tensori per dimostrazioni su larga scala](https://arxiv.org/abs/2408.04946) - stima della fase quantistica fino a 33-qubit\n",
        "* [Apprendimento gerarchico per il ML quantistico: una nuova tecnica di addestramento per circuiti quantistici variazionali su larga scala](https://arxiv.org/abs/2311.12929) - fino al caricamento di dati quantistici a 21-qubit\n",
        "\n",
        "La tabella seguente fornisce una guida approssimativa sull'accuratezza e sui tempi di esecuzione di precedenti analisi comparative su `ibm_fez`. Le prestazioni su altri dispositivi possono variare. Il tempo di utilizzo si basa su un'ipotesi di 10.000 colpi per circuito. Il \"Numero di qubit\" indicato non è un limite rigido, ma rappresenta una soglia approssimativa in cui ci si può aspettare una precisione di soluzione estremamente costante. Sono stati risolti con successo problemi di dimensioni maggiori e si incoraggia la sperimentazione oltre questi limiti.\n",
        "\n",
        "| Esempio                                                             | Numero di qubit | Accuratezza | Misura della precisione                                                                                              | Tempo totale             | Utilizzo del tempo di esecuzione (s) | Primitivo (modalità) |\n",
        "| ------------------------------------------------------------------- | --------------- | ----------- | -------------------------------------------------------------------------------------------------------------------- | ------------------------ | ------------------------------------ | -------------------- |\n",
        "| Bernstein-Vazirani                                                  | 50Q             | 100%        | Tasso di successo (percentuale di esecuzioni in cui la risposta corretta è la stringa di bit con conteggio più alto) | 10                       | 8                                    | Campionatore         |\n",
        "| Trasformata quantistica di Fourier                                  | 30Q             | 100%        | Tasso di successo (percentuale di esecuzioni in cui la risposta corretta è la stringa di bit con conteggio più alto) | 10                       | 8                                    | Campionatore         |\n",
        "| Stima quantistica della fase                                        | 30Q             | 99.9998%    | Precisione dell'angolo trovato: `1- abs(real_angle - angle_found)/pi`                                                | 10                       | 8                                    | Campionatore         |\n",
        "| Simulazione quantistica: Modello di Ising (15 passi)                | 20Q             | 99.775%     | $A$ (definito di seguito)                                                                                            | 60 (per passo)           | 15 (per passo)                       | Stimatore            |\n",
        "| Simulazione quantistica 2: dinamica molecolare (20 punti temporali) | 34Q             | 96.78%      | $A_{mean}$ (definito di seguito)                                                                                     | 10 (per punto temporale) | 6 (per punto temporale)              | Stimatore            |\n",
        "\n",
        "Definizione dell'accuratezza della misurazione di un valore di aspettativa - la metrica $A$ è definita come segue:\n",
        "\n",
        "$$\n",
        "A = 1 - \\frac{|\\epsilon^{ideal} - \\epsilon^{meas}|}{\\epsilon^{ideal}_{max} - \\epsilon^{ideal}_{min}},\n",
        "$$\n",
        "\n",
        "dove $\\epsilon^{ideal}$ = valore di aspettativa ideale, $\\epsilon^{meas}$ = valore di aspettativa misurato, $\\epsilon^{ideal}_{max} $ = valore massimo ideale e $\\epsilon^{ideal}_{min}$ = valore minimo ideale. $A_{mean}$ è semplicemente la media del valore di $A$ su più misurazioni.\n",
        "\n",
        "Questa metrica viene utilizzata perché è invariante rispetto agli spostamenti globali e alla scalatura nell'intervallo dei valori raggiungibili. In altre parole, indipendentemente dal fatto che si sposti la gamma dei possibili valori di aspettativa più in alto o più in basso o che si aumenti lo spread, il valore di $A$ dovrebbe rimanere costante.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "870af0fe",
      "metadata": {},
      "source": [
        "<span id=\"get-started\" />\n",
        "\n",
        "## Introduzione\n",
        "\n",
        "Fire Opal Performance Management utilizza Qiskit v`2.0.0`, che è la versione consigliata. Le versioni supportate sono Qiskit >=v`2.0.0`.\n",
        "Autenticati utilizzando la tua [chiave API IBM Quantum Platform](http://quantum.cloud.ibm.com/) e seleziona la funzione Qiskit come segue. (Questo frammento di codice presuppone che tu abbia già [salvato il tuo account](/docs/guides/functions-get-started#install-qiskit-functions-catalog-client) nell'ambiente locale.)\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=\"Questa funzione supporta tutti i backend di IBM?\">\n",
        "  Se desideri utilizzare un backend che questa funzione non supporta al momento, [contatta Q-CTRL](https://form.typeform.com/to/iuujEAEI?typeform-source=q-ctrl.com) per richiedere l'aggiunta del supporto.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2947b5c3",
      "metadata": {},
      "source": [
        "<span id=\"estimator-primitive\" />\n",
        "\n",
        "## Primitiva di stima\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "df2788d5",
      "metadata": {},
      "source": [
        "<span id=\"estimator-example\" />\n",
        "\n",
        "### Esempio di stimatore\n",
        "\n",
        "Utilizzare la primitiva Estimator di Fire Opal Performance Management per determinare il valore atteso di una singola coppia circuito-osservabile.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "82932760",
      "metadata": {},
      "source": [
        "Oltre ai pacchetti `qiskit-ibm-catalog` e `qiskit` , per eseguire questo esempio si utilizzerà anche il pacchetto `numpy` . È possibile installare questo pacchetto decommentando la seguente cella se si esegue questo esempio in un notebook che utilizza il kernel 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. Creare il circuito**\n",
        "\n",
        "A titolo di esempio, generare un operatore Hermitiano casuale e un osservabile da inserire nella funzione Performance Management.\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. Eseguire il circuito**\n",
        "\n",
        "Eseguire il circuito e definire facoltativamente il backend e il numero di colpi.\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": [
        "È possibile utilizzare le note [API di `Qiskit Serverless`](/docs/guides/serverless) per verificare lo stato del carico di lavoro della funzione Qiskit:\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. Recuperare il risultato**\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": [
        "I risultati hanno lo stesso formato dei [risultati](/docs/guides/estimator-input-output) di 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",
        "## Primitiva campionatore\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b1300f06",
      "metadata": {},
      "source": [
        "<span id=\"sampler-example\" />\n",
        "\n",
        "### Esempio di campionatore\n",
        "\n",
        "Utilizzate la primitiva Sampler di Fire Opal Performance Management per eseguire un circuito Bernstein-Vazirani. Questo algoritmo, utilizzato per trovare una stringa nascosta dalle uscite di una funzione black box, è un comune algoritmo di benchmarking perché esiste una sola risposta corretta.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "144e48f3",
      "metadata": {},
      "source": [
        "**1. Creare il circuito**\n",
        "\n",
        "Definire la risposta corretta all'algoritmo, alla stringa di bit nascosta e al circuito Bernstein-Vazirani. È possibile regolare l'ampiezza del circuito cambiando semplicemente `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. Eseguire il circuito**\n",
        "\n",
        "Eseguire il circuito e definire facoltativamente il backend e il numero di colpi.\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": [
        "Per verificare [lo stato](/docs/guides/functions-get-started#check-job-status) del carico di lavoro della funzione Qiskit o per ottenere [i risultati, procedere](/docs/guides/functions-get-started#retrieve-results) come segue:\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. Recuperare il risultato**\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. Tracciare le migliori stringhe di bit**\n",
        "\n",
        "Tracciare la stringa di bit con i conteggi più alti per vedere se la stringa di bit nascosta era la modalità.\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 bitstring nascosta è evidenziata in viola e dovrebbe essere la bitstring con il maggior numero di conteggi.\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",
        "## Log di modifica\n",
        "\n",
        "* 2026-02-20: Avviso di obsolescenza - il campo `provider_job_ids` metadata sarà deprecato tra 30 giorni nella versione 0.13.0 Gli utenti possono accedere all'ID del processo tramite `job_id()` il metodo del servizio runtime.\n",
        "* 11/02/2026: Ora supportiamo `ibm_miami`e abbiamo aggiunto i metadati di esecuzione al `PubResult`.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bb33258d",
      "metadata": {},
      "source": [
        "<span id=\"get-support\" />\n",
        "\n",
        "## Ottenere supporto\n",
        "\n",
        "Per qualsiasi domanda o problema, [contattare Q-CTRL](https://form.typeform.com/to/iuujEAEI).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2fe4a6ea",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Passi successivi\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Suggerimenti\">\n",
        "  * Richiedi l'accesso a [Q-CTRL Performance Management](/functions?id=q-ctrl-performance-management).\n",
        "  * Consulta la documentazione [di riferimento dell'API](/docs/api/functions/q-ctrl-performance-management) relativa a questa funzione di Qiskit.\n",
        "  * Prova il [modello di Ising a campo trasversale con](/docs/tutorials/transverse-field-ising-model) il tutorial sulla gestione delle prestazioni di Q-CTRL.\n",
        "  * Prova la [stima della fase quantistica con](/docs/tutorials/quantum-phase-estimation-qctrl) il tutorial \" Qiskit Functions \" di Q-CTRL\n",
        "  * Recensione [Mundada P. S., et al. (2023). Benchmarking sperimentale di un flusso di lavoro automatizzato deterministico per la soppressione degli errori negli algoritmi quantistici. Physical Review Applied, 20, 2](https://quantum-journal.org/papers/q-2023-07-25-1067/).\n",
        "  * Recensione [Kanno, S., et al. (2025). Stima della differenza di fase quantistica basata su tensori per dimostrazioni su larga scala. arXiv preprint arXiv:2408.04946](https://arxiv.org/abs/2408.04946).\n",
        "  * Recensione [SoftBank Corp, Esperimento dimostrativo di un sistema di diagnosi dei guasti dei servizi di comunicazione che utilizza il Quantum Machine Learning (blog), 30 agosto 2024](https://www.softbank.jp/en/corp/technology/research/topics/102/).\n",
        "  * Recensione [Yamauchi, H., et al. (2024). Kernel quantistici parametrizzati ed efficienti dal punto di vista energetico per la diagnosi dei guasti dei servizi di rete. arXiv preprint arXiv:2405.09724v1](https://arxiv.org/abs/2405.09724v1).\n",
        "  * Recensione [Yamauchi, H., et al. (2025). Spettroscopia quantistica delle dinamiche topologiche tramite un hamiltoniano supersimmetrico. arXiv preprint arXiv:2511.23169v1](https://arxiv.org/abs/2511.23169v1).\n",
        "  * Recensione [Wang, Y., et al. (2025).  Δ-Motif: Isomorfismo dei sottografi su larga scala tramite parallelismo incentrato sui dati. arXiv preprint arXiv:2508.21287](https://arxiv.org/abs/2508.21287).\n",
        "  * Recensione [Paterakis, N. G., et al. (2025).  Il quantum computing nel panorama computazionale dell'elettronica di potenza: visione e realtà. arXiv preprint arXiv:2507.02577](https://arxiv.org/abs/2507.02577).\n",
        "  * Recensione [Gharibyan, H., et al. (2023).  Apprendimento gerarchico per il Quantum ML: nuova tecnica di addestramento per circuiti quantistici variazionali su larga scala. arXiv preprint arXiv:2311.12929](https://arxiv.org/abs/2311.12929).\n",
        "  * Esamina [il caso di studio relativo alla Mitsubishi Chemical Corp](https://q-ctrl.com/case-study/unlocking-new-performance-capability-in-quantum-chemistry).\n",
        "  * Esamina [il caso di studio della banca Redacted](https://q-ctrl.com/case-study/reducing-quantum-compute-costs-2-500x-with-fire-opal).\n",
        "  * Esamina [il caso di studio dell' BlueQubit](https://q-ctrl.com/case-study/enabling-data-loading-for-quantum-machine-learning-with-fire-opal).\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
}