{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "2d6582ed-04c1-44bb-9dd8-042d46bd8a7b",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Guida rapida per gli amministratori\"\n",
        "description: \"Come utilizzare la primitiva Executor in qiskit-ibm-runtime.\"\n",
        "\n",
        "---\n",
        "\n",
        "<span id=\"executor-quickstart\" />\n",
        "\n",
        "# Guida rapida per gli amministratori\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b91b019e-f1d9-4a7f-9c5a-68ead8bf2a6d",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "{/*\n",
        "  DO NOT EDIT THIS CELL!!!\n",
        "  This cell's content is generated automatically by a script. Anything you add\n",
        "  here will be removed next time the notebook is run. To add new content, create\n",
        "  a new cell before or after this one.\n",
        "  */}\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"Versioni del pacchetto\">\n",
        "    Il codice presente in questa pagina è stato sviluppato sulla base dei seguenti requisiti.\n",
        "    Si consiglia di utilizzare queste versioni o quelle più recenti.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.4.0\n",
        "    qiskit-ibm-runtime~=0.46.1\n",
        "    samplomatic~=0.18.0\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e82a5b3c-eed9-41fe-8940-e88838101ca3",
      "metadata": {},
      "source": [
        "Analogamente alla primitiva [Sampler](/docs/guides/get-started-with-sampler), Executor campiona i registri di uscita delle esecuzioni dei circuiti quantistici, ma non dispone di alcuna funzione integrata di soppressione o mitigazione degli errori. Fa invece parte del [modello di esecuzione guidata](/docs/guides/directed-execution-model), che fornisce gli elementi necessari per cogliere le intenzioni progettuali sul lato client e sposta la costosa generazione delle varianti dei circuiti sul lato server. L'esecutore segue le direttive fornite nelle annotazioni e nelle opzioni dei circuiti, genera e associa i valori dei parametri, esegue i circuiti associati sull'hardware e restituisce i risultati dell'esecuzione e i metadati. Non prende alcuna decisione al posto tuo e ti garantisce pieno controllo e trasparenza.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Il pacchetto Qiskit non dispone ancora di una classe base per la primitiva Executor.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"before-you-begin\" />\n",
        "\n",
        "## Prima di iniziare\n",
        "\n",
        "Alcuni degli esempi di codice presenti in questa pagina utilizzano `samplex`, che fa parte del pacchetto Samplomatic.  Pertanto, prima di eseguire quei blocchi di codice, è necessario installare Samplomatic, come illustrato nel blocco di codice seguente.  Per ulteriori informazioni, consultare la [documentazione di Samplomatic](https://qiskit.github.io/samplomatic).\n",
        "\n",
        "```python\n",
        "pip install samplomatic\n",
        "\n",
        "# For visualization support, include the visualization dependencies.\n",
        "# pip install samplomatic[vis]\n",
        "```\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9112ddbd-7101-4cac-a53f-5ecf492bc8d4",
      "metadata": {},
      "source": [
        "<span id=\"steps-to-use-the-executor-primitive\" />\n",
        "\n",
        "## Istruzioni per l'uso della primitiva Executor\n",
        "\n",
        "<span id=\"1-initialize-the-account\" />\n",
        "\n",
        "### 1. Inizializzare l'account\n",
        "\n",
        "Poiché il servizio di elaborazione IBM Quantum è un servizio gestito, è necessario innanzitutto inizializzare il proprio account. È quindi possibile selezionare la QPU che si desidera utilizzare per calcolare il valore atteso.\n",
        "\n",
        "Se non disponi ancora di un account, segui la procedura [descrit](/docs/guides/cloud-setup) ta nella guida \"Configurazione dell'account IBM Cloud® \".\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "c0b08867-a635-481e-ac4f-52359382c94d",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService, Executor\n",
        "from qiskit_ibm_runtime.quantum_program import QuantumProgram\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from samplomatic.transpiler import generate_boxing_pass_manager\n",
        "from samplomatic import build\n",
        "\n",
        "# Initialize the service and choose a backend\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(operational=True, simulator=False)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "ec105ea7-d806-4333-92af-2d7c578c67d9",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "<IBMBackend('ibm_fez')>\n"
          ]
        }
      ],
      "source": [
        "print(backend)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "89c4ffd9-acde-4b1f-8ada-fc39b7a708ed",
      "metadata": {},
      "source": [
        "<span id=\"2-create-and-transpile-a-circuit\" />\n",
        "\n",
        "### 2. Creare e compilare un circuito\n",
        "\n",
        "Per utilizzare la primitiva Executor è necessario disporre di almeno un circuito.  Può avere dei parametri facoltativi.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "7671b4dd-b031-44b7-bd4a-48dd39fb93f4",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Generate the circuit\n",
        "circuit = QuantumCircuit(2)\n",
        "circuit.h(0)\n",
        "circuit.h(1)\n",
        "circuit.cz(0, 1)\n",
        "circuit.h(1)\n",
        "\n",
        "# Using `measure_all` automatically creates the necessary\n",
        "# classical registers.\n",
        "circuit.measure_all()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "127d6de9-084e-47d5-82d6-f2197c0bd74c",
      "metadata": {},
      "source": [
        "Il circuito deve essere modificato in modo da utilizzare esclusivamente istruzioni supportate dalla QPU (circuiti denominati *\"architecture del set di istruzioni\" o ISA* ). Per farlo, usa il transpiler.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "7a98fb20-8731-43f3-a81c-fb2bc8cba9db",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Transpile the circuit\n",
        "preset_pass_manager = generate_preset_pass_manager(\n",
        "    backend=backend, optimization_level=0\n",
        ")\n",
        "isa_circuit = preset_pass_manager.run(circuit)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "172b3622-adbb-43f6-9cec-b70dc72094e0",
      "metadata": {},
      "source": [
        "<span id=\"3-initialize-a-quantumprogram\" />\n",
        "\n",
        "### 3. Inizializzare un oggetto ` `QuantumProgram` `\n",
        "\n",
        "Inizializza un `QuantumProgram` con il tuo carico di lavoro. A `QuantumProgram` è costituito da `QuantumProgramItems`. In genere, ogni elemento è costituito da un circuito, un insieme di valori dei parametri ed eventualmente un meccanismo `samplex` per randomizzare il contenuto del circuito. Per ulteriori dettagli, consultare [la sezione \"Input e output di Executor\"](/docs/guides/executor-input-output).\n",
        "\n",
        "La cella seguente inizializza una variabile `QuantumProgram` e specifica di eseguire 25 prove. Successivamente, aggiunge il circuito di destinazione transpilato.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "eb6719cf-c7f1-4265-8602-9a65071a2dd5",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Initialize an empty program\n",
        "program = QuantumProgram(shots=25)\n",
        "\n",
        "# Append the circuit to the program\n",
        "program.append_circuit_item(isa_circuit)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "da542e9b-f143-4651-ab3d-86fb54c066ab",
      "metadata": {},
      "source": [
        "<span id=\"4-optional-group-gates-and-measurements-into-annotated-boxes\" />\n",
        "\n",
        "### 4. Facoltativo: raggruppare i cancelli e le misurazioni in riquadri annotati\n",
        "\n",
        "Raggruppare le istruzioni in riquadri e annotarle è il modo principale per specificare ciò che si intende fare. Nell'esempio seguente, utilizziamo `generate_boxing_pass_manager` e i suoi parametri di rotazione per raggruppare porte a due qubit e misurazioni in riquadri e applicare l'annotazione di rotazione.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "245a4574-3ce9-4f77-98c8-af32cde8ac01",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/get-started-with-executor/extracted-outputs/245a4574-3ce9-4f77-98c8-af32cde8ac01-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Generate a boxing pass manager to group gates\n",
        "# and measurements into boxes and add\n",
        "# a`Twirl` annotation.\n",
        "boxes_pm = generate_boxing_pass_manager(\n",
        "    # Add gate twirling\n",
        "    enable_gates=True,\n",
        "    # Add measurement twirling\n",
        "    enable_measures=True,\n",
        ")\n",
        "\n",
        "boxed_circuit = boxes_pm.run(isa_circuit)\n",
        "boxed_circuit.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2b2fe4a7-2a1c-489e-9063-3084edfc2517",
      "metadata": {},
      "source": [
        "<span id=\"5-optional-build-a-template-circuit-and-samplex-and-add-them-to-the-program\" />\n",
        "\n",
        "### 5. Facoltativo: creare un circuito modello e un samplex, quindi aggiungerli al programma\n",
        "\n",
        "Successivamente, utilizza il metodo [di compilazione](https://qiskit.github.io/samplomatic/api/auto/samplomatic.build.html#samplomatic.build) Samplomatic per generare il *circuito modello* e la coppia *di samplex*. Il circuito modello è strutturalmente equivalente al circuito originale. Tuttavia, i suoi gate a singolo qubit vengono sostituiti da gate parametrizzati al fine di implementare le operazioni prescritte (in questo esempio, la rotazione dei gate e delle misurazioni). Il samplex codifica tutte le informazioni necessarie per generare parametri casuali per il circuito modello.\n",
        "\n",
        "Dopo aver generato il circuito modello e la coppia di campioni, usa il `append_samplex_item` metodo per aggiungere la coppia al programma.\n",
        "\n",
        "Per ulteriori dettagli su `samplomatic.samplex.Samplex` e sui suoi argomenti, consultare la documentazione [dell'API](https://qiskit.github.io/samplomatic/api/index.html) di Samplomatic.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "47bbeef2-2d85-4495-b740-2e64eb9066b7",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Build the template circuit and the samplex\n",
        "template_circuit, samplex = build(boxed_circuit)\n",
        "\n",
        "# Append the template circuit and samplex as a `samplex_item`\n",
        "program.append_samplex_item(\n",
        "    template_circuit,\n",
        "    samplex=samplex,\n",
        "    shape=(num_randomizations := 20,),\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3733cce7-15d5-4c04-a1cd-0bf83e94aeaf",
      "metadata": {},
      "source": [
        "<span id=\"6-invoke-executor-and-get-results\" />\n",
        "\n",
        "### 6. Eseguire Executor e ottenere i risultati\n",
        "\n",
        "Esegui il programma `QuantumProgram` su un backend IBM®, utilizzando la `Executor` funzione con le opzioni predefinite. Consulta [la sezione \"Opzioni di Executor\"](/docs/guides/executor-options) per scoprire le opzioni disponibili.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "b767050c-0299-4100-8be4-b73b0587e088",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<RuntimeJobV2('d8286580bvlc73d1vmsg', 'executor')>"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Initialize an Executor with the default options\n",
        "executor = Executor(mode=backend)\n",
        "\n",
        "# Submit the job\n",
        "job = executor.run(program)\n",
        "job"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "a341681d-0704-4800-af65-e49b7627bb36",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Retrieve the result\n",
        "result = job.result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e649245b-633d-4123-ad55-9971b9366433",
      "metadata": {},
      "source": [
        "Il risultato è di tipo [`QuantumProgramResult`](/docs/api/qiskit-ibm-runtime/results-quantum-program-result). Per ulteriori informazioni sull'oggetto risultato, consultare [la sezione \"Input e output di Executor\"](/docs/guides/executor-input-output).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a6e149b1-de4f-41bb-b972-0781f082fa45",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Passi successivi\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Suggerimenti\">\n",
        "  * Prova alcuni [esempi di Executor](/docs/guides/executor-examples).\n",
        "  * Comprendere [gli input e gli output di Executor](/docs/guides/executor-input-output).\n",
        "  * Scopri [la semantica della trasmissione Executor](/docs/guides/executor-broadcasting).\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}