Saltar al contenido principal

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

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

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
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.

Tenga 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. Seleccione 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. Puede 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á usando las salidas mpl o latex, puede 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.

Deshabilitar barreras de trazado y revertir el orden de bits

Las primeras dos opciones se comparten entre los tres backends. Le permiten configurar tanto los órdenes de bits como si dibuja o no barreras. Estos se pueden establecer mediante el kwarg reverse_bits y el kwarg 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 se envuelva a la siguiente línea. Al usar el renderizador 'mpl', este es el número de capas (visuales) antes de doblar a la siguiente línea.

El renderizador mpl tiene el kwarg style, que cambia los colores y los contornos. Consulte 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 tiene una aplicación donde prefiere dibujar un circuito con una función autónoma en lugar de como un método de un objeto de circuito, puede 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