{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "fbce2fd6-c79e-4e90-9074-6cde8a09b517",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Parametri comunemente utilizzati per la transpilazione\"\n",
        "description: \"Panoramica dei parametri comunemente utilizzati per controllare la trasposizione dei circuiti quantistici in Qiskit.\"\n",
        "---\n",
        "\n",
        "<span id=\"commonly-used-parameters-for-transpilation\" />\n",
        "\n",
        "# Parametri comunemente utilizzati per la transpilazione\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6beea7ff-7407-47be-a0b7-1e7981328df5",
      "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",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "05fb8adb-3b36-4449-b669-108d2d749ca5",
      "metadata": {},
      "source": [
        "Questa pagina descrive alcuni dei parametri più comunemente utilizzati per la transpilazione locale. Questi parametri sono configurati utilizzando gli argomenti di [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) o [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile).\n",
        "\n",
        "<span id=\"approx-degree\" />\n",
        "\n",
        "<span id=\"approximation-degree\" />\n",
        "\n",
        "## Grado di approssimazione\n",
        "\n",
        "È possibile utilizzare il grado di approssimazione per specificare quanto si desidera che il circuito risultante corrisponda al circuito desiderato (di ingresso).  Si tratta di un valore fluttuante nell'intervallo ( 0.0 - 1.0 ), dove 0.0 rappresenta la massima approssimazione e 1.0 (valore predefinito) non rappresenta alcuna approssimazione. I valori più piccoli scambiano l'accuratezza dell'uscita con la facilità di esecuzione (cioè con un numero inferiore di porte).  Il valore predefinito è 1.0.\n",
        "\n",
        "Nella sintesi unitaria a due equbit (utilizzata nelle fasi iniziali di tutti i livelli e per la fase di ottimizzazione con il livello di ottimizzazione 3), questo valore specifica la fedeltà target della decomposizione in uscita. Ovvero, quanto errore viene introdotto quando la rappresentazione matriciale di un circuito viene convertita in porte discrete. Se il grado di approssimazione è un valore più basso (maggiore approssimazione), il circuito di uscita dalla sintesi differirà maggiormente dalla matrice di ingresso, ma probabilmente avrà anche meno porte (perché qualsiasi operazione arbitraria a due qubit può essere decomposta perfettamente con al massimo tre porte CX) ed è più facile da eseguire.\n",
        "\n",
        "Quando il grado di approssimazione è inferiore a 1.0, si possono sintetizzare circuiti con una o due porte CX, che comportano un errore minore dall'hardware, ma maggiore dall'approssimazione. Poiché CX è il gate più costoso in termini di errore, potrebbe essere vantaggioso diminuirne il numero a scapito della fedeltà della sintesi (questa tecnica è stata utilizzata per aumentare il volume quantistico sui dispositivi IBM® ): [Validating quantum computers using randomized model circuits](https://arxiv.org/abs/1811.12926) ).\n",
        "\n",
        "A titolo di esempio, generiamo un `UnitaryGate` casuale a due qubit che verrà sintetizzato nella fase iniziale. Impostando `approximation_degree` a meno di 1.0 si potrebbe generare un circuito approssimativo. Dobbiamo anche specificare `basis_gates` per far sapere al metodo di sintesi quali porte può utilizzare per la sintesi approssimativa.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "e660bec2-f806-4050-955b-53a50289158e",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "2\n"
          ]
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit, QuantumRegister\n",
        "from qiskit.circuit.library import UnitaryGate\n",
        "from qiskit.quantum_info import random_unitary\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "UU = random_unitary(4, seed=12345)\n",
        "rand_U = UnitaryGate(UU)\n",
        "\n",
        "qubits = QuantumRegister(2, name=\"q\")\n",
        "qc = QuantumCircuit(qubits)\n",
        "qc.append(rand_U, qubits)\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1,\n",
        "    approximation_degree=0.85,\n",
        "    basis_gates=[\"sx\", \"rz\", \"cx\"],\n",
        ")\n",
        "approx_qc = pass_manager.run(qc)\n",
        "print(approx_qc.count_ops()[\"cx\"])"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6f067d6e-0157-43fc-8cb2-c86855b6bdac",
      "metadata": {},
      "source": [
        "In questo modo si ottiene un risultato di `2` perché l'approssimazione richiede un numero inferiore di porte CX.\n",
        "\n",
        "<span id=\"seed\" />\n",
        "\n",
        "<span id=\"random-number-generator-seed\" />\n",
        "\n",
        "## Seme del generatore di numeri casuali\n",
        "\n",
        "Alcune parti del transpiler sono stocastiche, quindi ripetute esecuzioni del transpiler possono dare risultati diversi. Per ottenere un risultato riproducibile, è possibile impostare il seme del generatore di numeri pseudorandom utilizzando l'argomento `seed_transpiler` . Esecuzioni ripetute con lo stesso seme daranno gli stessi risultati.\n",
        "\n",
        "Esempio:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "dbc652e8-53a4-47a9-a66e-d9c1e5ef07c9",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/dbc652e8-53a4-47a9-a66e-d9c1e5ef07c9-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, seed_transpiler=11, basis_gates=[\"sx\", \"rz\", \"cx\"]\n",
        ")\n",
        "optimized_1 = pass_manager.run(qc)\n",
        "optimized_1.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "20b95efa-8aa8-41ac-a037-dac2a3336879",
      "metadata": {},
      "source": [
        "<span id=\"init-layout\" />\n",
        "\n",
        "<span id=\"initial-layout\" />\n",
        "\n",
        "## Layout iniziale\n",
        "\n",
        "Prima della transpilazione, i qubit contenuti nel circuito sono qubit virtuali che non corrispondono necessariamente a qubit fisici sul backend di destinazione. È possibile specificare la mappatura iniziale dei qubit virtuali sui qubit fisici utilizzando l'argomento `initial_layout` . Si noti che la disposizione finale dei qubit può differire da quella iniziale perché il transpiler può permutare i qubit utilizzando porte di scambio o altri mezzi.\n",
        "\n",
        "Nell'esempio seguente, si costruisce un layout iniziale per il backend [`FakeSherbrooke`](/docs/api/qiskit-ibm-runtime/fake-provider-fake-sherbrooke#fakesherbrooke) creando un oggetto [`Layout`](/docs/api/qiskit/qiskit.transpiler.Layout) oggetto. Il nostro layout mappa il primo qubit del nostro circuito al qubit 5 di Sherbrooke e mappa il secondo qubit del nostro circuito al qubit 6 di Sherbrooke. Si noti che i qubit fisici sono sempre rappresentati da numeri interi.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  In questi esempi viene utilizzato il backend `FakeSherbrooke``qiskit_ibm_runtime` fittizio di, ma è possibile provarlo su qualsiasi backend reale o fittizio compatibile con Qiskit.  I tuoi risultati potrebbero essere diversi.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "e18c034c-eb26-4d9d-81d7-37e0eafa17c7",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/e18c034c-eb26-4d9d-81d7-37e0eafa17c7-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_ibm_runtime.fake_provider import FakeSherbrooke\n",
        "from qiskit.transpiler import Layout\n",
        "\n",
        "backend = FakeSherbrooke()\n",
        "\n",
        "a, b = qubits\n",
        "initial_layout = Layout({a: 5, b: 6})\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, backend=backend, initial_layout=initial_layout\n",
        ")\n",
        "transpiled_circ = pass_manager.run(qc)\n",
        "\n",
        "transpiled_circ.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "261055f3-cb88-4651-9a98-31891a4db535",
      "metadata": {},
      "source": [
        "Oltre a specificare un oggetto Layout, è possibile passare un elenco di numeri interi, dove il $i$ -esimo elemento dell'elenco contiene il qubit fisico a cui deve essere mappato il $i$ -esimo qubit. Ad esempio:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "a7800d8a-7354-48e4-a55f-f902ae28c875",
      "metadata": {
        "scrolled": true
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/a7800d8a-7354-48e4-a55f-f902ae28c875-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "initial_layout = [5, 6]\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, backend=backend, initial_layout=initial_layout\n",
        ")\n",
        "transpiled_circ = pass_manager.run(qc)\n",
        "\n",
        "transpiled_circ.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d2034dd5-23e5-4473-89b8-aaf4233775c7",
      "metadata": {},
      "source": [
        "È possibile utilizzare la funzione [`plot_error_map`](/docs/api/qiskit/qiskit.visualization.plot_error_map) per generare un diagramma del grafico del dispositivo con le informazioni sugli errori e con l'etichetta dei qubit fisici. È possibile visualizzare diagrammi simili anche nella pagina delle [risorse di calcolo](/computers).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "8df57c6a-1ff4-4d58-9b7e-4378452c3025",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/8df57c6a-1ff4-4d58-9b7e-4378452c3025-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.visualization import plot_error_map\n",
        "\n",
        "plot_error_map(backend, figsize=(30, 24))"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "25c05cca-b93b-4ba1-b46c-7280ec4ef8cb",
      "metadata": {},
      "source": [
        "<span id=\"xx-method\" />\n",
        "\n",
        "<span id=\"transpiler-stage-and-plugin-options\" />\n",
        "\n",
        "## Opzioni della fase di transpilazione e dei plugin\n",
        "\n",
        "Queste opzioni hanno il suffisso `_method`. Influenzano il funzionamento del transpiler e vengono utilizzati per cercare di ottenere un risultato migliore, diverso o specifico dal transpiler.\n",
        "\n",
        "* `init_method` (str) - Il plugin da usare per la fase di inizializzazione.\n",
        "\n",
        "* `layout_method` (str) - Il passaggio di selezione del layout (`trivial`, `dense`, `sabre`). Può anche essere il nome del plugin esterno da usare per la fase di layout.\n",
        "\n",
        "* `optimization_method` (str) - Il plugin da usare per la fase di ottimizzazione.\n",
        "\n",
        "* `routing_method` (str) - Nome del passaggio di instradamento (`basic`, `lookahead`, `default`, `sabre`, `none`). Può anche essere il nome del plugin esterno da usare per la fase di instradamento.\n",
        "\n",
        "* `scheduling_method` (str) - Nome del passaggio di pianificazione. Questo può anche essere il nome del plugin esterno da utilizzare per la fase di pianificazione.\n",
        "  * `as_soon_as_possible`: Programmare le istruzioni con avidità: il prima possibile su una risorsa di qubit (alias: `asap`).\n",
        "  * `as_late_as_possible`: Programmare le istruzioni in ritardo.  Ovvero, mantenere i qubit nello stato ground quando possibile (alias: `alap`).\n",
        "\n",
        "* `translation_method` (str) - Nome del passaggio di traduzione (`unroller`, `translator`, `synthesis`). Può anche essere il nome del plugin esterno da usare per la fase di traduzione.\n",
        "\n",
        "* `unitary_synthesis_method` (str) - Il nome del metodo di sintesi unitaria da utilizzare. Per impostazione predefinita viene utilizzato `default` .\n",
        "\n",
        "<Admonition>\n",
        "  Per vedere un elenco di tutti i plugin installati per un determinato stadio, eseguire [`list_stage_plugins(\"stage_name\")`](/docs/api/qiskit/transpiler_plugins). Per esempio, se si vuole vedere un elenco di tutti i plugin installati per lo stadio di routing, eseguire `list_stage_plugins(routing)`.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Passi successivi\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Suggerimento\">\n",
        "  * Rivedere l'argomento [Opzioni predefinite e impostazioni di configurazione](defaults-and-configuration-options).\n",
        "  * Scopri come [impostare il livello di ottimizzazione](set-optimization).\n",
        "  * Prova la guida [Confronta le impostazioni del transpiler](/docs/guides/circuit-transpilation-settings).\n",
        "  * Consulta [la documentazione dell'API del transpiler](/docs/api/qiskit/transpiler).\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
}