{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "0af88701-d9bc-47f2-8ceb-2ae51f567934",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Visualiser les circuits\"\n",
        "description: \"Créez des visualisations de circuits et tracez des données de travail à l'aide du module de visualisation Qiskit\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore qcircuit mactex, backgroundcolor, lightgreen */}\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8d75dc24-b8d2-45f8-830b-48e45f794a31",
      "metadata": {},
      "source": [
        "<span id=\"visualize-circuits\" />\n",
        "\n",
        "# Visualiser les circuits\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7ea76afb-aecf-4ea2-b173-5d5e7e7d68ec",
      "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",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bd5865b3-adfa-4c87-be55-51f693335184",
      "metadata": {},
      "source": [
        "Il est souvent utile de voir les circuits que vous créez. Les options suivantes permettent d'afficher les circuits Qiskit.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "488c8d7d-5615-40ec-bf84-f1fa94832fce",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit import QuantumCircuit"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8bbddcca-300c-4f20-98dd-a0723cdef026",
      "metadata": {},
      "source": [
        "<span id=\"draw-a-quantum-circuit\" />\n",
        "\n",
        "## Dessiner un circuit quantique\n",
        "\n",
        "La classe `QuantumCircuit` permet de dessiner des circuits grâce à la méthode `draw()` ou en imprimant l'objet circuit. Par défaut, les deux restituent une version ASCII du schéma de circuit.\n",
        "\n",
        "Notez que `print` renvoie `None` mais a pour effet secondaire d'imprimer le diagramme, tandis que `QuantumCircuit.draw` renvoie le diagramme sans effet secondaire. Comme les carnets Jupyter affichent la sortie de la dernière ligne de chaque cellule, ils semblent avoir le même effet.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "547f07e8-7891-433c-ac53-3186196b3aa7",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Build a quantum circuit\n",
        "circuit = QuantumCircuit(3, 3)\n",
        "circuit.x(1)\n",
        "circuit.h(range(3))\n",
        "circuit.cx(0, 1)\n",
        "circuit.measure(range(3), range(3));"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "d69ae2df-c31c-414f-bba2-4c4a1012de41",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "     ┌───┐          ┌─┐   \n",
            "q_0: ┤ H ├───────■──┤M├───\n",
            "     ├───┤┌───┐┌─┴─┐└╥┘┌─┐\n",
            "q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├\n",
            "     ├───┤└┬─┬┘└───┘ ║ └╥┘\n",
            "q_2: ┤ H ├─┤M├───────╫──╫─\n",
            "     └───┘ └╥┘       ║  ║ \n",
            "c: 3/═══════╩════════╩══╩═\n",
            "            2        0  1 \n"
          ]
        }
      ],
      "source": [
        "print(circuit)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "04c91fd9-50a1-4ff3-84e4-0b51a6b1541a",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "     ┌───┐          ┌─┐   \n",
              "q_0: ┤ H ├───────■──┤M├───\n",
              "     ├───┤┌───┐┌─┴─┐└╥┘┌─┐\n",
              "q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├\n",
              "     ├───┤└┬─┬┘└───┘ ║ └╥┘\n",
              "q_2: ┤ H ├─┤M├───────╫──╫─\n",
              "     └───┘ └╥┘       ║  ║ \n",
              "c: 3/═══════╩════════╩══╩═\n",
              "            2        0  1 "
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "circuit.draw()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2159af06-93b8-441d-b8aa-c29324d26c6e",
      "metadata": {},
      "source": [
        "<span id=\"alternative-renderers\" />\n",
        "\n",
        "### Rendu alternatif\n",
        "\n",
        "Une sortie texte est utile pour visualiser rapidement la sortie lors du développement d'un circuit, mais elle n'offre pas la plus grande flexibilité. Il existe deux possibilités de rendu de sortie pour le circuit quantique. L'un utilise [Matplotlib](https://matplotlib.org/) et l'autre utilise [LaTeX](https://www.latex-project.org/). Le moteur de rendu LaTeX nécessite le [paquetage qcircuit](https://github.com/CQuIC/qcircuit). Sélectionnez ces moteurs de rendu en attribuant à l'argument \"output\" les chaînes de caractères `mpl` et `latex`.\n",
        "\n",
        "<Admonition type=\"tip\">\n",
        "  Les utilisateurs d'OSX peuvent obtenir les paquets LaTeX nécessaires via le [paquet mactex](https://www.tug.org/mactex/).\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "3f9c61c9-58f9-4315-a639-455fa2e58450",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/3f9c61c9-58f9-4315-a639-455fa2e58450-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Matplotlib drawing\n",
        "circuit.draw(output=\"mpl\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "94948dab-57de-45f0-8dd7-5901ae69b70a",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/94948dab-57de-45f0-8dd7-5901ae69b70a-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Latex drawing\n",
        "circuit.draw(output=\"latex\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "51fc6f51-6345-435d-abed-857f29a3f451",
      "metadata": {},
      "source": [
        "<span id=\"save-output\" />\n",
        "\n",
        "### Sauvegarder la sortie\n",
        "\n",
        "Dessiner un circuit à grande échelle en ligne dans un carnet Jupyter peut être lent ou illisible.\n",
        "Vous pouvez enregistrer le diagramme directement dans un fichier, puis l'ouvrir dans une visionneuse d'images et l'agrandir si nécessaire.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "17889caf-d953-4661-9188-00505c17064e",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/17889caf-d953-4661-9188-00505c17064e-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 7,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Save as an image using the Matplotlib drawer\n",
        "circuit.draw(output=\"mpl\", filename=\"circuit-mpl.jpeg\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "a36d1aa9-fa0d-4e27-ac83-5deee43a20dd",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/a36d1aa9-fa0d-4e27-ac83-5deee43a20dd-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Or save a LaTeX rendering\n",
        "circuit.draw(output=\"latex\", filename=\"circuit-latex.pdf\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "78688e6c-3ed2-4ef2-b3db-80fdae35e585",
      "metadata": {
        "jp-MarkdownHeadingCollapsed": true
      },
      "source": [
        "<span id=\"control-circuit-drawings\" />\n",
        "\n",
        "### Schémas des circuits de commande\n",
        "\n",
        "Par défaut, la méthode `draw()` renvoie l'image rendue sous forme d'objet et ne produit rien. La classe exacte renvoyée dépend de la sortie spécifiée : `'text'` (par défaut) renvoie un objet `TextDrawer` , `'mpl'` renvoie un objet `matplotlib.Figure` et `latex` renvoie un objet `PIL.Image` . Les blocs-notes Jupyter comprennent ces types de retour et les affichent correctement, mais lorsqu'ils sont exécutés en dehors de Jupyter, les images ne s'affichent pas automatiquement.\n",
        "\n",
        "La méthode `draw()` comporte des arguments facultatifs permettant d'afficher ou d'enregistrer les résultats. Lorsqu'il est spécifié, le kwarg `filename` prend un chemin dans lequel il enregistre le rendu. Par ailleurs, si vous utilisez les sorties `mpl` ou `latex` , vous pouvez utiliser le kwarg `interactive` pour ouvrir l'image dans une nouvelle fenêtre (cela ne fonctionnera pas toujours à partir d'un carnet).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "fc41270b-3518-40af-8921-dfa9666fc8e0",
      "metadata": {},
      "source": [
        "<span id=\"customize-the-output\" />\n",
        "\n",
        "### Personnaliser la sortie\n",
        "\n",
        "En fonction de la sortie, il est également possible de personnaliser le schéma de circuit.\n",
        "\n",
        "<span id=\"disable-plot-barriers-and-reverse-bit-order\" />\n",
        "\n",
        "#### Désactiver les barrières de tracé et inverser l'ordre des bits\n",
        "\n",
        "Les deux premières options sont partagées par les trois backends. Ils vous permettent de configurer à la fois l'ordre des bits et le fait de dessiner ou non des barrières. Ils peuvent être définis respectivement par le kwarg `reverse_bits` et le kwarg `plot_barriers` . Les exemples suivants fonctionnent avec n'importe quel moteur de rendu; `mpl` est utilisé ici par souci de concision.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "db61dc71-4cdc-4bb7-8139-8820e7785e55",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit import QuantumRegister, ClassicalRegister\n",
        "\n",
        "# Draw a new circuit with barriers and more registers\n",
        "q_a = QuantumRegister(3, name=\"a\")\n",
        "q_b = QuantumRegister(5, name=\"b\")\n",
        "c_a = ClassicalRegister(3)\n",
        "c_b = ClassicalRegister(5)\n",
        "\n",
        "circuit = QuantumCircuit(q_a, q_b, c_a, c_b)\n",
        "circuit.x(q_a[1])\n",
        "circuit.x(q_b[1])\n",
        "circuit.x(q_b[2])\n",
        "circuit.x(q_b[4])\n",
        "circuit.barrier()\n",
        "circuit.h(q_a)\n",
        "circuit.barrier(q_a)\n",
        "circuit.h(q_b)\n",
        "circuit.cswap(q_b[0], q_b[1], q_b[2])\n",
        "circuit.cswap(q_b[2], q_b[3], q_b[4])\n",
        "circuit.cswap(q_b[3], q_b[4], q_b[0])\n",
        "circuit.barrier(q_b)\n",
        "circuit.measure(q_a, c_a)\n",
        "circuit.measure(q_b, c_b);"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "8e57cd43-8a48-469d-8f69-8e7c936d4a1e",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/8e57cd43-8a48-469d-8f69-8e7c936d4a1e-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 10,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Draw the circuit\n",
        "circuit.draw(output=\"mpl\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "id": "8e7a251a-0a4f-43e0-8cf5-48493df7bad9",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/8e7a251a-0a4f-43e0-8cf5-48493df7bad9-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 11,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Draw the circuit with reversed bit order\n",
        "circuit.draw(output=\"mpl\", reverse_bits=True)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "b4a601ad-1c04-4b16-afbd-ac5a0ad42653",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/b4a601ad-1c04-4b16-afbd-ac5a0ad42653-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 12,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Draw the circuit without barriers\n",
        "circuit.draw(output=\"mpl\", plot_barriers=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "18b0bfbe-b586-4182-9a0d-b858655a9240",
      "metadata": {},
      "source": [
        "<span id=\"renderer-specific-customizations\" />\n",
        "\n",
        "### Personnalisations spécifiques au rendu\n",
        "\n",
        "Certaines options de personnalisation disponibles sont spécifiques à un moteur de rendu.\n",
        "\n",
        "L'argument `fold` définit une largeur maximale pour la sortie. Dans le moteur de rendu `text` , cela définit la longueur des lignes du diagramme avant qu'elles ne passent à la ligne suivante.  Lors de l'utilisation du moteur de rendu \"mpl\", il s'agit du nombre de couches (visuelles) avant de passer à la ligne suivante.\n",
        "\n",
        "Le moteur de rendu `mpl` possède la fonction `style` kwarg, qui modifie les couleurs et les contours. Voir la [documentation de l'API](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#draw) pour plus de détails.\n",
        "\n",
        "L'option `scale` met à l'échelle la sortie des moteurs de rendu `mpl` et `latex` .\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "id": "1e08bf74-378f-45e6-b195-a9539061013d",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "   ┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐»\n",
              "q: ┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├»\n",
              "   └───┘└───┘└───┘└───┘└───┘└───┘└───┘»\n",
              "«   ┌───┐┌───┐┌───┐\n",
              "«q: ┤ H ├┤ H ├┤ H ├\n",
              "«   └───┘└───┘└───┘"
            ]
          },
          "execution_count": 13,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "circuit = QuantumCircuit(1)\n",
        "for _ in range(10):\n",
        "    circuit.h(0)\n",
        "# limit line length to 40 characters\n",
        "circuit.draw(output=\"text\", fold=40)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "id": "decadf88-4866-45a0-9e2f-836c51491f9e",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/decadf88-4866-45a0-9e2f-836c51491f9e-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 14,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Change the background color in mpl\n",
        "\n",
        "style = {\"backgroundcolor\": \"lightgreen\"}\n",
        "circuit.draw(output=\"mpl\", style=style)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "id": "ade9a653-3243-4ac9-bb0e-c8fb82f7a034",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/ade9a653-3243-4ac9-bb0e-c8fb82f7a034-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 15,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Scale the mpl output to 1/2 the normal size\n",
        "circuit.draw(output=\"mpl\", scale=0.5)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "495b560a-d835-448b-aa01-5025a7a0689e",
      "metadata": {},
      "source": [
        "<span id=\"standalone-circuit-drawing-function\" />\n",
        "\n",
        "### Fonction autonome de dessin de circuits\n",
        "\n",
        "Si vous préférez dessiner un circuit à l'aide d'une fonction autonome plutôt qu'en tant que méthode d'un objet circuit, vous pouvez utiliser directement la fonction `circuit_drawer()` , qui fait partie de l'interface publique stable de `qiskit.visualization`. La fonction se comporte de manière identique à la méthode `circuit.draw()` , sauf qu'elle prend un objet circuit comme argument obligatoire.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "id": "256dd092-b2eb-47af-a025-0ecdf85c2d5a",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/256dd092-b2eb-47af-a025-0ecdf85c2d5a-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 16,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.visualization import circuit_drawer\n",
        "\n",
        "circuit_drawer(circuit, output=\"mpl\", plot_barriers=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0761df2f-183f-48e3-9070-766a9920c2b9",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Etapes suivantes\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recommandations\">\n",
        "  * Voir un exemple de visualisation de circuit dans le tutoriel sur l ['algorithme de Grover](/docs/tutorials/grovers-algorithm).\n",
        "  * Visualisez des circuits simples à l'aide d' [IBM Quantum Composer](/docs/guides/composer) s.\n",
        "  * [Visualisez la synchronisation du circuit](/docs/guides/visualize-circuit-timing).\n",
        "  * Consultez la [documentation relative à l'API de visualisation Qiskit](/docs/api/qiskit/visualization).\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
}