Pular para o conteúdo principal
Este projeto está em fase beta. Encontrou um bug? Abra uma issue no GitHub. Tem uma pergunta ou ideia? Pergunte no Discussions — adoraríamos receber seu feedback!
Como está a qualidade da tradução nesta página?

Visualizar circuits

Versões dos pacotes

O código nesta página foi desenvolvido usando os seguintes requisitos. Recomendamos usar estas versões ou mais recentes.

qiskit[all]~=2.5.2

Muitas vezes é útil visualizar os circuits que você está criando. Use as opções a seguir para exibir circuits do 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

Desenhar um circuito quântico​

A classe QuantumCircuit suporta o desenho de circuits pelo método draw(), ou imprimindo o objeto do circuito. Por padrão, ambos renderizam uma versão em arte ASCII do diagrama do circuito.

Observe que print retorna None, mas tem o efeito colateral de imprimir o diagrama, enquanto QuantumCircuit.draw retorna o diagrama sem efeitos colaterais. Como os notebooks Jupyter exibem a saída da última linha de cada célula, eles parecem ter o mesmo efeito.

# 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​

Uma saída em texto é útil para visualizar rapidamente o resultado durante o desenvolvimento de um circuito, mas não é a opção mais flexível. Existem dois renderizadores alternativos para o circuito quântico. Um usa Matplotlib e o outro usa LaTeX. O renderizador LaTeX requer o pacote qcircuit. Selecione esses renderizadores definindo o argumento "output" para as strings mpl e latex.

dica

Usuários de OSX podem obter os pacotes LaTeX necessários pelo pacote 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

Salvar a saída​

Desenhar um circuito de grande escala inline em um notebook Jupyter pode ser lento ou ilegível. Você pode salvar o diagrama diretamente em um arquivo e depois abri-lo em um visualizador de imagens e ampliar conforme necessário.

# 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 os desenhos do circuito​

Por padrão, o método draw() retorna a imagem renderizada como um objeto e não produz nenhuma saída. 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. Os notebooks Jupyter entendem esses tipos de retorno e os renderizam corretamente, mas ao executar fora do Jupyter, as imagens não serão exibidas automaticamente.

O método draw() possui argumentos opcionais para exibir ou salvar a saída. Quando especificado, o kwarg filename recebe um caminho para o qual salva a saída renderizada. Alternativamente, se você estiver usando as saídas mpl ou latex, pode usar o kwarg interactive para abrir a imagem em uma nova janela (isso nem sempre funcionará de dentro de um notebook).

Personalizar a saída​

Dependendo da saída, há também opções para personalizar o diagrama do circuito.

Desativar barreiras de plot e inverter a ordem dos bits​

As duas primeiras opções são compartilhadas entre todos os três backends. Elas permitem configurar tanto a ordem dos bits quanto se as barreiras serão desenhadas ou não. Podem ser definidas pelos kwargs reverse_bits e plot_barriers, respectivamente. Os exemplos a seguir funcionam com qualquer renderizador; mpl é usado aqui por simplicidade.

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

Personalizações específicas do renderizador​

Algumas opções de personalização disponíveis são específicas a um renderizador.

O argumento fold define uma largura máxima para a saída. No renderizador text, isso define o comprimento das linhas do diagrama antes de ele ser quebrado para a próxima linha. Ao usar o renderizador 'mpl', esse é o número de camadas (visuais) antes de quebrar para a próxima linha.

O renderizador mpl possui o kwarg style, que altera as cores e os contornos. Consulte a documentação da API para mais detalhes.

A opção scale redimensiona a saída dos renderizadores mpl e 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

Função autônoma para desenhar circuits​

Se você tiver uma aplicação na qual prefere desenhar um circuito com uma função autônoma em vez de como método de um objeto Circuit, pode usar diretamente a função circuit_drawer(), que faz parte da interface pública estável de qiskit.visualization. A função se comporta de forma idêntica ao método circuit.draw(), exceto que recebe um objeto Circuit como argumento obrigatório.

from qiskit.visualization import circuit_drawer

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

Output of the previous code cell

Próximos passos​

Recomendações