Skip to main content
IBM Quantum Platform

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.0
    

Muitas vezes é útil ver os circuitos que você está criando. Use as seguintes opções para exibir os circuitos do Qiskit.

from qiskit import QuantumCircuit

Desenhe 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.

Tip

Os usuários do OSX podem obter os pacotes LaTeX necessários por meio do pacote mactex.

# Matplotlib drawing
circuit.draw(output="mpl")

Output:

Output of the previous code cell
# Latex drawing
circuit.draw(output="latex")

Output:

Output of the previous code cell

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:

Output of the previous code cell
# Or save a LaTeX rendering
circuit.draw(output="latex", filename="circuit-latex.pdf")

Output:

Output of the previous code cell

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:

Output of the previous code cell
# Draw the circuit with reversed bit order
circuit.draw(output="mpl", reverse_bits=True)

Output:

Output of the previous code cell
# Draw the circuit without barriers
circuit.draw(output="mpl", plot_barriers=False)

Output:

Output of the previous code cell

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:

Output of the previous code cell
# Scale the mpl output to 1/2 the normal size
circuit.draw(output="mpl", scale=0.5)

Output:

Output of the previous code cell

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:

Output of the previous code cell

Próximas etapas

Recomendações
Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.