{
  "cells": [
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "7dc25056-2c3c-435a-a827-1930f8bb768f",
      "metadata": {
        "gloss": {
          "ansatz": {
            "text": "Combination of a reference operator and a variational form, to describe the search space that we're exploring.",
            "title": "Ansatz"
          },
          "variational": {
            "text": "Layers of parameterized gates that are repeated a certain number of times, and the parameters of the gates are optimized during the algorithm to minimize the cost function.",
            "title": "Variational form"
          }
        }
      },
      "source": [
        "---\n",
        "title: \"approcci e forme variazionali\"\n",
        "description: \"Questa lezione spiega cos'è un ansatz e in cosa differisce dallo stato di riferimento. Vengono forniti esempi di ansaetze.\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore ZZII IZZI ZIIZ IZIZ IIZZ ansä */}\n",
        "\n",
        "<span id=\"ansaetze-and-variational-forms\" />\n",
        "\n",
        "# Ansaetze e forme variazionali\n",
        "\n",
        "Alla base di tutti gli algoritmi variazionali c'è l'idea chiave di analizzare le differenze tra gli stati, che sono convenientemente correlati attraverso una qualche mappatura ben educata (ad esempio, continua, differenziabile) da un insieme di parametri o variabili - da cui il nome.\n",
        "\n",
        "In primo luogo, esploreremo come costruire circuiti parametrizzati a mano. Utilizzeremo questi circuiti per definire un <DefinitionTooltip definition=\"Strati di porte parametrizzate che vengono ripetute un certo numero di volte; i parametri delle porte vengono ottimizzati durante l'algoritmo per minimizzare la funzione di costo.\">forma variazionale</DefinitionTooltip> che rappresenta un insieme di stati parametrati da esplorare con il nostro algoritmo variazionale. Quindi, costruiremo il nostro <DefinitionTooltip definition=\"Combinazione di un operatore di riferimento e di una forma variazionale, per descrivere lo spazio di ricerca che stiamo esplorando.\">ansatz</DefinitionTooltip> applicando questa forma variazionale al nostro stato di riferimento.\n",
        "\n",
        "Esploreremo anche il modo in cui si può trovare un compromesso tra velocità e accuratezza durante l'esplorazione di questo spazio di ricerca.\n",
        "\n",
        "![Un diagramma che mostra i componenti chiave della discussione sugli ansatz, compresi gli ansaetze euristici e gli ansaetze specifici per il problema.](https://quantum.cloud.ibm.com/learning/images/courses/variational-algorithm-design/ansaetze-and-variational-forms/ansatz-workflow.svg)\n",
        "\n"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "5ebac8e8-6451-46e5-8a01-099f84296a17",
      "metadata": {},
      "source": [
        "<span id=\"parameterized-quantum-circuits\" />\n",
        "\n",
        "## Circuiti quantistici parametrizzati\n",
        "\n",
        "Gli algoritmi variazionali operano esplorando e confrontando una serie di stati quantistici $|\\psi(\\vec{\\theta})\\rangle$, che dipendono da un insieme finito di parametri $k$ $\\vec{\\theta} = (\\theta^0, \\ldots, \\theta^{k-1})$. Questi stati possono essere preparati utilizzando un circuito quantistico parametrizzato, in cui le porte sono definite con parametri sintonizzabili. È possibile creare questo circuito parametrizzato senza vincolare angoli specifici:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "4c564fab-ed65-4949-b27f-658b0f1ed621",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/courses/variational-algorithm-design/ansaetze-and-variational-forms/extracted-outputs/4c564fab-ed65-4949-b27f-658b0f1ed621-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit import QuantumCircuit, Parameter\n",
        "\n",
        "theta = Parameter(\"θ\")\n",
        "\n",
        "qc = QuantumCircuit(3)\n",
        "qc.rx(theta, 0)\n",
        "qc.cx(0, 1)\n",
        "qc.x(2)\n",
        "\n",
        "qc.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "4096d161-2916-472b-8abc-d4a6b78955cf",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/courses/variational-algorithm-design/ansaetze-and-variational-forms/extracted-outputs/4096d161-2916-472b-8abc-d4a6b78955cf-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/courses/variational-algorithm-design/ansaetze-and-variational-forms/extracted-outputs/4096d161-2916-472b-8abc-d4a6b78955cf-1.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "from math import pi\n",
        "\n",
        "angle_list = [pi / 3, pi / 2]\n",
        "circuits = [qc.assign_parameters({theta: angle}) for angle in angle_list]\n",
        "\n",
        "for circuit in circuits:\n",
        "    display(circuit.draw(\"mpl\"))"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "f01221c4-f7ee-496a-a664-4b3abc0748c2",
      "metadata": {},
      "source": [
        "<span id=\"variational-form-and-ansatz\" />\n",
        "\n",
        "## Forma variazionale e Ansatz\n",
        "\n",
        "Per ottimizzare iterativamente da uno stato di riferimento $|\\rho\\rangle$ a uno stato obiettivo $|\\psi(\\vec\\theta)\\rangle$, dobbiamo definire una forma variazionale $U_V(\\vec{\\theta})$ che rappresenti un insieme di stati parametrizzati che il nostro algoritmo variazionale può esplorare:\n",
        "\n",
        "$$\n",
        "\\begin{aligned}\n",
        "|0\\rangle \\xrightarrow{U_R} U_R|0\\rangle\n",
        "\n",
        "& = |\\rho\\rangle \\xrightarrow{U_V(\\vec{\\theta})} U_A(\\vec{\\theta})|0\\rangle \\\\[1mm]\n",
        "\n",
        "& = U_V(\\vec{\\theta})U_R|0\\rangle \\\\[1mm]\n",
        "\n",
        "& = U_V(\\vec{\\theta})|\\rho\\rangle \\\\[1mm]\n",
        "\n",
        "& = |\\psi(\\vec{\\theta})\\rangle \\\\[1mm]\n",
        "\n",
        "\\end{aligned}\n",
        "$$\n",
        "\n",
        "Si noti che lo stato parametrizzato dipende sia dallo stato di riferimento $|\\rho\\rangle$, che non dipende da alcun parametro, sia dalla forma variazionale $U_V(\\vec{\\theta})$, che dipende sempre da parametri. Ci riferiamo alla combinazione di queste due metà come ad un ansatz: $U_A(\\vec\\theta) := U_V(\\vec\\theta)U_R$.\n",
        "\n",
        "Mentre costruiamo il nostro ansatz per rappresentare una collezione di stati parametrizzati da esplorare con il nostro algoritmo variazionale, ci rendiamo conto di un problema importante: la dimensionalità. Un sistema $n$ -qubit (cioè uno spazio di Hilbert) ha un numero enorme di stati quantici distinti nello spazio di configurazione. Avremmo bisogno di un numero ingombrante di parametri per esplorarlo completamente. Quantitativamente, la sua dimensionalità è $D = 2^{2n}$. Come se non bastasse, la complessità del tempo di esecuzione degli algoritmi di ricerca e di altri algoritmi cresce esponenzialmente con questa dimensionalità, un fenomeno spesso indicato in letteratura come maledizione della dimensionalità.\n",
        "\n",
        "Per ovviare a questo inconveniente, è prassi comune imporre alcuni vincoli ragionevoli sulla forma variazionale, in modo da esplorare solo gli stati più rilevanti. La ricerca di un'ansatz troncata efficiente è un'area di ricerca attiva, ma noi ci occuperemo di due modelli comuni.\n",
        "\n"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "6d6caf9e-4eb0-4ae1-b9be-6fcfacd23b39",
      "metadata": {},
      "source": [
        "<span id=\"heuristic-ansaetze-and-trade-offs\" />\n",
        "\n",
        "## Approcci euristici e compromessi\n",
        "\n",
        "Se non si dispone di informazioni sul problema specifico che possano aiutare a limitare la dimensionalità, si può provare una famiglia arbitraria di circuiti parametrizzati con meno di $2^{2n}$ parametri. Tuttavia, ci sono alcuni compromessi da considerare:\n",
        "\n",
        "* **Velocità** : riducendo lo spazio di ricerca, l'algoritmo può funzionare più velocemente.\n",
        "* **Accuratezza** : La riduzione dello spazio potrebbe rischiare di escludere la soluzione effettiva del problema, portando a soluzioni non ottimali.\n",
        "* **Rumore** : I circuiti più profondi sono influenzati dal rumore, quindi dobbiamo sperimentare la connettività, le porte e la fedeltà delle porte del nostro ansatz.\n",
        "\n",
        "Esiste un compromesso fondamentale tra qualità (o addirittura risolvibilità) e velocità: maggiore è il numero di parametri, maggiore è la probabilità di trovare un risultato preciso, ma maggiore sarà il tempo necessario per eseguire l'algoritmo.\n",
        "\n"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "136b5311-f52b-47a0-a7d2-3f1255b0270e",
      "metadata": {},
      "source": [
        "<span id=\"n-local-circuits\" />\n",
        "\n",
        "### Circuiti N-locali\n",
        "\n",
        "Uno degli esempi più utilizzati di ansaetze euristiche è quello dei [circuiti N-locali](/docs/api/qiskit/qiskit.circuit.library.NLocal), per alcune ragioni:\n",
        "\n",
        "* **Implementazione efficiente** : L'ansatz N-locale è tipicamente composto da semplici porte locali che possono essere implementate in modo efficiente su un computer quantistico, utilizzando un piccolo numero di qubit fisici. In questo modo è più facile costruire e ottimizzare i circuiti quantistici.\n",
        "* **Cattura correlazioni importanti** : L'ansatz N-locale può catturare importanti correlazioni tra i qubit di un sistema quantistico, anche con un numero ridotto di porte. Questo perché le porte locali possono agire su qubit vicini e creare entanglement tra di loro, il che può essere importante per simulare sistemi quantistici complessi.\n",
        "\n",
        "Questi circuiti sono costituiti da strati di rotazione e di entanglement che si ripetono alternativamente una o più volte come segue:\n",
        "\n",
        "* Ogni strato è formato da porte di dimensione massima $N$, dove $N$ deve essere inferiore al numero di qubit.\n",
        "* Per uno strato di rotazione, le porte sono impilate l'una sull'altra. Possiamo usare le operazioni di rotazione standard, come [`RX`](/docs/api/qiskit/qiskit.circuit.library.RXGate) o [`CRZ`](/docs/api/qiskit/qiskit.circuit.library.CRZGate).\n",
        "* Per un livello di entanglement, si possono usare porte come [`Toffoli` gates](/docs/api/qiskit/qiskit.circuit.library.CCXGate) o [`CX`](/docs/api/qiskit/qiskit.circuit.library.CXGate) con una strategia di entanglement.\n",
        "* Entrambi i tipi di livelli possono essere parametrizzati o meno, ma almeno uno di essi deve contenere dei parametri. Altrimenti, senza almeno un parametro, non ci sarebbero variazioni!\n",
        "* In alternativa, all'estremità del circuito viene aggiunto un ulteriore strato di rotazione.\n",
        "\n",
        "Ad esempio, creiamo un circuito a cinque qubit [`NLocal`](/docs/api/qiskit/qiskit.circuit.library.NLocal) con blocchi di rotazione formati da [`RX`](/docs/api/qiskit/qiskit.circuit.library.RXGate) e [`CRZ`](/docs/api/qiskit/qiskit.circuit.library.CRZGate) blocchi di rotazione, blocchi di entanglement formati da [`Toffoli` porte](/docs/api/qiskit/qiskit.circuit.library.CCXGate) che agiscono sui qubit $[0,1,2]$, $[0,2,3]$, $[4,2,1]$ e $[3,1,0]$ e $2$ ripetizioni di ogni strato.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "c28d7b53-fbd7-42f5-a619-5a6b0b44e9fc",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/courses/variational-algorithm-design/ansaetze-and-variational-forms/extracted-outputs/c28d7b53-fbd7-42f5-a619-5a6b0b44e9fc-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit.library import NLocal, CCXGate, CRZGate, RXGate\n",
        "from qiskit.circuit import Parameter\n",
        "\n",
        "theta = Parameter(\"θ\")\n",
        "ansatz = NLocal(\n",
        "    num_qubits=5,\n",
        "    rotation_blocks=[RXGate(theta), CRZGate(theta)],\n",
        "    entanglement_blocks=CCXGate(),\n",
        "    entanglement=[[0, 1, 2], [0, 2, 3], [4, 2, 1], [3, 1, 0]],\n",
        "    reps=2,\n",
        "    insert_barriers=True,\n",
        ")\n",
        "ansatz.decompose().draw(\"mpl\")"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "d293b8cc-1512-4a65-a3f7-94a979d1736b",
      "metadata": {},
      "source": [
        "Nell'esempio precedente, il gate più grande è il gate di Toffoli, che agisce su tre qubit, rendendo il circuito $3$ -locale. I circuiti $N$ locali più comunemente utilizzati sono i circuiti [$2$ locali con porte di rotazione a singolo qubit e porte di entanglement a](/docs/api/qiskit/qiskit.circuit.library.TwoLocal) $2$ qubit.\n",
        "\n",
        "Creiamo un circuito $2$ -locale utilizzando la classe Qiskit [`TwoLocal`](/docs/api/qiskit/qiskit.circuit.library.TwoLocal) qiskit. La sintassi è la stessa di `NLocal`, ma ci sono alcune differenze. Ad esempio, la maggior parte dei gate, come `RX`, `RZ`, e `CNOT`, possono essere passati come stringhe senza importare i gate o creare un'istanza di `Parameter` .\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "c48521ee-db12-449e-af9f-7d8ec0fa7890",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/courses/variational-algorithm-design/ansaetze-and-variational-forms/extracted-outputs/c48521ee-db12-449e-af9f-7d8ec0fa7890-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit.library import TwoLocal\n",
        "\n",
        "ansatz = TwoLocal(\n",
        "    num_qubits=5,\n",
        "    rotation_blocks=[\"rx\", \"rz\"],\n",
        "    entanglement_blocks=\"cx\",\n",
        "    entanglement=\"linear\",\n",
        "    reps=2,\n",
        "    insert_barriers=True,\n",
        ")\n",
        "ansatz.decompose().draw(\"mpl\")"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "a6e80571-9bb4-4e33-9581-2c48cad1a566",
      "metadata": {},
      "source": [
        "In questo caso, abbiamo utilizzato la distribuzione lineare dell'entanglement, in cui ogni qubit è entangled con il successivo. Per conoscere altre strategie, fare riferimento a [`TwoLocal` documentazione](/docs/api/qiskit/qiskit.circuit.library.TwoLocal).\n",
        "\n"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "65d39e58-e54b-4ea3-95bf-ee68d9b89832",
      "metadata": {},
      "source": [
        "<span id=\"efficient-su2\" />\n",
        "\n",
        "### SU2 efficiente\n",
        "\n",
        "[`efficient_su2`](/docs/api/qiskit/qiskit.circuit.library.EfficientSU2) è un circuito efficiente dal punto di vista hardware che consiste in strati di operazioni a singolo qubit che abbracciano SU(2) e `CX` entanglements. Si tratta di un modello euristico che può essere utilizzato per preparare funzioni d'onda di prova per algoritmi quantistici variazionali o come circuito di classificazione per l'apprendimento automatico.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "5abc6f15-d7f5-466a-9659-78a11a2c5270",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/courses/variational-algorithm-design/ansaetze-and-variational-forms/extracted-outputs/5abc6f15-d7f5-466a-9659-78a11a2c5270-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit.library import efficient_su2\n",
        "\n",
        "ansatz = efficient_su2(4, su2_gates=[\"rx\", \"y\"], entanglement=\"linear\", reps=1)\n",
        "ansatz.decompose().draw(\"mpl\")"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "14d01a25-2e2a-47e5-9c50-910599c59502",
      "metadata": {},
      "source": [
        "<span id=\"problem-specific-ansaetze\" />\n",
        "\n",
        "## Approcci specifici al problema\n",
        "\n",
        "Mentre le soluzioni euristiche e quelle efficienti dal punto di vista dell'hardware ci aiutano a risolvere un problema in modo ingenuo, possiamo utilizzare le conoscenze specifiche del problema per limitare lo spazio di ricerca dei circuiti a un tipo specifico. Questo ci aiuterà a guadagnare velocità senza perdere precisione nel processo di ricerca.\n",
        "\n"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "ae376a5f-004c-44af-a6ba-4e4419e350c3",
      "metadata": {},
      "source": [
        "<span id=\"optimization\" />\n",
        "\n",
        "### Ottimizzazione\n",
        "\n",
        "In un problema di max-cut, si vuole suddividere i nodi di un grafo in modo da massimizzare il numero di bordi tra nodi di gruppi diversi. La partizione max-cut desiderata per il grafo sottostante è chiara: il nodo 0 a sinistra deve essere separato dal resto dei nodi a destra da un taglio.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "ef9a5e1d-f70a-4f59-9112-2d8f71b253ba",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/courses/variational-algorithm-design/ansaetze-and-variational-forms/extracted-outputs/ef9a5e1d-f70a-4f59-9112-2d8f71b253ba-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "import rustworkx as rx\n",
        "from rustworkx.visualization import mpl_draw\n",
        "\n",
        "n = 4\n",
        "G = rx.PyGraph()\n",
        "G.add_nodes_from(range(n))\n",
        "# The edge syntax is (start, end, weight)\n",
        "edges = [(0, 1, 1.0), (0, 2, 1.0), (0, 3, 1.0), (1, 2, 1.0), (2, 3, 1.0)]\n",
        "G.add_edges_from(edges)\n",
        "\n",
        "mpl_draw(\n",
        "    G, pos=rx.shell_layout(G), with_labels=True, edge_labels=str, node_color=\"#1192E8\"\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "65d72527-77b1-4eb4-93e5-762a5f55b838",
      "metadata": {},
      "source": [
        "Per utilizzare l'algoritmo QAOA per un problema di max-cut, è necessario un Hamiltoniano di Pauli che codifichi il costo in modo tale che il valore minimo di aspettativa dell'operatore corrisponda al numero massimo di bordi tra i nodi di due gruppi diversi.\n",
        "\n",
        "Per questo semplice esempio, l'operatore è una combinazione lineare di termini con operatori Z su nodi collegati da un bordo (ricordiamo che il qubit 0 è il più lontano a destra): $ZZII + IZZI + ZIIZ + IZIZ + IIZZ$. Una volta costruito l'operatore, l'ansatz per l'algoritmo QAOA può essere facilmente costruito utilizzando il circuito `QAOAAnsatz` dalla libreria di circuiti Qiskit.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "69599589-689e-4e0f-8135-937aedd9430d",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/courses/variational-algorithm-design/ansaetze-and-variational-forms/extracted-outputs/69599589-689e-4e0f-8135-937aedd9430d-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 7,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Pre-defined ansatz circuit, operator class and visualization tools\n",
        "from qiskit.circuit.library import QAOAAnsatz\n",
        "from qiskit.quantum_info import SparsePauliOp\n",
        "\n",
        "# Problem to Hamiltonian operator\n",
        "hamiltonian = SparsePauliOp.from_list(\n",
        "    [(\"ZZII\", 1), (\"IZZI\", 1), (\"ZIIZ\", 1), (\"IZIZ\", 1), (\"IIZZ\", 1)]\n",
        ")\n",
        "# QAOA ansatz circuit\n",
        "ansatz = QAOAAnsatz(hamiltonian, reps=2)\n",
        "# Draw\n",
        "ansatz.decompose(reps=3).draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "23728bd9-ac92-4e3a-a886-2238fc5287ad",
      "metadata": {},
      "source": [
        "L'immagine precedente illustra per chiarezza l'ansatz in porte di base. Tuttavia, può essere espresso in più livelli di decomposizione cambiando l'argomento `reps` o disegnando il circuito senza il metodo di decomposizione. Ad esempio, la seguente rappresentazione mostra direttamente la struttura QAOA con il valore predefinito di reps, che è `reps=1`.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "9724a36b-aae6-4d98-aad2-1090f0e1a941",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/courses/variational-algorithm-design/ansaetze-and-variational-forms/extracted-outputs/9724a36b-aae6-4d98-aad2-1090f0e1a941-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "ansatz.decompose(reps=2).draw(\"mpl\")"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "6a8aa7fc-3f80-46b2-b520-b6006d75a404",
      "metadata": {},
      "source": [
        "<span id=\"quantum-machine-learning\" />\n",
        "\n",
        "### Quantum Machine Learning\n",
        "\n",
        "Nell'apprendimento automatico, un'applicazione comune è la classificazione dei dati in due o più categorie. Ciò implica la codifica di un punto dati in una mappa di caratteristiche che mappa i vettori di caratteristiche classiche nello spazio di Hilbert quantistico. La costruzione di mappe di caratteristiche quantistiche basate su circuiti quantistici parametrizzati, difficili da simulare classicamente, è un passo importante per ottenere un potenziale vantaggio rispetto agli approcci classici di apprendimento automatico ed è un'area attiva di ricerca attuale.\n",
        "\n",
        "Il sito `zz_feature_map` può essere utilizzato per creare un circuito parametrizzato. Possiamo passare i nostri punti dati alla mappa delle caratteristiche ( $x$ ) e una forma variazionale separata per passare i pesi come parametri ( $\\theta$ ).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "9d3a813b-40cf-4399-b912-714893987c30",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/courses/variational-algorithm-design/ansaetze-and-variational-forms/extracted-outputs/9d3a813b-40cf-4399-b912-714893987c30-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 9,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit.library import zz_feature_map, TwoLocal\n",
        "\n",
        "data = [0.1, 0.2]\n",
        "\n",
        "zz_feature_map_reference = zz_feature_map(feature_dimension=2, reps=2)\n",
        "zz_feature_map_reference = zz_feature_map_reference.assign_parameters(data)\n",
        "\n",
        "variation_form = TwoLocal(2, [\"ry\", \"rz\"], \"cz\", reps=2)\n",
        "vqc_ansatz = zz_feature_map_reference.compose(variation_form)\n",
        "vqc_ansatz.decompose().draw(\"mpl\")"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "4a1b37bd-8de9-479b-8453-1d8942492731",
      "metadata": {},
      "source": [
        "<span id=\"summary\" />\n",
        "\n",
        "## Riepilogo\n",
        "\n",
        "In questa lezione avete imparato a definire lo spazio di ricerca con una forma variazionale:\n",
        "\n",
        "* Preparare stati con un circuito quantistico *parametrizzato*, in cui le porte sono definite con parametri sintonizzabili\n",
        "* Come costruire analisi che compromettano velocità e accuratezza\n",
        "* Ansaetze euristiche\n",
        "* Ansaetze specifiche per i problemi\n",
        "\n",
        "Il nostro carico di lavoro variazionale di alto livello si presenta come segue:\n",
        "\n",
        "![Un diagramma di circuito che mostra due unitari: uno che prepara lo stato di riferimento e un altro che prepara l'ansatz.](https://quantum.cloud.ibm.com/learning/images/courses/variational-algorithm-design/ansaetze-and-variational-forms/ansatz-circuit.svg)\n",
        "\n",
        "Per ogni parametro variazionale $\\vec\\theta$, verrà prodotto uno stato quantico diverso. Per trovare i parametri ottimali, dobbiamo definire una *funzione di costo* specifica per il problema per aggiornare iterativamente i parametri del nostro ansatz.\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": 2
}