Portuguese, Brazilian
Idiomas
English
Japanese
German
Korean
Portuguese, Brazilian
French
Shortcuts

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]:
../../_images/tutorials_circuits_advanced_03_advanced_circuit_visualization_7_0.png

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]:
../../_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

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 que displaytext. Além disso, tal como displaytext, 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 matplotlib linestyle 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]:
../../_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 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]:
../../_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.

[ ]: