Nota
Esta página foi gerada a partir de tutorials/circuits_advanced/03_advanced_circuit_visualization.ipynb.
Execute interativamente no IBM Quantum lab.
Visualizando um Circuito Quântico¶
[1]:
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister
Desenhando um Circuito Quântico¶
Ao construir um circuito quântico, muitas vezes ajuda a desenhar o circuito. Isso é suportado nativamente por um objeto QuantumCircuit
. Você pode chamar print()
no circuito, ou chamar o método draw()
no objeto. Isto irá renderizar uma versão de arte ASCII do 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: ═══════╩═════════════
Renderizadores Alternativos para Circuitos¶
Uma saída de texto é útil para ver rapidamente a saída quando estiver desenvolvendo um circuito, mas não fornece a maior flexibilidade em sua saída. Existem dois renderizadores de saída alternativos para o circuito quântico. Um usa matplotlib, e o outro usa LaTeX, que aproveita o qcircuit package. Estes podem ser especificados usando valores de mpl
e latex
para o método output
kwarg no draw().
[5]:
# Matplotlib Drawing
circuit.draw(output='mpl')
[5]:

Controlando a saída do circuit.draw()¶
Por padrão, o método draw retorna a imagem renderizada como um objeto e não mostra nada. A classe exata retornada depende da saída especificada: 'text'
(o padrão) retorna um objeto TextDrawer
, 'mpl'
retorna um objeto matplotlib.Figure
, e latex
retorna um objeto PIL.Image
. Ter os tipos de retorno permite modificar ou interagir diretamente com a saída renderizada a partir dos renderizadores. Os notebooks do Jupyter entendem esses tipos de retornos e podem renderiza-los para nós neste tutorial, mas quando estiver executando fora de Jupyter, você não tem esse recurso automaticamente. No entanto, o método draw()
tem argumentos opcionais para exibir ou salvar a saída. Quando especificado, o kwarg filename
recebe um caminho no qual ele salva a saída renderizada. Como alternativa, se você estiver usando as saídas mpl
ou latex
, você pode aproveitar o kwarg interactive
para abrir a imagem em uma nova janela (isso nem sempre funcionará de dentro de um notebook mas será demonstrado de qualquer maneira).
Customizando a saída¶
Dependendo da saída, há também opções para customizar o diagrama de circuito renderizado pelo circuito.
Desabilitar Barreiras de Plotagem e Ordem de Bits de Reversão¶
As duas primeiras opções são compartilhadas entre os três backends. Eles permitem que se configure as ordens de bits e se cria ou não barreiras. Estes podem ser definidos pelo kit reverse_bits
e plot_barriers
, respectivamente. Os exemplos abaixo funcionarão com qualquer backend de saída; latex
é usado aqui para brevidade.
[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]:

Customizações específicas do backend¶
Algumas opções de customização disponíveis são específicas para um backend. O line_length
kwarg para o texto
backend pode ser usado para configurar uma largura máxima para a saída. Quando um diagrama é mais largo do que o máximo, ele ficará contigo no diagrama abaixo. O backend mpl
tem o estilo
kwarg, que é usado para customizar a saída. A opção scale
é utilizada pelos backends mpl
e látex
, para escalar o tamanho da imagem de saída com um fator de ajuste multiplicativo. O style
kwarg leva em um dict
, com várias opções, fornecendo um alto nível de flexibilidade para alteração de cores, alteração de texto renderizado para diferentes tipos de gates, estilos de linha diferentes, etc. As opções disponíveis são:
textcolor (str): O código de cores a ser usado para o texto. O padrão é
'#000000'
subtextcolor (str): O código de cores a ser usado para subtexto. O padrão é
'#000000'
linecolor (str): O código de cores a usar para linhas. O padrões é
'#000000'
creglinecolor (str): O código de cores a ser usado para as linhas clássicas de registro
'#778899'
gatetextcolor (str): O código de cores a ser usado no texto do gate
'#000000'
gatefacecolor (str): O código de cores a ser usado para gates. O padrão é
'#ffffff'
barrierfacecolorr (str): O código de cores a ser usado para barreiras. O padrão é
'#bdbdbd'
backgroundcolor (str): O código de cores a ser usado no plano de fundo. O padrão é
'#ffffff'
fontsize (int): O tamanho da fonte a ser usado para o texto. O padrão é 13
subfontsize (int): O tamanho da fonte a ser usado para subtexto. O padrão é 8
displaytext (dit): Um dicionário do texto a ser usado para cada tipo de elemento na visualização de saída. Os valores padrão são:
'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'
Você deve especificar todos os valores necessários se estiver usando isso. Não há nenhum provisionamento quando passado um dicionário incompleto.
displaycolor (ditado): Os códigos das cores a serem usados para cada elemento do circuito. Por padrão, todos os valores padrão para o valor de
gatefaclabelor
e as chaves são as mesmas quedisplaytext
. Além disso, tal comodisplaytext
, não há nenhum provisionamento quando passado um dicionário incompleto.latexdrawerstyle (bool): Quando configurado como True, ativa o modo LaTeX, que desenhará gates como os modos de saída
látex
.usepiformat (bool): Quando configurado como True, use radianos para saída.
fold (int): O número de elementos de circuito em que dobrar o circuito. O padrão é 20
cregbundle (bool): Se definido como True, registros clássicos do bundle.
showindex (bool): Se definido True, desenha um índice.
compress (bool): Se definido True, desenhe um circuito comprimido.
figwidth (int): A largura máxima (em polegadas) para a figura de saída.
dpi (int): O DPI a ser usado para a imagem de saída. O padrão é 150.
creglinestyle (str): O estilo da linha a ser usado para registros clássicos. As opções são
'solid'
,'doublet'
, ou qualquer valor matplotliblinestyle
kwarg. O padrão é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]:

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

circuit_drawer() como função¶
Se você tem um aplicativo onde você prefere desenhar um circuito com uma função auto-contida em vez de um método de um objeto de circuito, você pode usar diretamente a função circuit_drawer()
, que faz parte da interface pública estável de qiskit.tools.visualization
. A função se comporta de forma idêntica ao método circuit.draw()
, exceto que recebe um objeto de circuito como argumento necessário.
Nota: No Qiskit Terra <= 0.7, o comportamento padrão para a função circuit_drawer() é usar o serviço de saida do latex, e na 0.6.x que inclui um fallback para mpl se o latex falhar por qualquer motivo. Começando com o release > 0.7, o padrão muda para a saída de texto.
[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.
[ ]: