Spanish
Idiomas
English
Bengali
French
German
Japanese
Korean
Portuguese
Spanish
Tamil

Nota

Esta página fue generada a partir de tutorials/circuits_advanced/03_advanced_circuit_visualization.ipynb.

Visualizando un Circuito Cuántico

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

Dibujar un Circuito Cuántico

Al construir un circuito cuántico, a menudo es útil dibujar el circuito. Esto es soportado de forma nativa por un objeto QuantumCircuit. Puedes llamar a print() en el circuito o llamar al método draw() en el objeto. Esto generará una versión de arte ASCII del diagrama de circuito.

[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: ═══════╩═════════════
                          

Graficadores Alternativos para Circuitos

Una salida de texto es útil para ver rápidamente el resultado mientras se desarrolla un circuito, pero no provee la mayor flexibilidad en su resultado de salida. Hay dos graficadores de salida alternativos para el circuito cuántico. Uno usa matplotlib, y el otro usa LaTeX, que aprovecha el paquete qcircuit. Estos pueden ser especificados utilizando los valores mpl y latex para el kwarg output en el método draw().

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

Controlar la salida de circuit.draw()

Por defecto, el método draw() devuelve la imagen renderizada como uno objeto y no muestra nada. La clase exacta del objeto devuelto depende de la salida especificada: 'text' (la opción predeterminada) devuelve un objeto TextDrawer, 'mpl' devuelve un objeto matplotlib.Figure y latex devuelve un objeto PIL.Image. Conocer los tipos de salida permite modificar o interactuar directamente con las salidas renderizadas. Los cuadernos de Jupyter entienden todos los tipos de salida y los renderizan por nosotros en este tutorial, pero al ejecutar fuera de Jupyter esta función no está disponible automáticamente. No obstante, el método draw() tiene argumentos opcionales para mostrar o guardar la salida. Cuando se especifica, el kwarg filename toma una ruta en la que se guarda la salida renderizada. De forma alternativa, si se están utilizando las salidas mpl o latex, puedes aprovechar el kwarg interactive para mostrar la imagen en una nueva ventana (esto no funcionará siempre dentro de un cuaderno, pero se demuestra de todos modos).

Personalizar la salida

Dependiendo de la salida, también hay opciones que permiten personalizar el renderizado del diagrama del circuito.

Desactivar la visualización de barreras e invertir el orden de los bits

Las dos primeras opciones se comparten entre los tres backends. Te permiten configurar tanto el orden de bits como si dibujas o no barreras. Estos se pueden establecer mediante el kwarg reverse_bits y el kwarg plot_barriers, respectivamente. Los ejemplos siguientes funcionarán con cualquier backend de salida; mpl se utiliza aquí para ser breves.

[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

Personalizaciones específicas del backend

Algunas opciones de personalización son específicas para un backend. El kwarg line_length para el backend text puede ser utilizado para establecer un ancho máximo para la salida. Cuando un diagrama es más ancho que el máximo especificado, el diagrama continuará en la siguiente línea. El backend mpl tiene el kwarg style, el cual se usa para personalizar el output. La opción scale se utiliza en los backends mpl y latex para escalar el tamaño de la imagen de salida con un factor de ajuste multiplicativo. El kwarg style toma un dict con múltiples opciones, ofreciendo un alto nivel de flexibilidad para cambiar colores, cambiar el texto renderizado para diferentes tipos de compuertas, diferentes estilos de línea, etc. Las opciones disponibles son:

  • textcolor (str): El código de color a utilizar para el texto. El valor predeterminado es '#000000'

  • subtextcolor (str): El código de color a utilizar para el subtexto. El valor predeterminado es '#000000'

  • linecolor (str): El código de color a utilizar para las líneas. El valor predeterminado es '#000000'

  • creglinecolor (str): El código de color a utilizar para las líneas del los registros clásicos '#778899'

  • gatetextcolor (str): El código de color a utilizar para el texto de las compuertas '#000000'

  • gatefacecolor (str): El código de color a utilizar para las compuertas. El valor predeterminado es '#ffffff'

  • barrierfacecolor (str): El código de color a utilizar para las barreras. El valor predeterminado es '#bdbdbd'

  • backgroundcolor (str): El código de color a utilizar para el fondo. El valor predeterminado es '#ffffff'

  • fontsize (int): El tamaño de fuente a utilizar para el texto. El valor predeterminado es 13

  • subfontsize (int): El tamaño de fuente a utilizar para el subtexto. El valor predeterminado es 8

  • displaytext (dict): Un diccionario del texto a utilizar para cada tipo de elemento en la visualización de salida. Los valores predeterminados son:

    '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'
    

    Debes especificar todos los valores necesarios si se utiliza esto. Un diccionario incompleto no está previsto.

  • displaycolor (dict): Los códigos de color a utilizar para cada elemento del circuito. Por defecto, todos los valores predeterminados coinciden con el valor de gatefacecolor y las palabras clave son las mismas de displaytext. Al igual que con displaytext un diccionario incompleto no está previsto.

  • latexdrawerstyle (bool): Cuando se establece en True, la modalidad LaTeX que diseña las compuertas como la modalidad de salida latex es habilitada.

  • usepiformat (bool): Cuando se establece en True, se usan radianes para la salida.

  • fold (int): El número de elementos de circuito presentados a lo largo de la visualización. El valor predeterminado es 20

  • cregbundle (bool): Si se establece en True, se agrupan los registros clásicos.

  • showindex (bool): Si se establece en True, dibuja un índice.

  • compress (bool): Si se establece en True, dibuja un circuito comprimido.

  • figwidth (int): El ancho máximo (en pulgadas) para la figura mostrada.

  • dpi (int): La resolución (en puntos por pulgada, DPI) a utilizar en la figura mostrada. El valor predeterminado es 150.

  • creglinestyle (str): El estilo de línea a utilizar para los registros clásicos. Las opciones son 'solid', 'doublet', o cualquier valor que pueda tomar el kwarg linestyle de matplotlib. El valor predeterminado es 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() como función

Si tienes una aplicación en la que prefieres dibujar un circuito con una función autónoma en lugar de como un método de un objeto circuito, puedes usar directamente la función circuit_drawer(), que es parte de la interfaz estable pública de qiskit.tools.visualization. La función se comporta de manera idéntica al método circuit.draw(), excepto que toma un objeto circuito como argumento requerido.

Nota: En Qiskit Terra <= 0.7, el comportamiento por defecto de la función circuit_drawer() es utilizar un backend de salida latex, y en 0.6.x incluye una sustitución a mpl en caso de que latex falle por alguna razón. A partir de la versión > 0.7, la visualización predeterminada cambia a texto de salida.

[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.

[ ]: