{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "dde95705",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Parity Twine Optimizer: una funzione di Qiskit realizzata da ParityQC\"\n",
        "description: \"Risolvi problemi di ottimizzazione su computer quantistici utilizzando Parity Twine. Riduce al minimo il numero di porte logiche e la profondità dei circuiti per l'esecuzione di algoritmi di ottimizzazione quantistica.\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore parityqc QOBLIB  */}\n",
        "\n",
        "<span id=\"parity-twine-optimizer-a-qiskit-function-by-parityqc\" />\n",
        "\n",
        "# Parity Twine Optimizer: una funzione di Qiskit realizzata da ParityQC\n",
        "\n",
        "*Consulta la [guida alle API](/docs/api/functions/parity-twine-optimizer)*\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Qiskit Functions sono una funzionalità sperimentale disponibile solo per gli utenti dei piani \" IBM Quantum® Premium Plan \", \"Flex Plan\" e \" On-Prem \" (tramite l'API di IBM Quantum Platform ). Sono in fase di anteprima e soggette a modifiche.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"overview\" />\n",
        "\n",
        "## Panoramica\n",
        "\n",
        "Il Parity Twine Optimizer consente agli utenti di risolvere problemi di ottimizzazione con i computer quantistici utilizzando il [metodo Parity Twine](https://arxiv.org/abs/2501.14020).\n",
        "Questo approccio, basato sull’architettura Parity, utilizza il compilatore “ ParityQC ” per ridurre al minimo il numero di porte logiche e la profondità dei circuiti necessari per l’esecuzione di un algoritmo quantistico, tenendo conto al contempo della connettività dei dispositivi.\n",
        "\n",
        "Questa riduzione delle risorse consente di risolvere problemi di ottimizzazione rilevanti per l'industria su scale che risultano irrealizzabili con i metodi di transpilazione standard, che comportano un elevato carico di SWAP.\n",
        "Il Parity Twine Optimizer automatizza le fasi di transpilazione e può essere utilizzato con un intervento minimo da parte dell'utente.\n",
        "\n",
        "L'approccio Parity Twine supera tutti gli altri metodi di compilazione in termini di riduzione del numero di porte logiche e della profondità dei circuiti per algoritmi quantistici quali l'\n",
        "[algoritmo di ottimizzazione approssimativa quantistica (QAOA)](https://arxiv.org/abs/2501.14020) e [la trasformata di Fourier quantistica (QFT)](https://arxiv.org/abs/2604.12465).\n",
        "Astraendo l’informazione quantistica dai qubit fisici, è possibile realizzare interazioni non locali senza ricorrere ai gate SWAP. Al contrario, le catene Parity Twine (sequenze di porte CNOT) distribuiscono sistematicamente le\n",
        "informazioni di parità logica tra i qubit.\n",
        "\n",
        "L'ottimizzatore utilizza l'algoritmo QAOA per minimizzare l'energia di una data funzione di costo. QAOA è un algoritmo variazionale ibrido quantistico-classico progettato per risolvere problemi di ottimizzazione combinatoria mediante l'approssimazione dello stato fondamentale\n",
        "di un hamiltoniano di costo ( $H_C$ ). Un termine di miscelazione ( $H_B$ ) guida le transizioni tra gli stati per esplorare lo spazio delle soluzioni. Una sequenza alternata di questi termini, controllata dai parametri $\\gamma$ e $\\beta$, definisce l'\n",
        "$U(\\gamma, \\beta) = \\Pi_{i=1}^p e^{-i \\beta_i H_B} e^{-i \\gamma_i H_C}$ unitaria, che agisce sullo stato iniziale.\n",
        "\n",
        "La codifica dell'operatore unitario del problema, exp( $-i \\beta H_C)$ ), richiede la codifica di tutti gli operatori logici di rotazione a $n$ i (exp( $-i \\beta J_{i,j,...n}Z_iZ_j...Z_n$ )).\n",
        "Ciò può essere ottenuto utilizzando generatori a $n$ i (Parity Twine Networks), che riducono la profondità del circuito QAOA e il numero di gate a due qubit.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "02f8e130",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5f761442",
      "metadata": {},
      "source": [
        "<span id=\"description\" />\n",
        "\n",
        "## Descrizione\n",
        "\n",
        "L'input di Parity Twine Optimizer è costituito da un problema di ottimizzazione, dal nome dell'hardware IBM Quantum selezionato e da ulteriori argomenti opzionali per personalizzare le impostazioni di transpilazione ed esecuzione hardware. La funzione\n",
        "“ottimizzatore” inoltra la definizione del problema al compilatore Parity Twine. La figura 1 mostra una sintesi del flusso di lavoro della funzione.\n",
        "\n",
        "![Flusso](https://quantum.cloud.ibm.com/docs/images/guides/parity-twine-optimizer/process_pipeline.avif \"di lavoro di Parity Twine Optimizer Figura 1: Riepilogo del flusso di lavoro di Parity Twine Optimizer.\")\n",
        "\n",
        "Il problema di ottimizzazione degli input viene pre-elaborato in un hamiltoniano (normalizzato). Il compilatore ParityQC a quindi un circuito di ansatz Parity Twine parametrizzato, che viene transpilato in un ansatz logico corrispondente all'insieme di porte nativo\n",
        "dell'hardware scelto.\n",
        "\n",
        "I parametri del circuito QAOA vengono tradizionalmente ottimizzati utilizzando l’approccio [“efficient depth one”](https://github.com/qiskit-community/qaoa_training_pipeline/blob/main/how_tos/efficient_depth_one.ipynb) e assegnati al circuito transpilato.\n",
        "Poiché viene utilizzato un solo ciclo di QAOA, i parametri ottimali $\\gamma$ e $\\beta$ vengono ottenuti tramite una ricerca a griglia su una CPU, senza la necessità di una costosa ottimizzazione iterativa\n",
        "su numerose chiamate al circuito. Ciò riduce notevolmente il tempo di esecuzione della QPU richiesto dall'ottimizzatore. Il tempo di esecuzione per circuito è determinato principalmente dal sovraccarico costante necessario per eseguire un’operazione sulla QPU.\n",
        "Una volta impostati i parametri del circuito, il lavoro viene inviato alla QPU specificata IBM®.\n",
        "\n",
        "I risultati grezzi vengono quindi sottoposti a post-elaborazione. Questo passaggio utilizza una ricerca avida locale che percorre in modo casuale la stringa della soluzione e inverte i valori dei bit se ciò riduce il valore della funzione di costo.\n",
        "\n"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "b34fe075",
      "metadata": {},
      "source": [
        "<span id=\"benchmarks\" />\n",
        "\n",
        "## Benchmark\n",
        "\n",
        "<Admonition type=\"caution\" title=\"Dichiarazione di non responsabilità\">\n",
        "  Le prestazioni possono dipendere sia dall'istanza del problema che dalle fasi di elaborazione successive. In alcuni casi, i campioni classici e quelli generati quantisticamente potrebbero raggiungere una qualità finale simile dopo una post-elaborazione equivalente. La valutazione dovrebbe quindi prendere in considerazione l'intero flusso di lavoro di ottimizzazione.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"sherrington-kirkpatrick-model\" />\n",
        "\n",
        "### Modello di Sherrington-Kirkpatrick\n",
        "\n",
        "La figura 2 illustra l'efficacia del Parity Twine Optimizer. Qui vengono messi a confronto i risultati ottenuti utilizzando l'ottimizzatore con quelli ottenuti tramite campionamento casuale per il modello di Sherrington-Kirkpatrick\n",
        "con un numero crescente di qubit.\n",
        "\n",
        "La post-elaborazione sia dei risultati casuali che di quelli ottenuti con l'ottimizzatore porta a stati fondamentali esatti, ma il valore grezzo dell'energia minima fornito da Twine QAOA è sempre migliore rispetto ai\n",
        "valori casuali. Per i numeri più elevati di qubit considerati (90 e 100), il rumore dell’hardware compromette il risultato dell’ottimizzatore, che torna a valori grezzi corrispondenti al campionamento casuale.\n",
        "\n",
        "![Benchmark](https://quantum.cloud.ibm.com/docs/images/guides/parity-twine-optimizer/benchmark_run_sk.avif \"del Parity Twine Optimizer per il modello SK Figura 2: Risultati dei benchmark del Parity Twine Optimizer per il modello SK rispetto al campionamento casuale. I risultati sono stati ottenuti su\n",
        "\\`ibm_boston` con 20.000 tentativi, ripetuti tre volte.\")\n",
        "\n",
        "Consulta questo [tutorial](/docs/tutorials/parity-twine-optimizer-sk) per un'introduzione al modello di Sherrington-Kirkpatrick e per informazioni dettagliate su come risolverlo con il Parity Twine Optimizer.\n",
        "\n",
        "<span id=\"market-split-problem\" />\n",
        "\n",
        "### Problema di frammentazione del mercato\n",
        "\n",
        "La tabella 1 mostra gli indicatori di prestazione specifici dell'ottimizzatore Parity Twine applicato a varie istanze del problema della suddivisione del mercato (MS).\n",
        "Questi dati sono stati ricavati dalla [QOBLIB (Quantum Optimization Benchmarking Library)](https://github.com/ZIB-AOPT/QOBLIB) e corrispondono alle\n",
        "[proposte](https://github.com/ZIB-AOPT/QOBLIB/tree/main/01-marketsplit/submissions/20260728_Parity_Twine_Optimizer) inviate alla\n",
        "libreria utilizzando il Parity Twine Optimizer.\n",
        "\n",
        "La violazione MS è una metrica di accuratezza che misura quanto la soluzione sia lontana dal soddisfare tutti i vincoli, definita come $\\sum_i ((Ax - b)_i)^2$. Valori più bassi di questa metrica indicano soluzioni più accurate.\n",
        "La tabella 1 riporta i valori medi relativi a cinque esecuzioni di ciascuna istanza ottenute utilizzando il Parity Twine Optimizer con il dispositivo `ibm_boston` come backend e 100.000 shot.\n",
        "Viene riportata la violazione minima di MS ottenuta dalle esecuzioni di ciascuna istanza.\n",
        "\n",
        "| Istanza          | Qubit | Gate a due qubit | Profondità a due qubit | Violazione della sclerosi multipla | Tempo di mappatura (s) | Tempo di esecuzione della QPU (s) | Tempo di post-elaborazione (s) |\n",
        "| :--------------- | :---- | :--------------- | :--------------------- | :--------------------------------- | :--------------------- | :-------------------------------- | :----------------------------- |\n",
        "| ms\\_03\\_050\\_002 | 20    | 399              | 76                     | 0                                  | 45                     | 29                                | 69                             |\n",
        "| ms\\_03\\_100\\_022 | 20    | 399              | 76                     | 0                                  | 30                     | 29                                | 77                             |\n",
        "| ms\\_03\\_200\\_177 | 20    | 399              | 76                     | 0                                  | 33                     | 29                                | 63                             |\n",
        "| ms\\_04\\_050\\_001 | 30    | 899              | 116                    | 1                                  | 68                     | 29                                | 216                            |\n",
        "| ms\\_04\\_100\\_003 | 30    | 899              | 116                    | 2                                  | 89                     | 29                                | 187                            |\n",
        "| ms\\_04\\_200\\_030 | 30    | 899              | 116                    | 3                                  | 89                     | 29                                | 219                            |\n",
        "| ms\\_05\\_100\\_003 | 40    | 1599             | 156                    | 3                                  | 237                    | 30                                | 364                            |\n",
        "| ms\\_06\\_050\\_001 | 50    | 2499             | 196                    | 4                                  | 499                    | 30                                | 464                            |\n",
        "| ms\\_07\\_050\\_001 | 60    | 3599             | 236                    | 17                                 | 858                    | 31                                | 637                            |\n",
        "| ms\\_08\\_050\\_001 | 70    | 4899             | 276                    | 36                                 | 1561                   | 31                                | 773                            |\n",
        "\n",
        "<p align=\"center\"><i>Tabella 1: Indicatori di prestazione per diverse istanze del problema della suddivisione del mercato. I nomi delle istanze si riferiscono agli esempi corrispondenti presenti nella libreria di problemi [QOBLIB](https://github.com/ZIB-AOPT/QOBLIB). Come già menzionato nella sezione dedicata alla descrizione, il tempo di elaborazione della QPU è minimo e pressoché costante, poiché viene utilizzato un solo ciclo di QAOA con parametri circuitali ottimali ottenuti su una CPU.</i></p>\n",
        "\n",
        "Consulta questo [tutorial](/docs/tutorials/parity-twine-optimizer-ms) per un'introduzione al problema della suddivisione del mercato e per maggiori dettagli su come risolverlo con il Parity Twine Optimizer.\n",
        "\n",
        "<span id=\"maximum-independent-set-problem\" />\n",
        "\n",
        "### Problema dell'insieme indipendente massimo\n",
        "\n",
        "La figura 3 mette a confronto i risultati ottenuti utilizzando l'ottimizzatore Parity Twine con quelli ottenuti tramite campionamento casuale per il problema dell'insieme indipendente massimo su istanze selezionate\n",
        "tratte dalla [QOBLIB (Quantum Optimization Benchmarking Library)](https://github.com/ZIB-AOPT/QOBLIB). Questi vanno da 18 (interazioni tra mammiferi e canguri) a\n",
        "114 ( es60fst03 ) qubit.\n",
        "\n",
        "Per le istanze di piccole dimensioni, la dimensione massima dell’insieme indipendente ottenuta dall’ottimizzatore e quella ottenuta tramite campionamento casuale sono simili, ma per le istanze più grandi l’ottimizzatore fornisce risultati di gran lunga migliori.\n",
        "La post-elaborazione sia dei risultati ottenuti tramite campionamento casuale sia di quelli ottenuti con l'ottimizzatore porta nuovamente a dimensioni degli insiemi in accordo con i valori esatti.\n",
        "\n",
        "![Parity Twine Optimizer: benchmark](https://quantum.cloud.ibm.com/docs/images/guides/parity-twine-optimizer/benchmark_run_mis.avif \"MIS Figura 3: Risultati dei benchmark relativi al modello Parity Twine Optimizer per MIS rispetto al campionamento casuale.\n",
        "I risultati sono stati ottenuti su `ibm_boston` con 20.000 shot, ripetuti tre volte.\")\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "73390a19",
      "metadata": {},
      "source": [
        "<span id=\"get-started\" />\n",
        "\n",
        "## Introduzione\n",
        "\n",
        "Effettua l'autenticazione utilizzando [il tuo token API di IBM Quantum Platform e seleziona la funzione Qiskit come:](/docs/guides/functions-get-started)\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "95a715d2",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
        "\n",
        "# Authenticate and load the Qiskit Function\n",
        "catalog = QiskitFunctionsCatalog(\n",
        "    channel=\"ibm_quantum_platform\",\n",
        ")\n",
        "function = catalog.load(\"parityqc/parity-twine-optimizer\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e8837f5f",
      "metadata": {},
      "source": [
        "<span id=\"example\" />\n",
        "\n",
        "## Esempio\n",
        "\n",
        "L'ottimizzatore Parity Twine può essere applicato a un semplice esempio QUBO come segue. Il problema viene innanzitutto definito utilizzando un dizionario:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "d56e1440",
      "metadata": {},
      "outputs": [],
      "source": [
        "problem = {\"()\": 3, \"(0,)\": 1, \"(0, 1)\": 2, \"(1, 2)\": -1}"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "69ea92c9",
      "metadata": {},
      "source": [
        "Quindi, il tipo della variabile deve essere definito come `binary` o `spin`:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "06fc4134",
      "metadata": {},
      "outputs": [],
      "source": [
        "variable_type = \"spin\""
      ]
    },
    {
      "cell_type": "markdown",
      "id": "03998691",
      "metadata": {},
      "source": [
        "Ciò definisce la funzione obiettivo $3 + s_0 + 2 s_0s_1 - s_1s_2$, dove $s_i \\in \\{-1, 1\\}$.\n",
        "\n",
        "Scegli un backend. Ad esempio:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "856fe992",
      "metadata": {},
      "outputs": [],
      "source": [
        "backend_name = \"ibm_phoenix\""
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6f88b8ee-47a8-4c93-b25c-f4eceaf3dbf8",
      "metadata": {},
      "source": [
        "Utilizza `catalog.backends()` per visualizzare l'elenco dei backend disponibili dall'account utente/istanza.\n",
        "\n",
        "Se non viene specificato alcun backend, viene selezionato automaticamente il backend meno carico (quello con il minor numero di lavori in sospeso).\n",
        "\n",
        "Una volta caricato l'ottimizzatore (vedi sopra), è possibile eseguirlo sul problema utilizzando le opzioni predefinite:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "27558d79-01c1-4616-aec0-2a9623e0e9e1",
      "metadata": {},
      "outputs": [],
      "source": [
        "function_job = function.run(\n",
        "    problem=problem, variable_type=variable_type, backend_name=backend_name\n",
        ")\n",
        "print(f\"Job ID: {function_job.job_id}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c036d9c6a386323",
      "metadata": {},
      "source": [
        "Verifica lo stato del lavoro come segue:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "5c71411c8ac8271d",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Monitor the job status\n",
        "function_job.status()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "646bd940-80ad-4e79-b4e2-0db447edf41b",
      "metadata": {},
      "source": [
        "Recuperare i risultati come segue:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "197d53b9-2b5e-44e5-99e3-0c285db903a9",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Retrieve the job result if the status is DONE\n",
        "result = function_job.result()\n",
        "\n",
        "result"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bb1bba96-4689-4ddf-b72f-6c6e5cf2c3ba",
      "metadata": {},
      "source": [
        "Stampando i risultati si ottiene quanto segue:\n",
        "\n",
        "```\n",
        "{\n",
        "    'solution': {'0': -1, '1': 1, '2': 1},\n",
        "    'objective_value': -1.0,\n",
        "    'solution_bitstring': '100',\n",
        "    'metadata': {\n",
        "        'circuit_metrics': {\n",
        "            'depth': 20,\n",
        "            'gate_count': 198,\n",
        "            'two_qubit_gate_depth': 4,\n",
        "            'two_qubit_gate_count': 4,\n",
        "            'num_qubits': 3,\n",
        "            'operations': {'delay': 158, 'rz': 17, 'sx': 14, 'cz': 4, 'measure': 3, 'x': 2}\n",
        "        },\n",
        "        'solver_info': {\n",
        "            'variable_mapping': {'0': 0, '1': 1, '2': 2},\n",
        "            'bitstring_distributions': {\n",
        "                'before_postprocessing': {'100': 71760, ... },\n",
        "                'after_postprocessing': {'100': 88440, '011': 11560}\n",
        "            },\n",
        "            'best_parameters': {\n",
        "                'beta': [-0.46259546391008877],\n",
        "                'gamma': [0.6181957189727373]\n",
        "            }\n",
        "        },\n",
        "        'resource_usage': {\n",
        "            'RUNNING: MAPPING': {'CPU_TIME': 42.878},\n",
        "            'RUNNING: OPTIMIZING_FOR_HARDWARE': {'CPU_TIME': 0.094},\n",
        "            'RUNNING: WAITING_FOR_QPU': {'CPU_TIME': 790.623},\n",
        "            'RUNNING: EXECUTING_QPU': {'QPU_TIME': 28.0},\n",
        "            'RUNNING: POST_PROCESSING': {'CPU_TIME': 0.828}\n",
        "        }\n",
        "    }\n",
        "}\n",
        "```\n",
        "\n",
        "Il dizionario `solution` corrisponde ai qubit definiti nel problema ( $s_0, s_1$ e $s_2$ ) e fornisce i valori ottimizzati dei loro spin.\n",
        "\n",
        "Il rappresenta `objective_value` il costo o l'energia del problema di ottimizzazione. Quantifica la qualità `solution` .\n",
        "\n",
        "`metadata` fornisce informazioni sulla transpilazione (numero di gate a due qubit/profondità, gate utilizzati, qubit attivi) e sui vari tempi di esecuzione sia per il calcolo quantistico che per quello classico.\n",
        "\n",
        "Inoltre, `metadata` offre uno sguardo sui meccanismi interni dell'algoritmo. È possibile visualizzare i parametri variazionali ottimizzati (beta e gamma) e verificare come sia migliorata la distribuzione delle stringhe di bit misurate dopo l’applicazione della post-elaborazione classica ai risultati quantistici grezzi.\n",
        "\n",
        "Tutte le stringhe di bit presenti nell'output dei risultati possono essere mappate alle variabili del problema utilizzando il `variable_mapping`.\n",
        "Ad esempio, è possibile associare il `'solution_bitstring': '100'` al `'variable_mapping': {'0': 0, '1': 1, '2': 2}` nella soluzione binaria: `{'0': 1, '1': 0, '2': 0}`.\n",
        "Poiché stai risolvendo il problema in termini di variabili di spin, devi applicare la trasformazione da binario a spin (`0` -> `1`, `1` -> `-1` ).\n",
        "Si ottiene così la soluzione finale `'solution': {'0': -1, '1': 1, '2': 1}`.\n",
        "\n",
        "Per informazioni complete sugli input e sugli output della funzione Parity Twine Optimizer, consultare la documentazione [di riferimento dell'API](/docs/api/functions/parity-twine-optimizer).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8ba474e4",
      "metadata": {},
      "source": [
        "<span id=\"changelog\" />\n",
        "\n",
        "## Changelog\n",
        "\n",
        "<span id=\"[102]---2026-09-15\" />\n",
        "\n",
        "### \\[1.0.2] - 15 settembre 2026\n",
        "\n",
        "**Note**\n",
        "\n",
        "Questa versione rappresenta la prima versione stabile e definitiva della funzione Qiskit \"Parity Twine Optimizer\". Si prevede che le prossime versioni includano le seguenti novità:\n",
        "\n",
        "* compilazione di problemi di ordine superiore,\n",
        "* ulteriori algoritmi di ottimizzazione, e\n",
        "* miglioramenti nella fase di pre-elaborazione e post-elaborazione.\n",
        "\n",
        "**Funzioni**\n",
        "\n",
        "* Risolvi problemi QUBO sparsi e densi con l’efficiente Parity Twine Compiler.\n",
        "\n",
        "**Documentazione**\n",
        "\n",
        "* Guida introduttiva per l'utente.\n",
        "* Tutorial con esempi relativi alla suddivisione del mercato e ai problemi di Sherrington-Kirkpatrick.\n",
        "* Documentazione API.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e9ec2e67",
      "metadata": {},
      "source": [
        "<span id=\"get-support\" />\n",
        "\n",
        "## Ottenere supporto\n",
        "\n",
        "Per qualsiasi domanda o problema, contatta [ParityQC](mailto:support@parityqc.com).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5a6a25c8",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Passi successivi\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Suggerimenti\">\n",
        "  * Richiedi l'accesso alla funzione compilando questo [modulo](https://parityqc.com/products/parity-twine-optimizer/free-trial).\n",
        "  * Consulta la documentazione [di riferimento dell'API](/docs/api/functions/parity-twine-optimizer) relativa a questa funzione di Qiskit.\n",
        "  * Prova il [tutorial](/docs/tutorials/parity-twine-optimizer-ms) sull’applicazione del Parity Twine Optimizer al problema della suddivisione del mercato.\n",
        "  * Prova il [tutorial](/docs/tutorials/parity-twine-optimizer-sk) su come applicare il Parity Twine Optimizer al modello di Sherrington-Kirkpatrick.\n",
        "  * Si veda il preprint [“Connectivity-aware Synthesis of Quantum Algorithms”, Drier et al. (2025)](https://arxiv.org/abs/2501.14020) ArXiv.\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
}