{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "92e0efa3-cda3-491c-99fc-650b2ce4cfa8",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Installer et utiliser les plugins de transpiler\"\n",
        "description: \"Comment installer et utiliser les plugins de transpiler dans Qiskit.\"\n",
        "---\n",
        "\n",
        "<span id=\"install-and-use-transpiler-plugins\" />\n",
        "\n",
        "# Installer et utiliser les plugins de transpiler\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5a4052f5-554d-4633-a588-eb0583f66871",
      "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=\"Versions de package\">\n",
        "    Le code de cette page a été développé en tenant compte des exigences suivantes.\n",
        "    Nous recommandons d'utiliser ces versions ou des versions plus récentes.\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": "12018a80-a1ce-4508-9d04-23c4176028e6",
      "metadata": {},
      "source": [
        "Pour faciliter le développement et la réutilisation du code de transpilation personnalisé par la communauté élargie des utilisateurs de Qiskit, le SDK Qiskit prend en charge une interface de plugin qui permet aux paquets tiers Python de déclarer qu'ils fournissent des fonctionnalités de transpilation étendues accessibles via Qiskit.\n",
        "\n",
        "Actuellement, les plugins tiers peuvent fournir des fonctionnalités de transpilation étendues de trois manières :\n",
        "\n",
        "* Un [plugin transpiler stage](/docs/api/qiskit/transpiler_plugins) fournit un gestionnaire de passage qui peut être utilisé à la place de l'un des [6 stades](transpiler-stages) d'un gestionnaire de passage prédéfini : `init`, `layout`, `routing`, `translation`, `optimization`, et `scheduling`.\n",
        "* Un [plugin de synthèse unitaire](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.UnitarySynthesisPlugin) offre des fonctionnalités étendues pour la synthèse de portes unitaires.\n",
        "* Un [plugin de synthèse de haut niveau](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.HighLevelSynthesisPlugin) offre des fonctionnalités étendues pour synthétiser des \"objets de haut niveau\" tels que des fonctions linéaires ou des opérateurs de Clifford. Les objets de haut niveau sont représentés par des sous-classes de la classe [Opération.](/docs/api/qiskit/qiskit.circuit.Operation)\n",
        "\n",
        "Le reste de la page décrit comment dresser la liste des plugins disponibles, en installer de nouveaux et les utiliser.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "934388b3-8efd-43b6-82f8-ace84d3bb0d4",
      "metadata": {},
      "source": [
        "<span id=\"list-available-plugins-and-install-new-ones\" />\n",
        "\n",
        "## Répertorier les plugins disponibles et en installer de nouveaux\n",
        "\n",
        "Qiskit comprend déjà des plugins intégrés pour la transpilation. Pour en installer d'autres, vous pouvez utiliser votre gestionnaire de paquets Python. Par exemple, vous pouvez lancer `pip install qiskit-toqm` pour installer le plugin d'étape de routage [Qiskit TOQM](https://github.com/qiskit-toqm/qiskit-toqm). Un certain nombre de plugins tiers font partie de l' [écosystème Qiskit](https://qiskit.github.io/ecosystem/#transpiler_plugin).\n",
        "\n",
        "<span id=\"list-available-transpiler-stage-plugins\" />\n",
        "\n",
        "### Liste des plugins de transpiler stage disponibles\n",
        "\n",
        "Utilisez la fonction [list\\_stage\\_plugins](/docs/api/qiskit/transpiler_plugins#qiskit.transpiler.preset_passmanagers.plugin.list_stage_plugins), en passant le nom de la scène dont vous voulez lister les plugins.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "817254a8-77d7-4eb4-8630-623e67bb2186",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['default', 'dense', 'sabre', 'trivial']"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.preset_passmanagers.plugin import list_stage_plugins\n",
        "\n",
        "list_stage_plugins(\"layout\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "354f9be8-3567-4449-ba60-4d1c3258bb50",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['basic', 'default', 'lookahead', 'none', 'sabre']"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "list_stage_plugins(\"routing\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ac57d3ce-afb3-4aba-8601-93513d4dd491",
      "metadata": {},
      "source": [
        "Si `qiskit-toqm` était installé, `toqm` apparaîtrait dans la liste des plugins `routing` .\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1397de7f-c447-463e-8aba-ed1f569be86c",
      "metadata": {},
      "source": [
        "<span id=\"list-available-unitary-synthesis-plugins\" />\n",
        "\n",
        "### Liste des plugins de synthèse unitaire disponibles\n",
        "\n",
        "Utiliser la fonction [unitary\\_synthesis\\_plugin\\_names](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "596cbb3d-2ece-4193-929c-79149f7e23bd",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['aqc', 'clifford', 'default', 'gridsynth', 'sk']"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names\n",
        "\n",
        "unitary_synthesis_plugin_names()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e33885d4-788f-4759-bd63-e26d7a45ff9e",
      "metadata": {},
      "source": [
        "<span id=\"list-available-high-level-synthesis-plugins\" />\n",
        "\n",
        "### Liste des plugins de synthèse de haut niveau disponibles\n",
        "\n",
        "Utiliser la fonction [high\\_level\\_synthesis\\_plugin\\_names](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.high_level_synthesis_plugin_names), en transmettant le nom du type d'\"objet de haut niveau\" à synthétiser. Le nom correspond à l'attribut [`name`](/docs/api/qiskit/qiskit.circuit.Operation#name) de la classe d' [opération](/docs/api/qiskit/qiskit.circuit.Operation) représentant le type d'objet synthétisé.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "3b2d72bb-d661-4432-acfe-970f0a2dcd53",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['ag', 'bm', 'default', 'greedy', 'layers', 'lnn', 'rb_default']"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.passes.synthesis import (\n",
        "    high_level_synthesis_plugin_names,\n",
        ")\n",
        "\n",
        "high_level_synthesis_plugin_names(\"clifford\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "583d7529-ab3e-449d-b7d0-e732801d7ae0",
      "metadata": {},
      "source": [
        "Vous pouvez utiliser la classe [HighLevelSynthesisPluginManager](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.HighLevelSynthesisPluginManager) pour lister les noms de tous les plugins de synthèse de haut niveau :\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "b17192e5-ddac-4cf6-b2e2-597e8c505568",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['FullAdder.default',\n",
              " 'FullAdder.ripple_c04',\n",
              " 'FullAdder.ripple_v95',\n",
              " 'HalfAdder.default',\n",
              " 'HalfAdder.qft_d00',\n",
              " 'HalfAdder.ripple_c04',\n",
              " 'HalfAdder.ripple_r25',\n",
              " 'HalfAdder.ripple_v95',\n",
              " 'IntComp.default',\n",
              " 'IntComp.noaux',\n",
              " 'IntComp.twos',\n",
              " 'ModularAdder.default',\n",
              " 'ModularAdder.modular_v17',\n",
              " 'ModularAdder.qft_d00',\n",
              " 'ModularAdder.ripple_c04',\n",
              " 'ModularAdder.ripple_v95',\n",
              " 'Multiplier.cumulative_h18',\n",
              " 'Multiplier.default',\n",
              " 'Multiplier.qft_r17',\n",
              " 'PauliEvolution.default',\n",
              " 'PauliEvolution.rustiq',\n",
              " 'WeightedSum.default',\n",
              " 'annotated.default',\n",
              " 'clifford.ag',\n",
              " 'clifford.bm',\n",
              " 'clifford.default',\n",
              " 'clifford.greedy',\n",
              " 'clifford.layers',\n",
              " 'clifford.lnn',\n",
              " 'linear_function.default',\n",
              " 'linear_function.kms',\n",
              " 'linear_function.pmh',\n",
              " 'mcmt.default',\n",
              " 'mcmt.noaux',\n",
              " 'mcmt.vchain',\n",
              " 'mcmt.xgate',\n",
              " 'mcx.1_clean_b95',\n",
              " 'mcx.1_clean_kg24',\n",
              " 'mcx.1_dirty_kg24',\n",
              " 'mcx.2_clean_kg24',\n",
              " 'mcx.2_dirty_kg24',\n",
              " 'mcx.default',\n",
              " 'mcx.gray_code',\n",
              " 'mcx.n_clean_m15',\n",
              " 'mcx.n_dirty_i15',\n",
              " 'mcx.noaux_hp24',\n",
              " 'mcx.noaux_v24',\n",
              " 'permutation.acg',\n",
              " 'permutation.basic',\n",
              " 'permutation.default',\n",
              " 'permutation.kms',\n",
              " 'permutation.token_swapper',\n",
              " 'qft.default',\n",
              " 'qft.full',\n",
              " 'qft.line',\n",
              " 'clifford.rb_default']"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.passes.synthesis.plugin import (\n",
        "    HighLevelSynthesisPluginManager,\n",
        ")\n",
        "\n",
        "HighLevelSynthesisPluginManager().plugins.names()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4eed49d1-4723-4366-9edc-1f5aa73907ba",
      "metadata": {},
      "source": [
        "<span id=\"use-a-plugin\" />\n",
        "\n",
        "## Utilisez un plugin\n",
        "\n",
        "Dans cette section, nous montrons comment utiliser les plugins de transposition. Dans les exemples de code, nous utilisons les plugins fournis avec Qiskit, mais les plugins installés à partir de paquets tiers sont utilisés de la même manière.\n",
        "\n",
        "<span id=\"use-a-transpiler-stage-plugin\" />\n",
        "\n",
        "### Utilisez un plugin de transpilation\n",
        "\n",
        "Pour utiliser un plugin d'étape de transcompilation, indiquez son nom à l'aide de l'argument approprié dans [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) ou [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). L'argument est formé en ajoutant `_method` au nom de l'étape de transpilation. Par exemple, pour utiliser le plugin `lookahead` de routage, il faudrait spécifier `lookahead` pour `routing_method` l'argument.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Le backend `FakeSherbrooke` fictif de `qiskit_ibm_runtime` est utilisé dans ces exemples, mais vous pouvez l'essayer sur n'importe quel backend réel ou fictif compatible avec Qiskit.  Vos résultats peuvent varier.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "d5e598b3-9226-4fbc-ac76-8eca08ec4af3",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime.fake_provider import FakeSherbrooke\n",
        "\n",
        "backend = FakeSherbrooke()\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=3, backend=backend, routing_method=\"lookahead\"\n",
        ")"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "657db73c-7064-4569-a212-87642f16216e",
      "metadata": {},
      "source": [
        "<span id=\"use-a-unitary-synthesis-plugin\" />\n",
        "\n",
        "### Utilisez un plugin de synthèse unitaire\n",
        "\n",
        "Pour utiliser un plugin de synthèse unitaire, spécifiez son nom en tant qu'argument `unitary_synthesis_method` à [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) ou [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile):\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "28184c68-4b1e-46d2-a8a0-5480814bad9b",
      "metadata": {},
      "outputs": [],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=3,\n",
        "    backend=backend,\n",
        "    unitary_synthesis_method=\"sk\",\n",
        "    unitary_synthesis_plugin_config=dict(\n",
        "        basis_gates=[\"cz\", \"id\", \"rz\", \"sx\", \"x\"]\n",
        "    ),\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c019cb3d-5069-4257-bfb6-e15600caa342",
      "metadata": {},
      "source": [
        "La synthèse unitaire est utilisée dans les étapes `init`, `translation`, et `optimization` du gestionnaire de passage par étapes renvoyé par [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) ou utilisée dans [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). Voir les [étapes du transpondeur](transpiler-stages) pour une description de ces étapes.\n",
        "\n",
        "Utilisez l'argument `unitary_synthesis_plugin_config` , un dictionnaire de forme libre, pour transmettre des options pour la méthode de synthèse unitaire. La documentation de la méthode de synthèse doit expliquer les options qu'elle prend en charge. Voir [cette liste](/docs/api/qiskit/transpiler_synthesis_plugins#unitary-synthesis-plugins-2) pour les liens vers la documentation des plugins de synthèse unitaire intégrés.\n",
        "\n"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "d4ce7ad9-711f-4e43-9012-3f404b885ab1",
      "metadata": {},
      "source": [
        "<span id=\"use-a-high-level-synthesis-plugin\" />\n",
        "\n",
        "### Utilisez un plugin de synthèse de haut niveau\n",
        "\n",
        "Tout d'abord, créez un [HLSConfig](/docs/api/qiskit/qiskit.transpiler.passes.HLSConfig) pour stocker les noms des plugins à utiliser pour les différents objets de haut niveau. Par exemple :\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "d4672004-aead-4827-9c10-5c70c3c2289b",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler.passes import HLSConfig\n",
        "\n",
        "hls_config = HLSConfig(clifford=[\"layers\"], linear_function=[\"pmh\"])"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4eab8d19-4b58-4f50-a205-039288e4a00d",
      "metadata": {},
      "source": [
        "Cette cellule de code crée une configuration de synthèse de haut niveau qui utilise le plugin `layers` pour synthétiser les objets de [Clifford](/docs/api/qiskit/qiskit.quantum_info.Clifford#clifford) et le plugin `pmh` pour synthétiser les objets de [LinearFunction](/docs/api/qiskit/qiskit.circuit.library.LinearFunction#linearfunction) objets. Les noms des arguments des mots-clés correspondent à l'élément [`name`](/docs/api/qiskit/qiskit.circuit.Operation#name) de la classe [Operation](/docs/api/qiskit/qiskit.circuit.Operation) représentant le type d'objet synthétisé.\n",
        "Pour chaque objet de haut niveau, la liste des plugins donnés est essayée en séquence jusqu'à ce que l'un d'entre eux réussisse (dans l'exemple ci-dessus, chaque liste ne contient qu'un seul plugin) réussisse (dans l'exemple ci-dessus, chaque liste ne contient qu'un seul plugin).\n",
        "\n",
        "En plus de spécifier un plugin par son nom, vous pouvez transmettre un tuple `(name, options)` , où le deuxième élément du tuple est un dictionnaire contenant des options pour le plugin. La documentation de la méthode de synthèse doit expliquer les options qu'elle prend en charge. Voir [cette liste](/docs/api/qiskit/transpiler_synthesis_plugins#high-level-synthesis-plugins-2) pour les liens vers la documentation des plugins de synthèse de haut niveau intégrés.\n",
        "\n",
        "Une fois que vous avez créé l'objet `HLSConfig` , transmettez-le en tant qu'argument à la commande `hls_config` à [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) ou [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile):\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "8784b881-2f37-4f75-b5c7-c84cdb8b8a60",
      "metadata": {},
      "outputs": [],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=3, backend=backend, hls_config=hls_config\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ea63c611-c213-4736-83f7-c46e918eb862",
      "metadata": {},
      "source": [
        "La synthèse de haut niveau est utilisée dans les étapes `init`, `translation`, et `optimization` du gestionnaire de passage par étapes renvoyé par [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) ou utilisée dans [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). Voir les [étapes du transpondeur](transpiler-stages) pour une description de ces étapes.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "aae87a98-f16d-4ac1-9b85-11a771e04224",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Etapes suivantes\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recommandation\">\n",
        "  * [Créer un plugin de transcompilation](/docs/guides/create-transpiler-plugin).\n",
        "  * Consultez les [didacticiels](/docs/tutorials) pour des exemples de transposition et d'exécution de circuits quantiques.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}