{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "f560a2bd-78d2-45fd-8f1b-9f0a4c5e178d",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Introduzione alle primitive\"\n",
        "description: \"Introduzione alle primitive in Qiskit e descrizione delle primitive disponibili\"\n",
        "---\n",
        "\n",
        "<span id=\"introduction-to-primitives\" />\n",
        "\n",
        "# Introduzione alle primitive\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7bfc257f-69c5-4fb1-8042-b62efa8cf64e",
      "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 di questa pagina è stato sviluppato in base ai seguenti requisiti.\n",
        "    Si consiglia di utilizzare queste versioni o versioni più recenti.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.3.0\n",
        "    qiskit-ibm-runtime~=0.43.1\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3ac7f2c2-1541-49f1-9f8f-4c0a8e3a149a",
      "metadata": {},
      "source": [
        "<span id=\"qpu-access-patterns\" />\n",
        "\n",
        "<span id=\"why-did-qiskit-introduce-primitives\" />\n",
        "\n",
        "## Perché Qiskit ha introdotto le primitive?\n",
        "\n",
        "Analogamente agli albori dei computer classici, quando gli sviluppatori dovevano manipolare direttamente i registri della CPU, le prime interfacce delle QPU restituivano semplicemente i dati grezzi dell'elettronica di controllo.\n",
        "Questo non era un grosso problema quando le QPU vivevano nei laboratori e permettevano l'accesso diretto solo ai ricercatori.\n",
        "Riconoscendo che la maggior parte degli sviluppatori non avrebbe e non dovrebbe avere familiarità con la distillazione di tali dati grezzi in 0s e 1s, Qiskit ha introdotto `backend.run`, una prima astrazione per accedere alle QPU nel cloud. Questo ha permesso agli sviluppatori di operare su un formato di dati familiare e di concentrarsi sul quadro generale.\n",
        "\n",
        "Con la diffusione dell'accesso alle QPU e con lo sviluppo di un maggior numero di algoritmi quantistici, è emersa nuovamente la necessità di un'astrazione di livello superiore. In risposta, Qiskit ha introdotto l'interfaccia primitives, ottimizzata per due compiti fondamentali nello sviluppo di algoritmi quantistici: la stima del valore di aspettativa (`Estimator`) e il campionamento dei circuiti (`Sampler`). L'obiettivo è ancora una volta di aiutare gli sviluppatori a concentrarsi maggiormente sull'innovazione e meno sulla conversione dei dati. L'interfaccia delle primitive sostituisce l'interfaccia `backend.run` , poiché `Sampler` fornisce lo stesso accesso diretto all'hardware offerto da `backend.run`.\n",
        "\n",
        "<span id=\"what-is-a-primitive\" />\n",
        "\n",
        "## Che cos'è un primitivo?\n",
        "\n",
        "I sistemi informatici sono costruiti su più livelli di astrazione. Le astrazioni consentono di concentrarsi su un un particolare livello di dettaglio, rilevante per il compito che si sta svolgendo. Più ci si avvicina all'hardware, più basso è il livello di astrazione necessario (ad esempio, è necessario spostare o manipolare i dati a livello di istruzioni della CPU). Più complesso è il compito che si vuole eseguire, più le astrazioni saranno di livello superiore (ad esempio, si potrebbe usare una libreria di programmazione per eseguire calcoli algebrici) calcoli algebrici).\n",
        "\n",
        "In questo contesto, una *primitiva* è la più piccola istruzione di elaborazione, il più semplice blocco di costruzione da cui si può creare qualcosa di utile per un determinato livello di astrazione da cui si può creare qualcosa di utile per un determinato livello di astrazione.\n",
        "\n",
        "I recenti progressi dell'informatica quantistica hanno aumentato la necessità di lavorare a livelli di astrazione più elevati.\n",
        "Man mano che il campo si sposta verso unità di elaborazione quantistica (QPU) più grandi e flussi di lavoro più complessi, l'attenzione si sposta dall'interazione con i singoli segnali dei qubit alla visione dei dispositivi quantistici come sistemi che eseguono i compiti necessari segnali dei singoli qubit alla visione dei dispositivi quantistici come sistemi che eseguono i compiti necessari.\n",
        "\n",
        "I due compiti più comuni dei computer quantistici sono il campionamento degli stati quantistici e il calcolo dei valori di aspettativa.\n",
        "Questi compiti hanno motivato la progettazione di Qiskit primitives : **Estimatore** e **Campionatore**.\n",
        "\n",
        "* Lo stimatore calcola i valori di aspettativa delle osservabili rispetto agli stati preparati dai circuiti quantistici.\n",
        "* Il campionatore campiona il registro di uscita dell'esecuzione del circuito quantistico.\n",
        "\n",
        "In breve, il modello computazionale introdotto da Qiskit primitives avvicina la programmazione quantistica a quella classica, dove l'attenzione si concentra meno sui dettagli hardware e più sui risultati alla programmazione classica, dove l'attenzione si concentra meno sui dettagli dell'hardware e più sui risultati che si vogliono ottenere risultati che si vogliono ottenere.\n",
        "\n",
        "<span id=\"primitive-definition-and-implementations\" />\n",
        "\n",
        "## Definizione primitiva e implementazioni\n",
        "\n",
        "Esistono due tipi di Qiskit primitives : le classi base e le loro implementazioni. Le primitive Estimator e Sampler sono definite da classi base primitive open source presenti nel pacchetto \" Qiskit SDK \" (nel modulo [`qiskit.primitives`](/docs/api/qiskit/primitives) ). I fornitori (come il servizio Compute di IBM Quantum ) possono utilizzare queste classi di base per derivare le proprie implementazioni di Sampler ed Estimator.  La maggior parte degli utenti interagirà con le implementazioni dei provider, non con le primitive di base.\n",
        "\n",
        "<span id=\"base-classes\" />\n",
        "\n",
        "### Classi base\n",
        "\n",
        "Le `Base` primitive sono classi astratte che definiscono un'interfaccia comune per l'implementazione delle primitive. Tutte le altre classi del [`qiskit.primitives`](/docs/api/qiskit/primitives) modulo derivano da queste classi di base. Gli sviluppatori dovrebbero ricorrere a queste funzionalità qualora fossero interessati a creare un proprio modello di esecuzione basato su primitive per un fornitore specifico. Queste classi potrebbero rivelarsi utili anche per chi desidera eseguire elaborazioni altamente personalizzate e ritiene che le implementazioni delle primitive esistenti siano troppo semplici per le proprie esigenze. Gli utenti generici non utilizzeranno direttamente le classi di base.\n",
        "\n",
        "[`BaseEstimatorV1`](/docs/api/qiskit/qiskit.primitives.BaseEstimatorV1) e [`BaseSamplerV1`](/docs/api/qiskit/qiskit.primitives.BaseSamplerV1) - Sebbene le primitive di V1 siano ancora utilizzabili, queste guide si concentrano sulle primitive di V2 poiché sono le più recenti e quelle più comunemente utilizzate.\n",
        "\n",
        "[`BaseEstimatorV2`](/docs/api/qiskit/qiskit.primitives.BaseEstimatorV2) e [`BaseSamplerV2`](/docs/api/qiskit/qiskit.primitives.BaseSamplerV2) - Le primitive di riferimento di Qiskit seguono queste specifiche di interfaccia.\n",
        "\n",
        "<span id=\"implementations\" />\n",
        "\n",
        "<span id=\"implementations\" />\n",
        "\n",
        "### Implementazioni\n",
        "\n",
        "Tutte le classi primitive derivano dalle classi base; pertanto, presentano la stessa struttura generale e lo stesso utilizzo.  Ad esempio, il formato dei dati in ingresso è lo stesso per tutte le primitive di Estimator.  Tuttavia, esistono differenze nelle implementazioni che le rendono uniche.\n",
        "\n",
        "Si tratta di implementazioni delle classi base delle primitive:\n",
        "\n",
        "* [IBM Quantum primitive](/docs/guides/qiskit-runtime-primitives)[`SamplerV2`](/docs/api/qiskit-ibm-runtime/sampler-v2), e [`EstimatorV2`](/docs/api/qiskit-ibm-runtime/estimator-v2) offrono un'implementazione più sofisticata (ad esempio, includendo la mitigazione degli errori) sotto forma di servizio basato sul cloud. Questa implementazione delle primitive di base viene utilizzata per accedere all'hardware dell IBM Quantum®.\n",
        "\n",
        "* [`StatevectorEstimator`](/docs/api/qiskit/qiskit.primitives.StatevectorEstimator) e [`StatevectorSampler`](/docs/api/qiskit/qiskit.primitives.StatevectorSampler#statevectorsampler) - Implementazioni di riferimento delle primitive che utilizzano il simulatore integrato in Qiskit. Sono realizzati con il modulo [`quantum_info`](/docs/api/qiskit/quantum_info#quantum-information) Qiskit e producono risultati basati su simulazioni con vettori di stato ideali.  Si accede a essi tramite Qiskit. Per ulteriori dettagli sull'utilizzo, consultare la sezione \" [Simulazione esatta con primitive Qiskit SDK ](/docs/guides/simulate-with-qiskit-sdk-primitives)\".\n",
        "\n",
        "* [`BackendEstimatorV2`](/docs/api/qiskit/qiskit.primitives.BackendEstimatorV2) e [`BackendSamplerV2`](/docs/api/qiskit/qiskit.primitives.BackendSamplerV2) - È possibile utilizzare queste classi per \"incapsulare\" qualsiasi risorsa di calcolo quantistico in una primitiva. Questo ti permette di scrivere codice in stile primitivo per i provider che non dispongono ancora di un'interfaccia basata sui primitivi. Queste classi possono essere utilizzate esattamente come le normali Sampler ed Estimator, con la differenza che devono essere inizializzate con un argomento `backend` aggiuntivo per selezionare il computer quantistico su cui eseguire l'operazione. Si accede a essi tramite Qiskit. Per ulteriori informazioni, consulta la guida [alle primitive di backend](/docs/guides/get-started-with-backend-primitives).\n",
        "\n",
        "<span id=\"options\" />\n",
        "\n",
        "## Opzioni\n",
        "\n",
        "È possibile passare delle opzioni alle primitive per personalizzarle in base alle proprie esigenze. Sebbene l'interfaccia del metodo `run()` delle primitive sia comune a tutte le implementazioni, le relative opzioni non lo sono. Consulta la documentazione dell'API relativa a una specifica implementazione di una primitiva per scoprire quali opzioni supporta.\n",
        "\n",
        "Ad esempio, consultare le sezioni dedicate alle [opzioni di](/docs/guides/estimator-options) Estimator e [alle opzioni di Sampler](/docs/guides/sampler-options) per conoscere le opzioni relative alle primitive di IBM Quantum, oppure consultare i [riferimenti all'API di Qiskit Aer](https://qiskit.github.io/qiskit-aer/apidocs/aer_primitives.html) per le opzioni relative alle primitive di Qiskit Aer.\n",
        "\n",
        "<span id=\"benefits-of-qiskit-primitives\" />\n",
        "\n",
        "## Vantaggi dell' Qiskit primitives\n",
        "\n",
        "Grazie alle primitive, gli utenti di Qiskit possono scrivere codice quantistico per una specifica QPU senza dover\n",
        "gestire esplicitamente ogni singolo dettaglio. Inoltre, grazie a questo ulteriore livello di astrazione, potresti riuscire ad accedere più facilmente\n",
        "alle funzionalità hardware avanzate di un determinato provider. Ad esempio, con le primitive IBM Quantum,\n",
        "è possibile sfruttare i più recenti progressi in materia di mitigazione e soppressione degli errori attivando o disattivando opzioni quali la, della primitiva [`resilience_level`](/docs/api/qiskit-ibm-runtime/options-estimator-options#resilience_level), anziché sviluppare una propria implementazione di tali tecniche.\n",
        "\n",
        "Per i fornitori di hardware, implementare le primitive in modo nativo significa fornire agli utenti un modo più \"out-of-the-box\" di accedere alle funzioni dell'hardware, come le tecniche avanzate di post-processing modo di accedere alle funzioni dell'hardware, come le tecniche avanzate di post-elaborazione. È quindi più facile per i vostri utenti beneficiare delle migliori capacità del vostro hardware.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "02dbbc7d-76e7-4a89-8739-ba7f3a5a05b8",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Passi successivi\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Suggerimenti\">\n",
        "  * Comprendere le operazioni [di input e output di base](/docs/guides/primitive-input-output).\n",
        "  * Esamina [gli esempi](/docs/guides/simulate-with-qiskit-sdk-primitives) dettagliati.\n",
        "  * Esercitati con le primitive seguendo la [lezione sulla funzione di costo](/learning/courses/variational-algorithm-design/cost-functions) in IBM Quantum Learning.\n",
        "  * Consulta la guida [\"Creare un provider\"](/docs/guides/create-a-provider) per scoprire come implementare le tue primitive Sampler ed Estimator.\n",
        "  * Consulta la [documentazione dell'API](/docs/api/qiskit/primitives).\n",
        "  * Leggete [Migrazione alle primitive di V2](/docs/guides/v2-primitives).\n",
        "  * Scopri le [primitive IBM Quantum](/docs/guides/qiskit-runtime-primitives), utilizzate per eseguire circuiti sulle QPU 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
}