Saltar al contenido principal
Este proyecto está en fase beta. ¿Encontraste un error? Abre un issue en GitHub. ¿Tienes una pregunta o una idea? Pregunta en Discussions — ¡nos encantaría tu opinión!
¿Cómo es la calidad de la traducción en esta página?

Visualizar circuitos

Versiones de paquetes

El código en esta página se desarrolló utilizando los siguientes requisitos. Recomendamos usar estas versiones o versiones más recientes.

qiskit[all]~=2.5.2

A menudo es útil ver los circuitos que estás creando. Usa las siguientes opciones para mostrar circuitos de Qiskit.

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"qiskit": "qiskit"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit import QuantumCircuit

Dibujar un circuito cuántico​

La clase QuantumCircuit admite dibujar circuitos a través del método draw(), o imprimiendo el objeto de circuito. Por defecto, ambos representan una versión de arte ASCII del diagrama del circuito.

Ten en cuenta que print devuelve None pero tiene el efecto secundario de imprimir el diagrama, mientras que QuantumCircuit.draw devuelve el diagrama sin efectos secundarios. Dado que los notebooks de Jupyter muestran la salida de la última línea de cada celda, parecen tener el mismo efecto.

# 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

Renderizadores alternativos​

Una salida de texto es útil para ver rápidamente la salida mientras se desarrolla un circuito, pero no proporciona la mayor flexibilidad. Hay dos renderizadores de salida alternativos para el circuito cuántico. Uno usa Matplotlib y el otro usa LaTeX. El renderizador LaTeX requiere el paquete qcircuit. Selecciona estos renderizadores estableciendo el argumento "output" en las cadenas mpl y latex.

consejo

Los usuarios de OSX pueden obtener los paquetes LaTeX requeridos a través del paquete 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

Guardar la salida​

Dibujar un circuito a gran escala en línea en un notebook de Jupyter puede ser lento o ilegible. Puedes guardar el diagrama directamente en un archivo, luego abrirlo en un visor de imágenes y hacer zoom según sea necesario.

# 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

Controlar los dibujos de circuitos​

Por defecto, el método draw() devuelve la imagen renderizada como un objeto y no produce ninguna salida. La clase exacta devuelta depende de la salida especificada: 'text' (el valor predeterminado) devuelve un objeto TextDrawer, 'mpl' devuelve un objeto matplotlib.Figure, y latex devuelve un objeto PIL.Image. Los notebooks de Jupyter entienden estos tipos de retorno y los renderizan correctamente, pero cuando se ejecuta fuera de Jupyter, las imágenes no se mostrarán automáticamente.

El método draw() tiene argumentos opcionales para mostrar o guardar la salida. Cuando se especifica, el kwarg filename toma una ruta a la que guarda la salida renderizada. Alternativamente, si estás usando las salidas mpl o latex, puedes usar el kwarg interactive para abrir la imagen en una nueva ventana (esto no siempre funcionará desde dentro de un notebook).

Personalizar la salida​

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

Ocultar las barreras e invertir el orden de los bits​

Las primeras dos opciones se comparten entre los tres backends. Te permiten configurar tanto el orden de los bits como si dibujas o no barreras. Estas se pueden establecer mediante los kwargs reverse_bits y plot_barriers, respectivamente. Los siguientes ejemplos funcionan con cualquier renderizador de salida; mpl se usa aquí por brevedad.

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

Personalizaciones específicas del renderizador​

Algunas opciones de personalización disponibles son específicas de un renderizador.

El argumento fold establece un ancho máximo para la salida. En el renderizador text, esto establece la longitud de las líneas del diagrama antes de que pase a la línea siguiente. Al usar el renderizador 'mpl', este es el número de capas (visuales) antes de continuar en la línea siguiente.

El renderizador mpl tiene el kwarg style, que cambia los colores y los contornos. Consulta la documentación de la API para más detalles.

La opción scale escala la salida de los renderizadores mpl y 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

Función independiente de dibujo de circuitos​

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

from qiskit.visualization import circuit_drawer

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

Output of the previous code cell

Próximos pasos​

Recomendaciones