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 QuantumCircuitDisegna 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.
Gli utenti di OSX possono ottenere i pacchetti LaTeX necessari attraverso il pacchetto mactex.
# Matplotlib drawing
circuit.draw(output="mpl")Output:
# Latex drawing
circuit.draw(output="latex")Output:
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:
# Or save a LaTeX rendering
circuit.draw(output="latex", filename="circuit-latex.pdf")Output:
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:
# 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:
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:
# Scale the mpl output to 1/2 the normal size
circuit.draw(output="mpl", scale=0.5)Output:
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:
Passi successivi
- Un esempio di visualizzazione dei circuiti è riportato nell'esercitazione sull' algoritmo di Grover.
- Visualizza circuiti semplici utilizzando IBM Quantum Composer.
- Visualizza la temporizzazione del circuito.
- Consulta la documentazione relativa all'API di visualizzazione Qiskit.