Visualizzare i circuiti
Versioni dei pacchetti
Il codice in questa pagina Γ¨ stato sviluppato utilizzando i seguenti requisiti. Consigliamo di usare queste versioni o versioni piΓΉ recenti.
qiskit[all]~=2.3.0
Spesso Γ¨ utile visualizzare i circuiti che stai creando. Usa le seguenti opzioni per visualizzare i circuiti Qiskit.
# Added by doQumentation β required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit
Disegnare un circuito quantisticoβ
La classe QuantumCircuit supporta il disegno dei circuiti tramite il metodo draw(), oppure stampando l'oggetto circuito. Per impostazione predefinita, entrambi restituiscono una versione ASCII art del diagramma del circuito.
Nota che print restituisce None ma ha l'effetto collaterale di stampare il diagramma, mentre QuantumCircuit.draw restituisce il diagramma senza effetti collaterali. PoichΓ© i notebook Jupyter mostrano l'output dell'ultima riga di ogni cella, i due sembrare 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)
βββββ βββ
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
Renderer alternativiβ
Un output testuale Γ¨ utile per vedere rapidamente il risultato durante lo sviluppo di un circuito, ma non offre la massima flessibilitΓ . Esistono due renderer alternativi per il circuito quantistico. Uno usa Matplotlib e l'altro usa LaTeX. Il renderer LaTeX richiede il pacchetto qcircuit. Seleziona questi renderer impostando l'argomento "output" alle stringhe mpl e latex.
Gli utenti OSX possono ottenere i pacchetti LaTeX necessari tramite il pacchetto mactex.
# Matplotlib drawing
circuit.draw(output="mpl")
# Latex drawing
circuit.draw(output="latex")
Salvare l'outputβ
Disegnare un circuito di grandi dimensioni direttamente in un notebook Jupyter puΓ² essere lento o difficile da leggere. Puoi salvare il diagramma direttamente in un file, poi aprirlo in un visualizzatore di immagini e ingrandirlo secondo necessitΓ .
# 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")
Controllare il disegno del circuitoβ
Per impostazione predefinita, il metodo draw() restituisce l'immagine renderizzata come oggetto e non produce alcun output. La classe esatta restituita dipende dall'output specificato: 'text' (il valore predefinito) restituisce un oggetto TextDrawer, 'mpl' restituisce un oggetto matplotlib.Figure, e latex restituisce un oggetto PIL.Image. I notebook Jupyter riconoscono questi tipi di ritorno e li renderizzano correttamente, ma quando si esegue il codice al di fuori di Jupyter, le immagini non vengono visualizzate automaticamente.
Il metodo draw() accetta argomenti opzionali per mostrare o salvare l'output. Quando specificato, il kwarg filename accetta un percorso in cui salvare l'output renderizzato. In alternativa, se stai usando gli output mpl o latex, puoi usare il kwarg interactive per aprire l'immagine in una nuova finestra (questa funzionalitΓ potrebbe non funzionare sempre dall'interno di un notebook).
Personalizzare l'outputβ
A seconda dell'output scelto, sono disponibili ulteriori opzioni per personalizzare il diagramma del circuito.
Disabilitare le barriere del plot e invertire l'ordine dei bitβ
Le prime due opzioni sono condivise da tutti e tre i backend. Consentono di configurare sia l'ordine dei bit sia la visualizzazione delle barriere. Possono essere impostate rispettivamente tramite il kwarg reverse_bits e il kwarg plot_barriers. Gli esempi seguenti funzionano con qualsiasi renderer di output; qui viene usato mpl 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")
# 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)
Personalizzazioni specifiche del rendererβ
Alcune opzioni di personalizzazione disponibili sono specifiche per un determinato renderer.
L'argomento fold imposta una larghezza massima per l'output. Nel renderer text, definisce la lunghezza delle righe del diagramma prima che venga mandato a capo alla riga successiva. Quando si usa il renderer mpl, indica il numero di layer (visivi) prima di andare a capo alla riga successiva.
Il renderer mpl dispone del kwarg style, che modifica i colori e i contorni. Consulta la documentazione API per ulteriori dettagli.
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)
βββββββββββββββββββββββββββββββββββΒ»
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)
Funzione autonoma per disegnare i circuitiβ
Se hai un'applicazione in cui preferisci disegnare un circuito con una funzione autonoma invece che come metodo di un oggetto circuito, puoi usare 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(), con la differenza che accetta un oggetto circuito come argomento obbligatorio.
from qiskit.visualization import circuit_drawer
circuit_drawer(circuit, output="mpl", plot_barriers=False)
Passi successiviβ
- Guarda un esempio di visualizzazione di circuiti nel tutorial sull'Algoritmo di Grover.
- Visualizza circuiti semplici usando IBM Quantum Composer.
- Visualizza la temporizzazione dei circuiti.
- Consulta la documentazione API delle visualizzazioni Qiskit.