{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "c08a245a-82c1-4c6f-b1e1-d0a27f093b7a",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Modalità di test locale\"\n",
        "description: \"Utilizza la modalità di test locale per simulare l'hardware quantistico con Compute dell' IBM Quantum\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore superop */}\n",
        "\n",
        "<span id=\"test-locally\" />\n",
        "\n",
        "<span id=\"local-testing-mode\" />\n",
        "\n",
        "# Modalità di test locale\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "14778d9c-4e0e-4b84-8575-90e4efab25a2",
      "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.5.1\n",
        "    qiskit-ibm-runtime~=0.47.0\n",
        "    qiskit-aer~=0.17\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "435ec827-a348-4b70-b1ef-582849c0a76a",
      "metadata": {},
      "source": [
        "Utilizzate la modalità di test locale (disponibile con `qiskit-ibm-runtime` v0.22.0 o successivo) per testare i programmi prima di metterli a punto e inviarli all'hardware quantistico reale.  Dopo aver utilizzato la modalità di test locale per verificare il programma, è sufficiente cambiare il nome del backend per eseguirlo su una QPU.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  La primitiva Executor non supporta la modalità di test locale.\n",
        "</Admonition>\n",
        "\n",
        "Per utilizzare la modalità di test locale, specificare uno dei backend fittizi disponibili all'indirizzo `qiskit_ibm_runtime.fake_provider` oppure specificare un backend Qiskit Aer al momento dell'istanziazione di una primitiva IBM Quantum o di una sessione.\n",
        "\n",
        "* **Falsi backend** : I [falsi backend](/docs/api/qiskit-ibm-runtime/fake-provider) di `qiskit_ibm_runtime.fake_provider` imitano i comportamenti delle QPU di IBM® utilizzando gli snapshot delle QPU. Gli snapshot della QPU contengono informazioni importanti sulla QPU, come la mappa di accoppiamento, le porte di base e le proprietà dei qubit, utili per testare il transpiler ed eseguire simulazioni rumorose della QPU. Il modello di rumore dell'istantanea viene applicato automaticamente durante la simulazione.\n",
        "* **Simulatore Aer** : I simulatori di [Qiskit Aer](/docs/guides/simulate-with-qiskit-aer) offrono una simulazione più performante, in grado di gestire circuiti più grandi e [modelli di rumore personalizzati](/docs/guides/build-noise-models). Quando si utilizza `AerSimulator` in modalità di test locale, è disponibile un elenco di opzioni del metodo di simulazione. Vedere l' [esempio della modalità di simulazione Clifford](#clifford-sim), che dimostra come simulare in modo efficiente i circuiti Clifford con un gran numero di qubit.\n",
        "\n",
        "  <Accordion>\n",
        "    <AccordionItem title=\"**Elenco dei metodi di simulazione disponibili in Qiskit Aer**\">\n",
        "      Per ulteriori informazioni, consultare la [`AerSimulator`](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.AerSimulator) per ulteriori informazioni.\n",
        "\n",
        "      * `\"automatic\"`: Metodo di simulazione predefinito. Selezionare automaticamente il metodo di simulazione, in base al modello di circuito e di rumore.\n",
        "\n",
        "      * `\"statevector\"`: Una simulazione densa di vettori di stato che può campionare i risultati delle misure di circuiti *ideali* con tutte le misure alla fine del circuito. Per le simulazioni rumorose, ogni colpo campiona un circuito rumoroso casuale dal modello di rumore.\n",
        "\n",
        "      * `\"density_matrix\"`: Una simulazione a matrice di densità in grado di campionare i risultati di misura di circuiti *rumorosi* con tutte le misure alla fine del circuito.\n",
        "\n",
        "      * `\"stabilizer\"`: Un efficiente simulatore di stato Clifford stabilizzatore che può simulare circuiti Clifford rumorosi se tutti gli errori nel modello di rumore sono anche errori Clifford.\n",
        "\n",
        "      * `\"extended_stabilizer\"`: Un simulatore approssimativo per circuiti Clifford + T basato sulla scomposizione dello stato in uno stato stabilizzatore classificato. Il numero di termini cresce con il numero di porte non-Clifford (T).\n",
        "\n",
        "      * `\"matrix_product_state\"`: Un simulatore di stato-vettore a rete tensoriale che utilizza una rappresentazione di stato a prodotto matriciale (MPS) per lo stato. Questo può essere fatto con o senza troncare le dimensioni del legame MPS, a seconda delle opzioni del simulatore. Il comportamento predefinito è nessun troncamento.\n",
        "\n",
        "      * `\"unitary\"`: Simulazione di una matrice unitaria densa di un circuito ideale. Questo simula la matrice unitaria del circuito stesso, piuttosto che l'evoluzione di uno stato quantistico iniziale. Questo metodo è in grado di simulare solo i gate; non supporta la misura, il reset o il rumore.\n",
        "\n",
        "      * `\"superop\"`: Simulazione di una matrice di superoperatori densi di un circuito ideale o rumoroso. In questo modo si simula la matrice di superoperatori del circuito stesso, piuttosto che l'evoluzione di uno stato quantistico iniziale. Questo metodo può simulare gate e reset ideali e rumorosi, ma non supporta le misure.\n",
        "\n",
        "      * `\"tensor_network\"`: Una simulazione basata su reti tensoriali che supporta sia il vettore di stato che la matrice di densità. Attualmente questo è disponibile solo per le GPU ed è accelerato dall'uso delle API di cuQuantum `cuTensorNet` .\n",
        "    </AccordionItem>\n",
        "  </Accordion>\n",
        "\n",
        "<Admonition type=\"note\" title=\"Note\">\n",
        "  - È possibile specificare tutte le opzioni di Compute di IBM Quantum in modalità di test locale.  Tuttavia, quando si esegue il programma su un simulatore locale, tutte le opzioni, ad eccezione degli \"shots\", vengono ignorate.\n",
        "  - Si consiglia di installare Qiskit Aer prima di utilizzare backend falsi o simulatori Aer eseguendo `pip install qiskit-aer`. I falsi backend utilizzano i simulatori Aer sotto copertura, se disponibili, per sfruttare le loro prestazioni.\n",
        "</Admonition>\n",
        "\n",
        "{/* If you currently use the Qiskit SDK, you can use the existing Qiskit Aer primitives for local testing.  See [exact and noisy simulation with Qiskit Aer primitives](/docs/guides/simulate-with-qiskit-aer) for details. */}\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "366b1216-fb2f-4d06-afd8-fe374ab6ed9a",
      "metadata": {},
      "source": [
        "<span id=\"fake-backends-example\" />\n",
        "\n",
        "## Esempio di backend falsi\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "efda5007-260a-49c0-ab6f-eac91fdbdf84",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import SamplerV2 as Sampler\n",
        "from qiskit_ibm_runtime.fake_provider import FakeManilaV2\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "# Run the Sampler job locally using FakeManilaV2\n",
        "fake_manila = FakeManilaV2()\n",
        "pm = generate_preset_pass_manager(backend=fake_manila, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "\n",
        "# You can use a fixed seed to get fixed results.\n",
        "options = {\"simulator\": {\"seed_simulator\": 42}}\n",
        "sampler = Sampler(mode=fake_manila, options=options)\n",
        "\n",
        "result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b51e77c0-31c9-4dfa-950c-0a9ea9247aac",
      "metadata": {},
      "source": [
        "<span id=\"aersimulator-examples\" />\n",
        "\n",
        "## AerSimulator esempi\n",
        "\n",
        "Esempio con sessioni, senza rumore:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "63407a34-0c70-400a-bc34-f85ccd581c4d",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_aer import AerSimulator\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import Session, SamplerV2 as Sampler\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "# Run the Sampler job locally using AerSimulator.\n",
        "# Session syntax is supported but ignored because local mode doesn't support sessions.\n",
        "aer_sim = AerSimulator()\n",
        "pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "with Session(backend=aer_sim) as session:\n",
        "    sampler = Sampler(mode=session)\n",
        "    result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6a511de6-dc37-4ac4-87f8-bee90e3014a3",
      "metadata": {},
      "source": [
        "Per simulare con il rumore, specificare una QPU (hardware quantistico) e sottoporla ad Aer.  Aer costruisce un modello di rumore basato sui dati di calibrazione di quella QPU e istanzia un backend Aer con quel modello.  Se si preferisce, si può [costruire un modello di rumore](/docs/guides/build-noise-models).\n",
        "\n",
        "<Admonition type=\"caution\">\n",
        "  Una QPU può essere influenzata da diversi tipi di rumore. Il modello di rumore di Qiskit Aer utilizzato qui simula solo alcuni di essi e quindi è probabile che il rumore sia meno grave di quello di una QPU reale.\n",
        "\n",
        "  Per i dettagli su quali errori vengono inclusi quando si inizializza un modello di rumore da una QPU, si veda il riferimento all'API di Aer [`NoiseModel`](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.noise.NoiseModel.html#qiskit_aer.noise.NoiseModel.from_backend) API.\n",
        "</Admonition>\n",
        "\n",
        "Esempio con rumore:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "0878eec8-9959-4e98-aff7-bf114352b838",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_aer import AerSimulator\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import SamplerV2 as Sampler, QiskitRuntimeService\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Specify a QPU to use for the noise model\n",
        "real_backend = service.backend(\"ibm_fez\")\n",
        "aer = AerSimulator.from_backend(real_backend)\n",
        "\n",
        "# Run the Sampler job locally using AerSimulator.\n",
        "pm = generate_preset_pass_manager(backend=aer, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "sampler = Sampler(mode=aer)\n",
        "result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2a2815a4-19f9-4ebd-8e53-4e29bea4a8db",
      "metadata": {},
      "source": [
        "<span id=\"clifford-sim\" />\n",
        "\n",
        "<span id=\"clifford-simulation\" />\n",
        "\n",
        "### Simulazione Clifford\n",
        "\n",
        "Poiché i circuiti Clifford possono essere simulati in modo efficiente con risultati verificabili, la simulazione Clifford è uno strumento molto utile. Per un esempio approfondito, vedere [Simulazione efficiente di circuiti stabilizzatori con le primitive Aer di Qiskit](/docs/guides/simulate-stabilizer-circuits).\n",
        "\n",
        "Esempio:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "b9d0fdac-ba2e-4c4e-8c49-c924fb8b5c43",
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import efficient_su2\n",
        "from qiskit_ibm_runtime import SamplerV2 as Sampler\n",
        "\n",
        "n_qubits = 500  # <---- note this uses 500 qubits!\n",
        "circuit = efficient_su2(n_qubits)\n",
        "circuit.measure_all()\n",
        "\n",
        "rng = np.random.default_rng(1234)\n",
        "params = rng.choice(\n",
        "    [0, np.pi / 2, np.pi, 3 * np.pi / 2],\n",
        "    size=circuit.num_parameters,\n",
        ")\n",
        "\n",
        "# Tell Aer to use the stabilizer (Clifford) simulation method\n",
        "aer_sim = AerSimulator(method=\"stabilizer\")\n",
        "\n",
        "pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "sampler = Sampler(mode=aer_sim)\n",
        "result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ee461e4d-ee50-4430-9e83-c3b49cd7a1ef",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Passi successivi\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Suggerimenti\">\n",
        "  * Utilizza il [`Neat` classe](/docs/guides/debug-qiskit-runtime-jobs) per analizzare l'impatto del rumore su un carico di lavoro di Estimator.\n",
        "  * Esamina [gli esempi](/docs/guides/sampler-examples) dettagliati del Sampler.\n",
        "  * Esamina [gli esempi](/docs/guides/estimator-examples) dettagliati di Estimator.\n",
        "  * Esercitati con le primitive seguendo la [lezione sulla funzione di costo](/learning/courses/variational-algorithm-design/cost-functions) in IBM Quantum Learning.\n",
        "  * Per sapere come effettuare la trasposizione locale, consultare la sezione [Trasposizione](/docs/guides/transpile).\n",
        "  * Prova il tutorial [Confronta le impostazioni del transpiler](/docs/guides/circuit-transpilation-settings#compare-transpiler-settings).\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
}