French
Langues
English
Japanese
German
Korean
Portuguese, Brazilian
French
Shortcuts

Note

Cette page a été générée à partir de tutorials/circuits_advanced/3_advanced_circuit_visualization.ipynb.

Exécuter en mode interactif dans le IBM Quantum lab.

Visualisation d’un circuit quantique

[1]:
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister

Dessin d’un circuit quantique

Lors de la construction d’un circuit quantique, le dessin du circuit aide souvent. Cette fonctionnalité est implémentée nativement par un objet ` ` QuantumCircuit ` . Vous pouvez la méthode ` ` print () ` `, ou la méthode ` ` draw () ` ` sur le circuit. Cela donnera une version utilisant les caractères ASCII <https://en.wikipedia.org/wiki/ASCII_art> __ du diagramme du circuit.

[2]:
# 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));
[3]:
print(circuit)
     ┌───┐          ┌─┐
q_0: ┤ H ├───────■──┤M├───
     ├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
     ├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
     └───┘ └╥┘       ║  ║
c_0: ═══════╬════════╩══╬═
            ║           ║
c_1: ═══════╬═══════════╩═
            ║
c_2: ═══════╩═════════════

[4]:
circuit.draw()
[4]:
     ┌───┐          ┌─┐
q_0: ┤ H ├───────■──┤M├───
     ├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
     ├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
     └───┘ └╥┘       ║  ║
c_0: ═══════╬════════╩══╬═
            ║           ║
c_1: ═══════╬═══════════╩═
            ║
c_2: ═══════╩═════════════
                          

Autres manière de dessiner les circuits

Une sortie texte est utile pour un aperçu rapide pendant le développement d’un circuit, mais elle ne fournit pas nécessairement le résultat le plus utile. Il existe deux autres modes d’affichage pour le circuit quantique. L’une utilise matplotlib, et l’autre utilise LaTeX, lequel utilise le package qcircuit. Ces options d’affichage peuvent être spécifiées en utilisant les valeurs mpl ou latex pour le paramètre de mot clef output sur la méthode draw().

[5]:
# Matplotlib Drawing
circuit.draw(output='mpl')
[5]:
../../_images/tutorials_circuits_advanced_03_advanced_circuit_visualization_7_0.png

Contrôle de la sortie de circuit.draw()

Par défaut, la méthode de dessin renvoie l’image affichée en tant qu’objet et ne produit rien. La classe exacte retournée dépend de la sortie spécifiée: text (la valeur par défaut) renvoie un objet TextDrawer, mpl renvoie un objet matplotlib.Figure , et latex retourne un objet PIL.Image. Le fait de connaître les types de retour permet de modifier ou d’interagir directement avec la sortie des moteurs de dessin. Les notebooks Jupyter comprennent ces types de retour et les affichent pour nous dans ce tutoriel, mais en dehors du contexte de Jupyter, cette fonctionnalité n’est pas disponible automatiquement. Cependant, la méthode draw () permet d’utiliser des arguments optionnels pour afficher ou enregistrer la sortie. Lorsqu’il est spécifié, l’argument nommé filename permet de spécifier le dossier vers lequel la sortie est enregistrée. Autrement, si vous utilisez les sorties mpl ou latex, vous pouvez tirer parti de l’argument nommé interactive pour ouvrir l’image dans une nouvelle fenêtre (cela ne fonctionne pas toujours à l’intérieur d’un notebook).

Personnalisation de la sortie

Selon le type de sortie, il y a aussi des options pour personnaliser le schéma du circuit.

Désactiver les barrières de traçage et inverser l’ordre des bits

Les deux premières options sont partagées entre les trois backends. Ils vous permettent de configurer à la fois l’ordre des bits et si vous tracez ou non des barrières. Celles-ci peuvent être définies par le kwarg (argument de mot clé) reverse_bits et le kwarg plot_barriers, respectivement. Les exemples ci-dessous fonctionneront avec n’importe quel backend de sortie; pour être bref, nous illustrons seulement le cas latex.

[8]:
# Draw a new circuit with barriers and more registers

q_a = QuantumRegister(3, name='qa')
q_b = QuantumRegister(5, name='qb')
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);
[9]:
# Draw the circuit
circuit.draw(output='mpl')
[9]:
../../_images/tutorials_circuits_advanced_03_advanced_circuit_visualization_11_0.png
[10]:
# Draw the circuit with reversed bit order
circuit.draw(output='mpl', reverse_bits=True)
[10]:
../../_images/tutorials_circuits_advanced_03_advanced_circuit_visualization_12_0.png
[11]:
# Draw the circuit without barriers
circuit.draw(output='mpl', plot_barriers=False)
[11]:
../../_images/tutorials_circuits_advanced_03_advanced_circuit_visualization_13_0.png
[12]:
# Draw the circuit without barriers and reverse bit order
circuit.draw(output='mpl', plot_barriers=False, reverse_bits=True)
[12]:
../../_images/tutorials_circuits_advanced_03_advanced_circuit_visualization_14_0.png

Personnalisations spécifiques au backend

Certaines options de personnalisation disponibles peuvent être spécifiques à un type de sortie. La valeur de l’argument de mot clef line_length pour la sortie de type texte peut être utilisée pour définir une largeur maximale pour la sortie. Lorsqu’un diagramme est plus large que le maximum, le dessin se poursuit à la ligne suivante. Pour le type de sortie mpl l’argument style peut aussi être utilisé pour personnaliser la sortie. L’option scale est utilisée par les modes de sortie mpl et latex pour réduire la taille de l’image de sortie avec un facteur d’ajustement multiplicatif. L’argument style est spécifié à l’aide d’un dict (dictionnaire Python) avec de multiples options, offrant un haut niveau de flexibilité pour changer les couleurs, le rendu du texte pour différents types de portes, différents styles de lignes, etc. Les options disponibles sont les suivantes:

  • ** textcolor** (str): Code de couleur à utiliser pour le texte. La valeur par défaut est '#000000'

  • ** subtextcolor** (str): Code de couleur à utiliser pour le sous-texte. La valeur par défaut est '#000000'

  • ** linecolor** (str): Code de couleur à utiliser pour les lignes. La valeur par défaut est '#000000'

  • ** creglinecolor** (str): Code de couleur à utiliser pour les lignes des registres classiques. La valeur par défaut est '#778899'

  • ** gatetextcolor** (str): Code de couleur à utiliser pour le texte dans les portes. La valeur par défaut est '#000000'

  • ** gatefacecolor** (str): Code de couleur à utiliser pour les portes. La valeur par défaut est ` “#ffffff” ` `

  • ** barrierfacecolor** (str): Code de couleur à utiliser pour les barrières. La valeur par défaut est '#bdbdbd'

  • backgroundcolor (str): Le code de couleur à utiliser pour l’arrière-plan. Par défaut, '#ffffff'

  • ** fontsize** (int): taille de police à utiliser pour le texte. La valeur par défaut est 13

  • ** fontsize** (int): taille de police à utiliser pour le texte de petite taille. La valeur par défaut est 8

  • ** displaytext** (dict): dictionnaire contenant le texte à utiliser pour chaque type d’élément dans la visualisation de sortie. Les valeurs par défaut sont :

    'id': 'id',
    'u0': 'U_0',
    'u1': 'U_1',
    'u2': 'U_2',
    'u3': 'U_3',
    'x': 'X',
    'y': 'Y',
    'z': 'Z',
    'h': 'H',
    's': 'S',
    'sdg': 'S^\\dagger',
    't': 'T',
    'tdg': 'T^\\dagger',
    'rx': 'R_x',
    'ry': 'R_y',
    'rz': 'R_z',
    'reset': '\\left|0\\right\\rangle'
    

    Vous devez spécifier toutes les valeurs nécessaires si vous l’utilisez. Un dictionnaire incomplet passé donnera des résultats non garantis, voire des erreurs.

  • ** displaycolor** (dict): Les codes de couleur à utiliser pour chaque élément de circuit. Par défaut, toutes les valeurs par défaut sont celles de gatefacecolor et les mots clés sont les mêmes que pour displaytext. Aussi, comme pour displaytext, un dictionnaire incomplet passé donnera des résultats non garantis, voire des erreurs.

  • ** latexdrawerstyle** (bool): Lorsqu’il est défini sur True, le mode LaTeX qui trace les portes comme le mode de sortie latex est activé.

  • ** usepiformat** (bool): Lorsqu’il est défini sur True, les sorties sont exprimées en radians.

  • ** fold** (int): Le nombre d’éléments de circuit présentés sur une largeur d’affichage. La valeur par défaut est 20.

  • cregbundle (bool): Lorsqu’il est défini sur True, les registres classiques sont regroupés.

  • ** showindex** (bool): Lorsqu’il est défini sur True, un index est dessiné.

  • ** compres** (bool): Si la valeur est True, dessine un circuit compressé.

  • ** figwidth** (int): La largeur maximale (en pouces) de la figure de sortie.

  • ** dpi** (int): Le DPI (résolution en pixel par pouce) à utiliser pour l’image de sortie. La valeur par défaut est 150.

  • ** creglinestyle** (str): Définit le style de ligne à utiliser pour les registres classiques. Les choix sont 'solid', 'doublet', ou n’importe quelle valeur valide de matplotlib pour l’argument de mot clef linestyle. La valeur par défaut est doublet.

[13]:
# Set line length to 80 for above circuit
circuit.draw(output='text')
[13]:
            ░ ┌───┐ ░    ┌─┐
qa_0: ──────░─┤ H ├─░────┤M├───────────────────────────
      ┌───┐ ░ ├───┤ ░    └╥┘┌─┐
qa_1: ┤ X ├─░─┤ H ├─░─────╫─┤M├────────────────────────
      └───┘ ░ ├───┤ ░     ║ └╥┘┌─┐
qa_2: ──────░─┤ H ├─░─────╫──╫─┤M├─────────────────────
            ░ ├───┤ ░     ║  ║ └╥┘    ░ ┌─┐
qb_0: ──────░─┤ H ├─■─────╫──╫──╫──X──░─┤M├────────────
      ┌───┐ ░ ├───┤ │     ║  ║  ║  │  ░ └╥┘┌─┐
qb_1: ┤ X ├─░─┤ H ├─X─────╫──╫──╫──┼──░──╫─┤M├─────────
      ├───┤ ░ ├───┤ │     ║  ║  ║  │  ░  ║ └╥┘┌─┐
qb_2: ┤ X ├─░─┤ H ├─X──■──╫──╫──╫──┼──░──╫──╫─┤M├──────
      └───┘ ░ ├───┤    │  ║  ║  ║  │  ░  ║  ║ └╥┘┌─┐
qb_3: ──────░─┤ H ├────X──╫──╫──╫──■──░──╫──╫──╫─┤M├───
      ┌───┐ ░ ├───┤    │  ║  ║  ║  │  ░  ║  ║  ║ └╥┘┌─┐
qb_4: ┤ X ├─░─┤ H ├────X──╫──╫──╫──X──░──╫──╫──╫──╫─┤M├
      └───┘ ░ └───┘       ║  ║  ║     ░  ║  ║  ║  ║ └╥┘
c0_0: ════════════════════╩══╬══╬════════╬══╬══╬══╬══╬═
                             ║  ║        ║  ║  ║  ║  ║
c0_1: ═══════════════════════╩══╬════════╬══╬══╬══╬══╬═
                                ║        ║  ║  ║  ║  ║
c0_2: ══════════════════════════╩════════╬══╬══╬══╬══╬═
                                         ║  ║  ║  ║  ║
c1_0: ═══════════════════════════════════╩══╬══╬══╬══╬═
                                            ║  ║  ║  ║
c1_1: ══════════════════════════════════════╩══╬══╬══╬═
                                               ║  ║  ║
c1_2: ═════════════════════════════════════════╩══╬══╬═
                                                  ║  ║
c1_3: ════════════════════════════════════════════╩══╬═
                                                     ║
c1_4: ═══════════════════════════════════════════════╩═
                                                       
[14]:
# Change the background color in mpl

style = {'backgroundcolor': 'lightgreen'}

circuit.draw(output='mpl', style=style)
[14]:
../../_images/tutorials_circuits_advanced_03_advanced_circuit_visualization_17_0.png
[15]:
# Scale the mpl output to 1/2 the normal size
circuit.draw(output='mpl', scale=0.5)
[15]:
../../_images/tutorials_circuits_advanced_03_advanced_circuit_visualization_18_0.png

circuit_drawer() en tant que fonction

Si vous avez une application où vous préférez tracer un circuit avec une fonction autonome au lieu d’utiliser un méthode sur un objet de type circuit, vous pouvez utiliser directement la fonction circuit_drawer(), qui fait partie de l’interface publique stable de qiskit.tools.visualisation. La fonction se comporte de façon identique à la méthode circuit.draw(), sauf qu’elle attend un argument de type circuit.

Note: Dans Qiskit Terra < = 0.7, la fonction circuit_drawer() utilise pr défaut le type de sortie latex, en particulier la version 0.6.x inclut une substitution à mpl si la sortie latex échoue pour quelque raison que ce soit. A partir de l’édition 0.8, l’affichage par défaut est en mode text.

[17]:
from qiskit.tools.visualization import circuit_drawer
[18]:
circuit_drawer(circuit, output='mpl', plot_barriers=False)
[18]:
../../_images/tutorials_circuits_advanced_03_advanced_circuit_visualization_21_0.png
[19]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
QiskitNone
Terra0.15.0
Aer0.5.1
IgnisNone
AquaNone
IBM Q Provider0.7.0
System information
Python3.8.2 (default, Mar 26 2020, 10:43:30) [Clang 4.0.1 (tags/RELEASE_401/final)]
OSDarwin
CPUs4
Memory (Gb)16.0
Fri May 08 08:43:36 2020 EDT

This code is a part of Qiskit

© Copyright IBM 2017, 2020.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

[ ]: