Visualiser les circuits
Le code de cette page a été développé en tenant compte des exigences suivantes. Nous recommandons d'utiliser ces versions ou des versions plus récentes.
qiskit[all]~=2.5.1
Il est souvent utile de voir les circuits que vous créez. Les options suivantes permettent d'afficher les circuits Qiskit.
from qiskit import QuantumCircuitDessiner un circuit quantique
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.
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.
# 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)Output:
┌───┐ ┌─┐
q_0: ┤ H ├───────■──┤M├───
├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
└───┘ └╥┘ ║ ║
c: 3/═══════╩════════╩══╩═
2 0 1
circuit.draw()Output:
┌───┐ ┌─┐
q_0: ┤ H ├───────■──┤M├───
├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
└───┘ └╥┘ ║ ║
c: 3/═══════╩════════╩══╩═
2 0 1
Rendu alternatif
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 et l'autre utilise LaTeX. Le moteur de rendu LaTeX nécessite le paquetage qcircuit. Sélectionnez ces moteurs de rendu en attribuant à l'argument "output" les chaînes de caractères mpl et latex.
Les utilisateurs d'OSX peuvent obtenir les paquets LaTeX nécessaires via le paquet mactex.
# Matplotlib drawing
circuit.draw(output="mpl")Output:
# Latex drawing
circuit.draw(output="latex")Output:
Sauvegarder la sortie
Dessiner un circuit à grande échelle en ligne dans un carnet Jupyter peut être lent ou illisible. Vous pouvez enregistrer le diagramme directement dans un fichier, puis l'ouvrir dans une visionneuse d'images et l'agrandir si nécessaire.
# Save as an image using the Matplotlib drawer
circuit.draw(output="mpl", filename="circuit-mpl.jpeg")Output:
# Or save a LaTeX rendering
circuit.draw(output="latex", filename="circuit-latex.pdf")Output:
Schémas des circuits de commande
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.
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).
Personnaliser la sortie
En fonction de la sortie, il est également possible de personnaliser le schéma de circuit.
Désactiver les barrières de tracé et inverser l'ordre des bits
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.
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:
# Draw the circuit with reversed bit order
circuit.draw(output="mpl", reverse_bits=True)Output:
# Draw the circuit without barriers
circuit.draw(output="mpl", plot_barriers=False)Output:
Personnalisations spécifiques au rendu
Certaines options de personnalisation disponibles sont spécifiques à un moteur de rendu.
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.
Le moteur de rendu mpl possède la fonction style kwarg, qui modifie les couleurs et les contours. Voir la documentation de l'API pour plus de détails.
L'option scale met à l'échelle la sortie des moteurs de rendu 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)Output:
┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐»
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:
# Scale the mpl output to 1/2 the normal size
circuit.draw(output="mpl", scale=0.5)Output:
Fonction autonome de dessin de circuits
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.
from qiskit.visualization import circuit_drawer
circuit_drawer(circuit, output="mpl", plot_barriers=False)Output:
Etapes suivantes
- Voir un exemple de visualisation de circuit dans le tutoriel sur l 'algorithme de Grover.
- Visualisez des circuits simples à l'aide d' IBM Quantum Composer s.
- Visualisez la synchronisation du circuit.
- Consultez la documentation relative à l'API de visualisation Qiskit.