Visualizar circuitos
O código desta página foi desenvolvido usando os seguintes requisitos. Recomendamos o uso dessas versões ou de versões mais recentes.
qiskit[all]~=2.5.1
Muitas vezes é útil ver os circuitos que você está criando. Use as seguintes opções para exibir os circuitos do Qiskit.
from qiskit import QuantumCircuitDesenhe um circuito quântico
A classe QuantumCircuit suporta o desenho de circuitos por meio do método draw() ou da impressão do objeto de circuito. Por padrão, ambos renderizam uma versão artística ASCII do diagrama de 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)Output:
┌───┐ ┌─┐
q_0: ┤ H ├───────■──┤M├───
├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
└───┘ └╥┘ ║ ║
c: 3/═══════╩════════╩══╩═
2 0 1
circuit.draw()Output:
┌───┐ ┌─┐
q_0: ┤ H ├───────■──┤M├───
├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
└───┘ └╥┘ ║ ║
c: 3/═══════╩════════╩══╩═
2 0 1
Renderizadores alternativos
Uma saída de texto é útil para ver rapidamente a saída durante o desenvolvimento de um circuito, mas não oferece a maior flexibilidade. Há dois renderizadores de saída 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" como as cadeias de caracteres mpl e latex.
Os usuários do OSX podem obter os pacotes LaTeX necessários por meio do pacote mactex.
# Matplotlib drawing
circuit.draw(output="mpl")Output:
# Latex drawing
circuit.draw(output="latex")Output:
Salvar Saída
Desenhar um circuito de grande escala em linha em um notebook Jupyter pode ser lento ou ilegível. Você pode salvar o diagrama diretamente em um arquivo e, em seguida, abri-lo em um visualizador de imagens e aumentar o zoom conforme necessário.
# Save as an image using the Matplotlib drawer
circuit.draw(output="mpl", filename="circuit-mpl.jpeg")Output:
# Or save a LaTeX rendering
circuit.draw(output="latex", filename="circuit-latex.pdf")Output:
Desenhos do circuito de controle
Por padrão, o método draw() retorna a imagem renderizada como um objeto e não produz 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 . Os notebooks Jupyter entendem esses tipos de retorno e os renderizam corretamente, mas quando executados fora do Jupyter, as imagens não serão exibidas automaticamente.
O método draw() tem argumentos opcionais para exibir ou salvar a saída. Quando especificado, o filename kwarg usa um caminho no qual salva a saída renderizada. Como alternativa, se você estiver usando as saídas mpl ou latex , poderá usar o kwarg interactive para abrir a imagem em uma nova janela (isso nem sempre funcionará em um notebook).
Personalizar a saída
Dependendo da saída, também há opções para personalizar o diagrama do circuito.
Desativar barreiras de plotagem e inverter a ordem dos bits
As duas primeiras opções são compartilhadas entre os três back-ends. Eles permitem que você configure as ordens de bits e se você desenha ou não barreiras. Eles podem ser definidos por reverse_bits kwarg e plot_barriers kwarg, respectivamente. Os exemplos a seguir funcionam com qualquer renderizador de saída; mpl é usado aqui para fins de brevidade.
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:
# Draw the circuit with reversed bit order
circuit.draw(output="mpl", reverse_bits=True)Output:
# Draw the circuit without barriers
circuit.draw(output="mpl", plot_barriers=False)Output:
Personalizações específicas do renderizador
Algumas opções de personalização disponíveis são específicas de 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 passar para a próxima linha. Ao usar o renderizador 'mpl', esse é o número de camadas (visuais) antes de passar para a próxima linha.
O renderizador mpl tem o style kwarg, que altera as cores e os contornos. Consulte a documentação da API para obter mais detalhes.
A opção scale dimensiona 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)Output:
┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐»
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:
# Scale the mpl output to 1/2 the normal size
circuit.draw(output="mpl", scale=0.5)Output:
Função autônoma de desenho de circuitos
Se você tiver um aplicativo em que prefira desenhar um circuito com uma função autônoma em vez de um método de um objeto de circuito, poderá 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 pelo fato de receber um objeto de circuito como argumento obrigatório.
from qiskit.visualization import circuit_drawer
circuit_drawer(circuit, output="mpl", plot_barriers=False)Output:
Próximas etapas
- Veja um exemplo de visualização de circuito no tutorial do Algoritmo de Grover.
- Visualize circuitos simples usando IBM Quantum Composer.
- Visualize o tempo do circuito.
- Consulte a documentação da API de visualizações do Qiskit.