{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "dde95705",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Parity Twine Optimizer : une fonction Qiskit développée par ParityQC\"\n",
        "description: \"Résolvez des problèmes d'optimisation sur des ordinateurs quantiques à l'aide de Parity Twine. Réduit au minimum le nombre de portes logiques et la profondeur des circuits pour l'exécution d'algorithmes d'optimisation quantique.\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore parityqc QOBLIB  */}\n",
        "\n",
        "<span id=\"parity-twine-optimizer-a-qiskit-function-by-parityqc\" />\n",
        "\n",
        "# Parity Twine Optimizer : une fonction Qiskit développée par ParityQC\n",
        "\n",
        "*Consultez la [documentation de l'API](/docs/api/functions/parity-twine-optimizer)*\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Qiskit Functions Il s'agit d'une fonctionnalité expérimentale réservée aux utilisateurs des formules « IBM Quantum® Premium Plan », «Flex Plan» et « On-Prem » (via l'API IBM Quantum Platform ). Ces fonctionnalités sont actuellement en version préliminaire et sont susceptibles d'évoluer.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"overview\" />\n",
        "\n",
        "## Présentation\n",
        "\n",
        "L'optimiseur « Parity Twine » permet aux utilisateurs de résoudre des problèmes d'optimisation à l'aide d'ordinateurs quantiques en utilisant la [méthode « Parity Twine](https://arxiv.org/abs/2501.14020) ».\n",
        "Cette approche, qui s'appuie sur l'architecture Parity, utilise le compilateur « ParityQC » pour réduire au minimum le nombre de portes logiques et la profondeur du circuit nécessaires à l'exécution d'un algorithme quantique, tout en tenant compte de la connectivité des dispositifs.\n",
        "\n",
        "Cette réduction des ressources permet de résoudre des problèmes d'optimisation pertinents pour l'industrie à des échelles qui ne sont pas réalisables avec les méthodes de transpilation standard, très gourmandes en SWAP.\n",
        "L'optimiseur Parity Twine automatise les étapes de transpilation et peut être utilisé avec un minimum d'intervention de la part de l'utilisateur.\n",
        "\n",
        "L'approche « Parity Twine » surpasse toutes les autres méthodes de compilation en termes de réduction du nombre de portes et de la profondeur des circuits pour des algorithmes quantiques tels que l'\n",
        "[algorithme d'optimisation approximative quantique (QAOA)](https://arxiv.org/abs/2501.14020) et [la transformée de Fourier quantique (QFT)](https://arxiv.org/abs/2604.12465).\n",
        "En dissociant l'information quantique des qubits physiques, il est possible de mettre en œuvre des interactions non locales sans recourir à des portes SWAP. Au contraire, les chaînes de Parity Twine (séquences de portes CNOT) répartissent systématiquement les\n",
        "informations de parité logique entre les qubits.\n",
        "\n",
        "L'optimiseur utilise l'algorithme QAOA pour minimiser l'énergie d'une fonction de coût donnée. QAOA est un algorithme variationnel hybride quantique-classique conçu pour résoudre des problèmes d'optimisation combinatoire en approximant l'état fondamental\n",
        "d'un hamiltonien de coût ( $H_C$ ). Un terme de mélange ( $H_B$ ) induit des transitions entre les états afin d'explorer l'espace des solutions. Une succession alternée de ces termes, régie par les paramètres $\\gamma$ et $\\beta$, définit l'\n",
        "$U(\\gamma, \\beta) = \\Pi_{i=1}^p e^{-i \\beta_i H_B} e^{-i \\gamma_i H_C}$ unitaire qui agit sur l'état initial.\n",
        "\n",
        "Le codage unitaire du problème, exp( $-i \\beta H_C)$ ), nécessite le codage de tous les opérateurs de rotation à $n$ -corps logiques (exp( $-i \\beta J_{i,j,...n}Z_iZ_j...Z_n$ )).\n",
        "Cela peut être réalisé à l’aide de générateurs à $n$ -corps (réseaux de parité entrelacés), qui réduisent la profondeur du circuit QAOA et le nombre de portes à deux qubits.\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",
        "## Description\n",
        "\n",
        "Les données d'entrée de l'optimiseur Parity Twine Optimizer comprennent un problème d'optimisation, le nom du matériel « IBM Quantum » sélectionné, ainsi que des arguments facultatifs supplémentaires permettant de personnaliser les paramètres de transpilation et d'exécution matérielle. La fonction d'optimisation\n",
        "transmet la définition du problème au compilateur Parity Twine. La figure 1 présente un résumé du déroulement de la fonction.\n",
        "\n",
        "![Déroulement](https://quantum.cloud.ibm.com/docs/images/guides/parity-twine-optimizer/process_pipeline.avif \"du processus « Parity Twine Optimizer » Figure 1 : Résumé du déroulement du processus « Parity Twine Optimizer ».\")\n",
        "\n",
        "Le problème d'optimisation initial est transformé en un hamiltonien (normalisé). Le compilateur « ParityQC » construit ensuite un circuit « Parity Twine » paramétré, qui est transpilé en un ansatz logique correspondant à l’ensemble de portes natif\n",
        "du matériel choisi.\n",
        "\n",
        "Les paramètres du circuit QAOA sont généralement optimisés à l'aide de l'approche [« efficient depth one »](https://github.com/qiskit-community/qaoa_training_pipeline/blob/main/how_tos/efficient_depth_one.ipynb) et attribués au circuit transpilé.\n",
        "Comme on n'utilise qu'un seul cycle de QAOA, les paramètres optimaux d' $\\gamma$ et d' $\\beta$ sont obtenus par une recherche par grille sur un processeur, sans qu'il soit nécessaire de recourir à une optimisation itérative coûteuse\n",
        "impliquant de nombreux appels de circuit. Cela réduit considérablement le temps d'exécution requis par le QPU de l'optimiseur. Le temps d'exécution par circuit est principalement déterminé par la surcharge constante liée à l'exécution d'une tâche sur le QPU.\n",
        "Une fois les paramètres du circuit définis, la tâche est soumise au QPU IBM® spécifié.\n",
        "\n",
        "Les résultats bruts font ensuite l'objet d'un traitement ultérieur. Cette étape utilise une recherche gloutonne locale qui parcourt de manière aléatoire la chaîne de solution et inverse les valeurs des bits si cela permet de réduire la valeur de la fonction de coût.\n",
        "\n"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "b34fe075",
      "metadata": {},
      "source": [
        "<span id=\"benchmarks\" />\n",
        "\n",
        "## Tests de performances\n",
        "\n",
        "<Admonition type=\"caution\" title=\"Avis de non-responsabilité\">\n",
        "  Les performances peuvent dépendre à la fois de l'instance du problème et des étapes de traitement suivantes. Dans certains cas, les échantillons classiques et les échantillons générés par des méthodes quantiques peuvent aboutir à une qualité de solution finale similaire après un post-traitement équivalent. L'évaluation doit donc prendre en compte l'ensemble du processus d'optimisation.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"sherrington-kirkpatrick-model\" />\n",
        "\n",
        "### Modèle de Sherrington-Kirkpatrick\n",
        "\n",
        "La figure 2 illustre l'efficacité de l'optimiseur de torsion de parité. Ce graphique compare les résultats obtenus à l'aide de l'optimiseur à ceux issus d'un échantillonnage aléatoire pour le modèle de Sherrington-Kirkpatrick\n",
        "avec un nombre croissant de qubits.\n",
        "\n",
        "Le post-traitement des résultats issus tant de la méthode aléatoire que de l'optimiseur permet d'obtenir des états fondamentaux exacts, mais la valeur brute de l'énergie minimale fournie par Twine QAOA est toujours supérieure aux\n",
        "valeurs aléatoires. Pour les plus grands nombres de qubits pris en compte (90 et 100), le bruit matériel dégrade le résultat de l'optimiseur, qui revient alors à des valeurs brutes correspondant à un échantillonnage aléatoire.\n",
        "\n",
        "![Tests](https://quantum.cloud.ibm.com/docs/images/guides/parity-twine-optimizer/benchmark_run_sk.avif \"de performance de l'optimiseur Parity Twine pour le modèle SK Figure 2 : Résultats des tests de performance de l'optimiseur Parity Twine pour le modèle SK, comparés à ceux obtenus par échantillonnage aléatoire. Les résultats ont été obtenus sur\n",
        "\\`ibm_boston` avec 20 000 essais, répétés trois fois.\")\n",
        "\n",
        "Consultez ce [tutoriel](/docs/tutorials/parity-twine-optimizer-sk) pour découvrir le modèle de Sherrington-Kirkpatrick et obtenir des informations détaillées sur la manière de le résoudre à l'aide de l'optimiseur Parity Twine.\n",
        "\n",
        "<span id=\"market-split-problem\" />\n",
        "\n",
        "### Problème de segmentation du marché\n",
        "\n",
        "Le tableau 1 présente les indicateurs de performance spécifiques de l’optimiseur Parity Twine appliqués à différentes instances du problème de répartition du marché (MS).\n",
        "Ces résultats proviennent de la bibliothèque [QOBLIB (Quantum Optimization Benchmarking Library)](https://github.com/ZIB-AOPT/QOBLIB) et correspondent aux\n",
        "[résultats](https://github.com/ZIB-AOPT/QOBLIB/tree/main/01-marketsplit/submissions/20260728_Parity_Twine_Optimizer) soumis à cette\n",
        "bibliothèque à l'aide de l'optimiseur Parity Twine.\n",
        "\n",
        "La violation MS est un indicateur de précision qui mesure dans quelle mesure la solution est loin de satisfaire toutes les contraintes; elle est définie comme suit : $\\sum_i ((Ax - b)_i)^2$. Plus la valeur de cet indicateur est faible, plus la solution est précise.\n",
        "Le tableau 1 présente les valeurs moyennes obtenues pour cinq exécutions de chaque instance à l'aide de l'optimiseur Parity Twine, avec le périphérique `ibm_boston` comme backend et 100 000 tirs.\n",
        "La valeur minimale de la violation MS obtenue à partir des exécutions de chaque instance est indiquée.\n",
        "\n",
        "| Instance         | Qubits | Portes à deux qubits | Profondeur à deux qubits | Violation de la SEP | Durée de la cartographie (s) | Temps d'exécution du QPU (s) | Temps de post-traitement (s) |\n",
        "| :--------------- | :----- | :------------------- | :----------------------- | :------------------ | :--------------------------- | :--------------------------- | :--------------------------- |\n",
        "| ms\\_03\\_050\\_002 | 20     | 399                  | 76                       | 0                   | 45                           | 29                           | 82                           |\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>Tableau 1 : Indicateurs de performance pour différents cas du problème de segmentation du marché. Les noms d'instances renvoient aux exemples correspondants dans la bibliothèque de problèmes [QOBLIB](https://github.com/ZIB-AOPT/QOBLIB). Comme indiqué précédemment dans la section « Description », le temps d’exécution sur le QPU est minime et quasi constant, car un seul cycle de QAOA est utilisé avec les paramètres de circuit optimaux obtenus sur un CPU.</i></p>\n",
        "\n",
        "Consultez ce [tutoriel](/docs/tutorials/parity-twine-optimizer-ms) pour découvrir le problème de répartition des marchés et obtenir des informations détaillées sur la manière de le résoudre à l'aide de l'optimiseur Parity Twine.\n",
        "\n",
        "<span id=\"maximum-independent-set-problem\" />\n",
        "\n",
        "### Problème de l'ensemble indépendant maximal\n",
        "\n",
        "La figure 3 compare les résultats obtenus à l'aide de l'optimiseur Parity Twine à ceux issus d'un échantillonnage aléatoire pour le problème de l'ensemble indépendant maximal, sur des instances sélectionnées\n",
        "issues de la bibliothèque [QOBLIB (Quantum Optimization Benchmarking Library)](https://github.com/ZIB-AOPT/QOBLIB). Leur nombre varie de 18 (interactions entre mammifères et kangourous) à\n",
        "114 ( es60fst03 ) qubits.\n",
        "\n",
        "Pour les petites instances, la taille maximale brute de l'ensemble indépendant obtenue par l'optimiseur et celle obtenue par échantillonnage aléatoire sont similaires, mais pour les instances plus grandes, l'optimiseur donne de bien meilleurs résultats.\n",
        "Le post-traitement des résultats issus à la fois de l'échantillonnage aléatoire et de l'optimiseur permet à nouveau d'obtenir des tailles d'ensembles concordant avec les valeurs exactes.\n",
        "\n",
        "Optimiseur « ![Parity Twine » : tests](https://quantum.cloud.ibm.com/docs/images/guides/parity-twine-optimizer/benchmark_run_mis.avif \"de performance pour le modèle MIS. Figure 3 : Résultats des tests de performance de l'optimiseur « Parity Twine » pour le modèle MIS, comparés à ceux obtenus par échantillonnage aléatoire.\n",
        "Les résultats ont été obtenus sur « ibm_boston » avec 20 000 essais, répétés trois fois.\")\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "73390a19",
      "metadata": {},
      "source": [
        "<span id=\"get-started\" />\n",
        "\n",
        "## Premiers pas\n",
        "\n",
        "Connectez-vous à l'aide de votre [jeton API « IBM Quantum Platform » et sélectionnez la fonction Qiskit suivante :](/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",
        "## Exemple\n",
        "\n",
        "L'optimiseur Parity Twine peut être appliqué à un exemple simple de QUBO comme suit. On commence par définir le problème à l'aide d'un dictionnaire :\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": [
        "Ensuite, le type de la variable doit être défini comme `binary` suit `spin`:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "06fc4134",
      "metadata": {},
      "outputs": [],
      "source": [
        "variable_type = \"spin\""
      ]
    },
    {
      "cell_type": "markdown",
      "id": "03998691",
      "metadata": {},
      "source": [
        "Cela définit la fonction objectif $3 + s_0 + 2 s_0s_1 - s_1s_2$, où $s_i \\in \\{-1, 1\\}$.\n",
        "\n",
        "Choisissez un backend. Par exemple :\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": [
        "Utilisez `catalog.backends()` pour afficher la liste des backends disponibles depuis le compte utilisateur ou l'instance.\n",
        "\n",
        "Si aucun backend n'est spécifié, le backend le moins sollicité (celui qui comporte le moins de tâches en attente) est automatiquement sélectionné.\n",
        "\n",
        "Une fois l'optimiseur chargé (voir ci-dessus), vous pouvez l'appliquer au problème en utilisant les options par défaut :\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": [
        "Vérifiez l'état de la tâche comme suit :\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": [
        "Pour récupérer les résultats, procédez comme suit :\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": [
        "L'affichage des résultats donne ce qui suit :\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",
        "Ce dictionnaire `solution` correspond aux qubits définis dans l'énoncé ( $s_0, s_1$ et $s_2$ ) et indique leurs valeurs de spin optimisées.\n",
        "\n",
        "Le `objective_value` correspond au coût ou à l'énergie du problème d'optimisation. Il permet de mesurer la qualité `solution` .\n",
        "\n",
        "`metadata` fournit des informations sur la transpilation (nombre de portes à deux qubits/profondeur, portes utilisées, qubits actifs) ainsi que sur les différents temps d'exécution, tant pour le calcul quantique que pour le calcul classique.\n",
        "\n",
        "De plus, cela `metadata` permet d'avoir un aperçu du fonctionnement interne de l'algorithme. Vous pouvez consulter les paramètres variationnels optimisés (bêta et gamma) et observer comment la distribution des chaînes de bits mesurées s'est améliorée après l'application d'un post-traitement classique aux résultats quantiques bruts.\n",
        "\n",
        "Toutes les chaînes de bits présentes dans le résultat peuvent être mises en correspondance avec les variables du problème à l'aide de la fonction `variable_mapping`.\n",
        "Par exemple, vous pouvez associer le `'solution_bitstring': '100'` au `'variable_mapping': {'0': 0, '1': 1, '2': 2}` pour obtenir la solution binaire : `{'0': 1, '1': 0, '2': 0}`.\n",
        "Puisque vous résolvez le problème en utilisant des variables de spin, vous devez appliquer la transformation binaire en spin (`0` -> `1`, `1` -> `-1` ).\n",
        "Vous obtenez alors la solution finale `'solution': {'0': -1, '1': 1, '2': 1}`.\n",
        "\n",
        "Pour plus de détails sur les données d'entrée et de sortie de la fonction « Parity Twine Optimizer », consultez la [documentation de l'API](/docs/api/functions/parity-twine-optimizer).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8ba474e4",
      "metadata": {},
      "source": [
        "<span id=\"changelog\" />\n",
        "\n",
        "## Journal des modifications\n",
        "\n",
        "<span id=\"[102]---2026-09-15\" />\n",
        "\n",
        "### \\[1.0.2] - 15 septembre 2026\n",
        "\n",
        "**Remarques**\n",
        "\n",
        "Cette version marque la première version stable et opérationnelle de la fonction Qiskit « Parity Twine Optimizer ». Les prochaines versions devraient inclure les nouveautés suivantes :\n",
        "\n",
        "* compilation de problèmes d'ordre supérieur,\n",
        "* des algorithmes d'optimisation supplémentaires, et\n",
        "* améliorations apportées au prétraitement et au post-traitement.\n",
        "\n",
        "**Fonctions**\n",
        "\n",
        "* Résolvez des problèmes QUBO clairsemés et denses grâce au compilateur Parity Twine, particulièrement performant.\n",
        "\n",
        "**Documentation**\n",
        "\n",
        "* Guide de démarrage.\n",
        "* Tutoriels accompagnés d'exemples sur la division du marché et les problèmes de Sherrington-Kirkpatrick.\n",
        "* Documentation de l'API.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e9ec2e67",
      "metadata": {},
      "source": [
        "<span id=\"get-support\" />\n",
        "\n",
        "## Obtenir de l'aide\n",
        "\n",
        "Pour toute question ou tout problème, veuillez contacter [ParityQC](mailto:support@parityqc.com).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5a6a25c8",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Etapes suivantes\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recommandations\">\n",
        "  * Pour demander l'accès à cette fonctionnalité, veuillez remplir ce [formulaire](https://parityqc.com/products/parity-twine-optimizer/free-trial).\n",
        "  * Consultez la [documentation de l'API](/docs/api/functions/parity-twine-optimizer) relative à cette fonction Qiskit.\n",
        "  * Suivez le [tutoriel](/docs/tutorials/parity-twine-optimizer-ms) pour découvrir comment appliquer l'optimiseur de Parity Twine au problème de répartition des marchés.\n",
        "  * Suivez le [tutoriel](/docs/tutorials/parity-twine-optimizer-sk) pour découvrir comment appliquer l'outil « Parity Twine Optimizer » au modèle de Sherrington-Kirkpatrick.\n",
        "  * Consultez l'article [« Connectivity-aware Synthesis of Quantum Algorithms », de Drier et al. (2025), disponible](https://arxiv.org/abs/2501.14020) en prépublication sur 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
}