Portuguese
Idiomas
English
Bengali
French
German
Japanese
Korean
Portuguese
Spanish
Tamil

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

A text output is useful for quickly seeing the output while developing a circuit, but it doesn’t provide the most flexibility in its output. There are two alternative output renderers for the quantum circuit. One uses matplotlib, and the other uses LaTeX, which leverages the qcircuit package. These can be specified by using mpl and latex values for the output kwarg on the draw() method.

[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()

By default, the draw() method returns the rendered image as an object and does not output anything. The exact class returned depends on the output specified: 'text' (the default) returns a TextDrawer object, 'mpl' returns a matplotlib.Figure object, and latex returns a PIL.Image object. Having the return types enables modifying or directly interacting with the rendered output from the drawers. Jupyter notebooks understand these return types and render them for us in this tutorial, but when running outside of Jupyter, you do not have this feature automatically. However, the draw() method has optional arguments to display or save the output. When specified, the filename kwarg takes a path to which it saves the rendered output. Alternatively, if you’re using the mpl or latex outputs, you can leverage the interactive kwarg to open the image in a new window (this will not always work from within a notebook but will be demonstrated anyway).

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 todos os três backends. Eles permitem que você configure ambos os pedidos de bits e se você desenha ou não barreiras. Estes podem ser configurados pelo `reverse_bits kwarg e plot_barriers kwarg, respectivamente. Os exemplos abaixo trabalharão com qualquer serviço de saída; mpl é 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.

[ ]: