{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "fbce2fd6-c79e-4e90-9074-6cde8a09b517",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Paramètres couramment utilisés pour la transpilation\"\n",
        "description: \"Aperçu des paramètres couramment utilisés pour contrôler la transpilation des circuits quantiques dans Qiskit.\"\n",
        "---\n",
        "\n",
        "<span id=\"commonly-used-parameters-for-transpilation\" />\n",
        "\n",
        "# Paramètres couramment utilisés pour la transpilation\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6beea7ff-7407-47be-a0b7-1e7981328df5",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "{/*\n",
        "  DO NOT EDIT THIS CELL!!!\n",
        "  This cell's content is generated automatically by a script. Anything you add\n",
        "  here will be removed next time the notebook is run. To add new content, create\n",
        "  a new cell before or after this one.\n",
        "  */}\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"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": "05fb8adb-3b36-4449-b669-108d2d749ca5",
      "metadata": {},
      "source": [
        "Cette page décrit certains des paramètres les plus couramment utilisés pour la transpilation locale. Ces paramètres sont configurés à l'aide des arguments de [`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",
        "<span id=\"approx-degree\" />\n",
        "\n",
        "<span id=\"approximation-degree\" />\n",
        "\n",
        "## Degré d'approximation\n",
        "\n",
        "Vous pouvez utiliser le degré d'approximation pour spécifier à quel point vous souhaitez que le circuit résultant corresponde au circuit souhaité (d'entrée).  Il s'agit d'un nombre flottant compris entre ( 0.0 - 1.0 ), où 0.0 correspond à l'approximation maximale et 1.0 (par défaut) à l'absence d'approximation. Les valeurs plus petites sacrifient la précision de la sortie à la facilité d'exécution (c'est-à-dire moins de portes).  La valeur par défaut est 1.0.\n",
        "\n",
        "Dans la synthèse unitaire à deux qubits (utilisée dans les étapes initiales de tous les niveaux et pour l'étape d'optimisation avec le niveau d'optimisation 3), cette valeur spécifie la fidélité cible de la décomposition de sortie. En d'autres termes, quelle est la quantité d'erreur introduite lorsqu'une représentation matricielle d'un circuit est convertie en portes discrètes. Si le degré d'approximation est plus faible (plus d'approximation), le circuit de sortie de la synthèse sera plus différent de la matrice d'entrée, mais il aura probablement moins de portes (parce que toute opération arbitraire à deux qubits peut être décomposée parfaitement avec au plus trois portes CX) et sera plus facile à exécuter.\n",
        "\n",
        "Lorsque le degré d'approximation est inférieur à 1.0, des circuits comportant une ou deux portes CX peuvent être synthétisés, ce qui entraîne moins d'erreurs au niveau du matériel, mais plus au niveau de l'approximation. La CX étant la porte la plus coûteuse en termes d'erreur, il peut être avantageux d'en diminuer le nombre au détriment de la fidélité de la synthèse (cette technique a été utilisée pour augmenter le volume quantique sur les dispositifs IBM® ) : [Validating quantum computers using randomized model circuits](https://arxiv.org/abs/1811.12926) ).\n",
        "\n",
        "À titre d'exemple, nous générons un site aléatoire à deux qubits `UnitaryGate` qui sera synthétisé au cours de la phase initiale. Un réglage de `approximation_degree` inférieur à 1.0 peut générer un circuit approximatif. Nous devons également spécifier le site `basis_gates` pour permettre à la méthode de synthèse de savoir quelles portes elle peut utiliser pour la synthèse approximative.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "e660bec2-f806-4050-955b-53a50289158e",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "2\n"
          ]
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit, QuantumRegister\n",
        "from qiskit.circuit.library import UnitaryGate\n",
        "from qiskit.quantum_info import random_unitary\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "UU = random_unitary(4, seed=12345)\n",
        "rand_U = UnitaryGate(UU)\n",
        "\n",
        "qubits = QuantumRegister(2, name=\"q\")\n",
        "qc = QuantumCircuit(qubits)\n",
        "qc.append(rand_U, qubits)\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1,\n",
        "    approximation_degree=0.85,\n",
        "    basis_gates=[\"sx\", \"rz\", \"cx\"],\n",
        ")\n",
        "approx_qc = pass_manager.run(qc)\n",
        "print(approx_qc.count_ops()[\"cx\"])"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6f067d6e-0157-43fc-8cb2-c86855b6bdac",
      "metadata": {},
      "source": [
        "On obtient ainsi un résultat de `2` , car l'approximation nécessite moins de portes CX.\n",
        "\n",
        "<span id=\"seed\" />\n",
        "\n",
        "<span id=\"random-number-generator-seed\" />\n",
        "\n",
        "## Graine du générateur de nombres aléatoires\n",
        "\n",
        "Certaines parties du transpilateur sont stochastiques, de sorte que des exécutions répétées de la transpilation peuvent donner des résultats différents. Pour obtenir un résultat reproductible, vous pouvez définir la graine du générateur de nombres pseudo-aléatoires à l'aide de l'argument `seed_transpiler` . Des essais répétés utilisant la même semence donneront les mêmes résultats.\n",
        "\n",
        "Exemple :\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "dbc652e8-53a4-47a9-a66e-d9c1e5ef07c9",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/dbc652e8-53a4-47a9-a66e-d9c1e5ef07c9-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, seed_transpiler=11, basis_gates=[\"sx\", \"rz\", \"cx\"]\n",
        ")\n",
        "optimized_1 = pass_manager.run(qc)\n",
        "optimized_1.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "20b95efa-8aa8-41ac-a037-dac2a3336879",
      "metadata": {},
      "source": [
        "<span id=\"init-layout\" />\n",
        "\n",
        "<span id=\"initial-layout\" />\n",
        "\n",
        "## Disposition initiale\n",
        "\n",
        "Avant la transpilation, les qubits contenus dans votre circuit sont des qubits virtuels qui ne correspondent pas nécessairement à des qubits physiques sur le backend cible. Vous pouvez spécifier le mappage initial des qubits virtuels aux qubits physiques en utilisant l'argument `initial_layout` . Notez que la disposition finale des qubits peut différer de la disposition initiale, car le transpileur peut permuter les qubits en utilisant des portes de permutation ou d'autres moyens.\n",
        "\n",
        "Dans l'exemple ci-dessous, nous construisons une disposition initiale pour le backend fictif [`FakeSherbrooke`](/docs/api/qiskit-ibm-runtime/fake-provider-fake-sherbrooke#fakesherbrooke) en créant un objet [`Layout`](/docs/api/qiskit/qiskit.transpiler.Layout) objet. Notre schéma fait correspondre le premier qubit de notre circuit au qubit 5 de Sherbrooke, et le deuxième qubit de notre circuit au qubit 6 de Sherbrooke. Notez que les qubits physiques sont toujours représentés par des nombres entiers.\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": 3,
      "id": "e18c034c-eb26-4d9d-81d7-37e0eafa17c7",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/e18c034c-eb26-4d9d-81d7-37e0eafa17c7-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_ibm_runtime.fake_provider import FakeSherbrooke\n",
        "from qiskit.transpiler import Layout\n",
        "\n",
        "backend = FakeSherbrooke()\n",
        "\n",
        "a, b = qubits\n",
        "initial_layout = Layout({a: 5, b: 6})\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, backend=backend, initial_layout=initial_layout\n",
        ")\n",
        "transpiled_circ = pass_manager.run(qc)\n",
        "\n",
        "transpiled_circ.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "261055f3-cb88-4651-9a98-31891a4db535",
      "metadata": {},
      "source": [
        "Outre la spécification d'un objet Layout, vous pouvez également transmettre une liste d'entiers, où le $i$ -ème élément de la liste contient le qubit physique auquel le $i$ -ème qubit doit être associé. Par exemple :\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "a7800d8a-7354-48e4-a55f-f902ae28c875",
      "metadata": {
        "scrolled": true
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/a7800d8a-7354-48e4-a55f-f902ae28c875-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "initial_layout = [5, 6]\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, backend=backend, initial_layout=initial_layout\n",
        ")\n",
        "transpiled_circ = pass_manager.run(qc)\n",
        "\n",
        "transpiled_circ.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d2034dd5-23e5-4473-89b8-aaf4233775c7",
      "metadata": {},
      "source": [
        "Vous pouvez utiliser la fonction [`plot_error_map`](/docs/api/qiskit/qiskit.visualization.plot_error_map) pour générer un diagramme du graphique du dispositif avec les informations d'erreur et les qubits physiques étiquetés. Vous pouvez également consulter des diagrammes similaires sur la page des [ressources informatiques.](/computers)\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "8df57c6a-1ff4-4d58-9b7e-4378452c3025",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/8df57c6a-1ff4-4d58-9b7e-4378452c3025-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.visualization import plot_error_map\n",
        "\n",
        "plot_error_map(backend, figsize=(30, 24))"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "25c05cca-b93b-4ba1-b46c-7280ec4ef8cb",
      "metadata": {},
      "source": [
        "<span id=\"xx-method\" />\n",
        "\n",
        "<span id=\"transpiler-stage-and-plugin-options\" />\n",
        "\n",
        "## Options de la phase de transpilation et des plugins\n",
        "\n",
        "Ces options sont précédées de `_method`. Ils influencent le fonctionnement du transpondeur et sont utilisés pour essayer d'obtenir un résultat meilleur, différent ou spécifique de la part du transpondeur.\n",
        "\n",
        "* `init_method` (str) - Le plugin à utiliser pour l'étape d'initialisation.\n",
        "\n",
        "* `layout_method` (str) - La passe de sélection de la mise en page (`trivial`, `dense`, `sabre`). Il peut également s'agir du nom du plugin externe à utiliser pour l'étape de mise en page.\n",
        "\n",
        "* `optimization_method` (str) - Le plugin à utiliser pour l'étape d'optimisation.\n",
        "\n",
        "* `routing_method` (str) - Nom du passage de routage (`basic`, `lookahead`, `default`, `sabre`, `none`). Il peut également s'agir du nom du plugin externe à utiliser pour l'étape de routage.\n",
        "\n",
        "* `scheduling_method` (str) - Nom du laissez-passer d'ordonnancement. Il peut également s'agir du nom du plugin externe à utiliser pour l'étape de planification.\n",
        "  * `as_soon_as_possible`: Programmer les instructions avec avidité : le plus tôt possible sur une ressource qubit (alias : `asap`).\n",
        "  * `as_late_as_possible`: Programmer les instructions en retard.  Il s'agit de maintenir les qubits dans l'état fondamental lorsque cela est possible (alias : `alap`).\n",
        "\n",
        "* `translation_method` (str) - Nom de la passe de traduction (`unroller`, `translator`, `synthesis`). Il peut également s'agir du nom du plugin externe à utiliser pour l'étape de traduction.\n",
        "\n",
        "* `unitary_synthesis_method` (str) - Le nom de la méthode de synthèse unitaire à utiliser. Par défaut, `default` est utilisé.\n",
        "\n",
        "<Admonition>\n",
        "  Pour obtenir une liste de tous les plugins installés pour une étape donnée, lancez [`list_stage_plugins(\"stage_name\")`](/docs/api/qiskit/transpiler_plugins). Par exemple, si vous souhaitez obtenir une liste de tous les plugins installés pour l'étape de routage, exécutez `list_stage_plugins(routing)`.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Etapes suivantes\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recommandation\">\n",
        "  * Consultez la rubrique [Options par défaut et paramètres de configuration](defaults-and-configuration-options).\n",
        "  * Apprenez à [définir le niveau d'optimisation](set-optimization).\n",
        "  * Consultez le guide [Comparer les paramètres du transpiler](/docs/guides/circuit-transpilation-settings).\n",
        "  * Consultez [la documentation relative à l'API du transcompilateur](/docs/api/qiskit/transpiler).\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}