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]:

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]:

[10]:
# Draw the circuit with reversed bit order
circuit.draw(output='mpl', reverse_bits=True)
[10]:

[11]:
# Draw the circuit without barriers
circuit.draw(output='mpl', plot_barriers=False)
[11]:

[12]:
# Draw the circuit without barriers and reverse bit order
circuit.draw(output='mpl', plot_barriers=False, reverse_bits=True)
[12]:

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 dedisplaytext
. Al igual que condisplaytext
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 kwarglinestyle
de matplotlib. El valor predeterminado esdoublet
.
[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]:

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

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]:

[19]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright
Version Information
Qiskit Software | Version |
---|---|
Qiskit | None |
Terra | 0.15.0 |
Aer | 0.5.1 |
Ignis | None |
Aqua | None |
IBM Q Provider | 0.7.0 |
System information | |
Python | 3.8.2 (default, Mar 26 2020, 10:43:30) [Clang 4.0.1 (tags/RELEASE_401/final)] |
OS | Darwin |
CPUs | 4 |
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.
[ ]: