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.3.0
É muito útil visualizar os circuits que você está criando. Use as opções a seguir para exibir circuits do Qiskit.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit
Desenhar um Circuit quântico
A classe QuantumCircuit suporta o desenho de circuits pelo método draw(), ou imprimindo o objeto do Circuit. Por padrão, ambos renderizam uma versão em arte ASCII do diagrama do Circuit.
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 Circuit, mas não oferece a maior flexibilidade. Existem dois renderizadores alternativos para o Circuit 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.
Usuários de OSX podem obter os pacotes LaTeX necessários pelo pacote mactex.
# Matplotlib drawing
circuit.draw(output="mpl")
# Latex drawing
circuit.draw(output="latex")
Salvar a saída
Desenhar um Circuit 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")
# Or save a LaTeX rendering
circuit.draw(output="latex", filename="circuit-latex.pdf")
Controlar os desenhos do Circuit
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 Circuit.
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")
# Draw the circuit with reversed bit order
circuit.draw(output="mpl", reverse_bits=True)
# Draw the circuit without barriers
circuit.draw(output="mpl", plot_barriers=False)
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 ser quebrado para a próxima linha. Ao usar o renderizador mpl, esse é o número de camadas (visuais) antes de dobrar 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 escala 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)
# Scale the mpl output to 1/2 the normal size
circuit.draw(output="mpl", scale=0.5)
Função autônoma para desenhar circuits
Se você tiver uma aplicação na qual prefere desenhar um Circuit 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)
Próximos passos
- Veja um exemplo de visualização de Circuit no tutorial Algoritmo de Grover.
- Visualize circuits simples usando o IBM Quantum Composer.
- Visualize o timing do Circuit.
- Consulte a documentação da API de visualizações do Qiskit.