Vai al contenuto principale

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.

suggerimento

Gli utenti OSX possono ottenere i pacchetti LaTeX necessari tramite il pacchetto mactex.

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

Output of the previous code cell

# Latex drawing
circuit.draw(output="latex")

Output of the previous code cell

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")

Output of the previous code cell

# Or save a LaTeX rendering
circuit.draw(output="latex", filename="circuit-latex.pdf")

Output of the previous code cell

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")

Output of the previous code cell

# Draw the circuit with reversed bit order
circuit.draw(output="mpl", reverse_bits=True)

Output of the previous code cell

# Draw the circuit without barriers
circuit.draw(output="mpl", plot_barriers=False)

Output of the previous code cell

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)

Output of the previous code cell

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

Output of the previous code cell

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)

Output of the previous code cell

Passi successivi​

Raccomandazioni