Skip to main content
IBM Quantum Platform

Visualizza i circuiti

  • Il codice di questa pagina è stato sviluppato in base ai seguenti requisiti. Si consiglia di utilizzare queste versioni o versioni più recenti.

    qiskit[all]~=2.5.1
    

Spesso è utile vedere i circuiti che si stanno creando. Utilizzare le seguenti opzioni per visualizzare i circuiti Qiskit.

from qiskit import QuantumCircuit

Disegna un circuito quantistico

La classe QuantumCircuit supporta il disegno dei circuiti attraverso il metodo draw() o la stampa dell'oggetto circuito. Per impostazione predefinita, entrambi visualizzano una versione artistica ASCII dello schema circuitale.

Si noti che print restituisce None ma ha come effetto collaterale la stampa del diagramma, mentre QuantumCircuit.draw restituisce il diagramma senza effetti collaterali. Poiché i taccuini Jupyter visualizzano l'output dell'ultima riga di ogni cella, sembrano avere lo stesso effetto.

# 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 

Renderizzatori alternativi

Un'uscita di testo è utile per visualizzare rapidamente l'output durante lo sviluppo di un circuito, ma non offre la massima flessibilità. Esistono due rendering alternativi per il circuito quantistico. Uno usa Matplotlib e l'altro usa LaTeX. Il renderer LaTeX richiede il pacchetto qcircuit. Selezionare questi rendering impostando l'argomento "output" sulle stringhe mpl e latex.

Tip

Gli utenti di OSX possono ottenere i pacchetti LaTeX necessari attraverso il pacchetto 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

Salva output

Disegnare un circuito su larga scala in linea in un notebook Jupyter può essere lento o illeggibile. È possibile salvare il diagramma direttamente in un file, quindi aprirlo in un visualizzatore di immagini e ingrandirlo come necessario.

# 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

Schemi dei circuiti di controllo

Per impostazione predefinita, il metodo draw() restituisce l'immagine renderizzata come oggetto e non produce alcun risultato. La classe esatta restituita dipende dall'output specificato: 'text' (l'impostazione predefinita) restituisce un oggetto TextDrawer , 'mpl' restituisce un oggetto matplotlib.Figure e latex restituisce un oggetto PIL.Image . I notebook Jupyter comprendono questi tipi di ritorno e li rendono correttamente, ma quando vengono eseguiti al di fuori di Jupyter, le immagini non vengono visualizzate automaticamente.

Il metodo draw() ha argomenti opzionali per visualizzare o salvare l'output. Se specificato, il kwarg filename prende un percorso in cui salvare l'output renderizzato. In alternativa, se si utilizzano le uscite mpl o latex , è possibile utilizzare il kwarg interactive per aprire l'immagine in una nuova finestra (questo non funziona sempre all'interno di un blocco note).

Personalizza l'output

A seconda dell'uscita, è possibile personalizzare lo schema elettrico.

Disabilita le barriere di trama e inverti l'ordine dei bit

Le prime due opzioni sono condivise da tutti e tre i backend. Consentono di configurare sia l'ordine dei bit che il disegno o meno delle barriere. Questi possono essere impostati rispettivamente con i comandi reverse_bits kwarg e plot_barriers kwarg. Gli esempi seguenti funzionano con qualsiasi renderer di output; mpl è usato qui per brevità.

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

Personalizzazioni specifiche del renderizzatore

Alcune opzioni di personalizzazione disponibili sono specifiche per un renderer.

L'argomento fold imposta una larghezza massima per l'uscita. Nel renderer text , questo parametro imposta la lunghezza delle linee del diagramma prima di passare alla linea successiva. Quando si usa il renderer 'mpl', questo è il numero di livelli (visivi) prima di passare alla riga successiva.

Il renderer mpl ha il kwarg style , che modifica i colori e i contorni. Per maggiori dettagli, consultare la documentazione API.

L'opzione scale ridimensiona l'output dei renderer 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

Funzione autonoma di disegno dei circuiti

Se si dispone di un'applicazione in cui si preferisce disegnare un circuito con una funzione autonoma invece che come metodo di un oggetto circuito, è possibile utilizzare direttamente la funzione circuit_drawer() , che fa parte dell'interfaccia pubblica stabile di qiskit.visualization. La funzione si comporta in modo identico al metodo circuit.draw() , tranne che per il fatto che riceve un oggetto circuito come argomento obbligatorio.

from qiskit.visualization import circuit_drawer

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

Output:

Output of the previous code cell

Passi successivi

Suggerimenti
Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.