Aller au contenu principal

Visualiser les circuits

Versions des packages

Le code de cette page a été développé avec les dépendances suivantes. Nous recommandons d'utiliser ces versions ou des versions plus récentes.

qiskit[all]~=2.3.0

Il est souvent utile de voir les circuits que tu crées. Utilise les options suivantes pour afficher des circuits Qiskit.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit

Dessiner un circuit quantique

La classe QuantumCircuit permet de dessiner des circuits via la méthode draw(), ou en affichant l'objet circuit avec print. Par défaut, les deux produisent une représentation ASCII du schéma du circuit.

Note que print retourne None mais a pour effet de bord d'afficher le schéma, tandis que QuantumCircuit.draw retourne le schéma sans effet de bord. Comme les notebooks Jupyter affichent le résultat de la dernière ligne de chaque cellule, les deux semblent avoir le même effet.

# Build a quantum circuit
circuit = QuantumCircuit(3, 3)
circuit.x(1)
circuit.h(range(3))
circuit.cx(0, 1)
circuit.measure(range(3), range(3));
print(circuit)
┌───┐          ┌─┐
q_0: ┤ H ├───────■──┤M├───
├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
└───┘ └╥┘ ║ ║
c: 3/═══════╩════════╩══╩═
2 0 1
circuit.draw()
┌───┐          ┌─┐
q_0: ┤ H ├───────■──┤M├───
├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
└───┘ └╥┘ ║ ║
c: 3/═══════╩════════╩══╩═
2 0 1

Rendus alternatifs

Un rendu texte est pratique pour visualiser rapidement le circuit pendant son développement, mais il n'offre pas une grande flexibilité. Il existe deux rendus alternatifs pour le circuit quantique. L'un utilise Matplotlib et l'autre LaTeX. Le rendu LaTeX nécessite le package qcircuit. Sélectionne ces rendus en définissant l'argument "output" avec les valeurs mpl et latex.

conseil

Les utilisateurs d'OSX peuvent obtenir les packages LaTeX nécessaires via le package mactex.

# Matplotlib drawing
circuit.draw(output="mpl")

Output of the previous code cell

# Latex drawing
circuit.draw(output="latex")

Output of the previous code cell

Sauvegarder le rendu

Afficher un circuit de grande envergure directement dans un notebook Jupyter peut être lent ou illisible. Tu peux enregistrer le schéma directement dans un fichier, puis l'ouvrir dans un visionneur d'images et zoomer selon tes besoins.

# Save as an image using the Matplotlib drawer
circuit.draw(output="mpl", filename="circuit-mpl.jpeg")

Output of the previous code cell

# Or save a LaTeX rendering
circuit.draw(output="latex", filename="circuit-latex.pdf")

Output of the previous code cell

Contrôler les dessins de circuits

Par défaut, la méthode draw() retourne le rendu sous forme d'objet sans rien afficher. La classe exacte retournée dépend du rendu choisi : 'text' (par défaut) retourne un objet TextDrawer, 'mpl' retourne un objet matplotlib.Figure, et latex retourne un objet PIL.Image. Les notebooks Jupyter comprennent ces types de retour et les affichent correctement, mais en dehors de Jupyter, les images ne s'affichent pas automatiquement.

La méthode draw() dispose d'arguments optionnels pour afficher ou sauvegarder le rendu. Lorsqu'il est spécifié, le kwarg filename prend un chemin vers lequel il enregistre le rendu. Sinon, si tu utilises les rendus mpl ou latex, tu peux utiliser le kwarg interactive pour ouvrir l'image dans une nouvelle fenêtre (cela ne fonctionne pas toujours depuis un notebook).

Personnaliser le rendu

Selon le rendu utilisé, il existe aussi des options pour personnaliser le schéma du circuit.

Désactiver les barrières et inverser l'ordre des bits

Les deux premières options sont communes aux trois backends. Elles te permettent de configurer l'ordre des bits et de choisir si les barrières sont affichées ou non. Ces options se définissent respectivement via les kwargs reverse_bits et plot_barriers. Les exemples suivants fonctionnent avec n'importe quel rendu ; mpl est utilisé ici par souci de concision.

from qiskit import QuantumRegister, ClassicalRegister

# Draw a new circuit with barriers and more registers
q_a = QuantumRegister(3, name="a")
q_b = QuantumRegister(5, name="b")
c_a = ClassicalRegister(3)
c_b = ClassicalRegister(5)

circuit = QuantumCircuit(q_a, q_b, c_a, c_b)
circuit.x(q_a[1])
circuit.x(q_b[1])
circuit.x(q_b[2])
circuit.x(q_b[4])
circuit.barrier()
circuit.h(q_a)
circuit.barrier(q_a)
circuit.h(q_b)
circuit.cswap(q_b[0], q_b[1], q_b[2])
circuit.cswap(q_b[2], q_b[3], q_b[4])
circuit.cswap(q_b[3], q_b[4], q_b[0])
circuit.barrier(q_b)
circuit.measure(q_a, c_a)
circuit.measure(q_b, c_b);
# Draw the circuit
circuit.draw(output="mpl")

Output of the previous code cell

# Draw the circuit with reversed bit order
circuit.draw(output="mpl", reverse_bits=True)

Output of the previous code cell

# Draw the circuit without barriers
circuit.draw(output="mpl", plot_barriers=False)

Output of the previous code cell

Personnalisations spécifiques à chaque rendu

Certaines options de personnalisation sont propres à un rendu particulier.

L'argument fold définit une largeur maximale pour le rendu. Avec le rendu text, il fixe la longueur des lignes du schéma avant qu'elles ne passent à la ligne suivante. Avec le rendu mpl, il correspond au nombre de couches (visuelles) avant le passage à la ligne suivante.

Le rendu mpl dispose du kwarg style, qui modifie les couleurs et les contours. Consulte la documentation de l'API pour plus de détails.

L'option scale redimensionne le rendu des rendus mpl et latex.

circuit = QuantumCircuit(1)
for _ in range(10):
circuit.h(0)
# limit line length to 40 characters
circuit.draw(output="text", fold=40)
┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐»
q: ┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├»
└───┘└───┘└───┘└───┘└───┘└───┘└───┘»
« ┌───┐┌───┐┌───┐
«q: ┤ H ├┤ H ├┤ H ├
« └───┘└───┘└───┘
# Change the background color in mpl

style = {"backgroundcolor": "lightgreen"}
circuit.draw(output="mpl", style=style)

Output of the previous code cell

# Scale the mpl output to 1/2 the normal size
circuit.draw(output="mpl", scale=0.5)

Output of the previous code cell

Fonction autonome de dessin de circuits

Si tu préfères dessiner un circuit avec une fonction autonome plutôt qu'en tant que méthode d'un objet circuit, tu peux utiliser directement la fonction circuit_drawer(), qui fait partie de l'interface publique stable de qiskit.visualization. Cette fonction se comporte de manière identique à la méthode circuit.draw(), à la différence qu'elle prend un objet circuit comme argument obligatoire.

from qiskit.visualization import circuit_drawer

circuit_drawer(circuit, output="mpl", plot_barriers=False)

Output of the previous code cell

Prochaines étapes

Recommandations