Sari la conținutul principal

Vizualizează circuite

Versiuni de pachete

Codul de pe această pagină a fost dezvoltat folosind următoarele cerințe. Îți recomandăm să folosești aceste versiuni sau versiuni mai noi.

qiskit[all]~=2.3.0

Este adesea util să vezi circuitele pe care le creezi. Folosește următoarele opțiuni pentru a afișa circuite Qiskit.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit

Desenează un Circuit cuantic

Clasa QuantumCircuit suportă desenarea circuitelor prin metoda draw(), sau prin afișarea obiectului Circuit. În mod implicit, ambele redau o versiune în text ASCII a diagramei Circuit.

Reține că print returnează None, dar are ca efect secundar afișarea diagramei, în timp ce QuantumCircuit.draw returnează diagrama fără efecte secundare. Deoarece notebook-urile Jupyter afișează rezultatul ultimei linii din fiecare celulă, ele par să aibă același efect.

# 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

Renderere alternative

Un output text este util pentru a vedea rapid rezultatul în timp ce dezvolți un Circuit, dar nu oferă cea mai mare flexibilitate. Există două renderere alternative pentru Circuit-ul cuantic. Unul folosește Matplotlib, iar celălalt folosește LaTeX. Renderul LaTeX necesită pachetul qcircuit. Selectează aceste renderere setând argumentul "output" la șirurile mpl și latex.

sfat

Utilizatorii OSX pot obține pachetele LaTeX necesare prin intermediul pachetului 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

Salvează output-ul

Desenarea unui Circuit la scară largă inline într-un notebook Jupyter poate fi lentă sau ilizibilă. Poți salva diagrama direct într-un fișier, apoi să o deschizi într-un vizualizator de imagini și să mărești după cum este necesar.

# 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

Controlează desenele Circuit-ului

În mod implicit, metoda draw() returnează imaginea redată ca obiect și nu afișează nimic. Clasa exactă returnată depinde de output-ul specificat: 'text' (implicit) returnează un obiect TextDrawer, 'mpl' returnează un obiect matplotlib.Figure, iar latex returnează un obiect PIL.Image. Notebook-urile Jupyter înțeleg aceste tipuri de returnare și le redau corespunzător, dar când rulezi în afara Jupyter, imaginile nu vor fi afișate automat.

Metoda draw() are argumente opționale pentru a afișa sau salva output-ul. Când este specificat, kwarg-ul filename primește o cale la care salvează output-ul redat. Alternativ, dacă folosești output-urile mpl sau latex, poți folosi kwarg-ul interactive pentru a deschide imaginea într-o fereastră nouă (acest lucru nu va funcționa întotdeauna din interiorul unui notebook).

Personalizează output-ul

În funcție de output, există și opțiuni pentru personalizarea diagramei Circuit.

Dezactivează barierele din diagramă și inversează ordinea biților

Primele două opțiuni sunt comune tuturor celor trei Backend-uri. Îți permit să configurezi atât ordinea biților, cât și dacă desenezi sau nu barierele. Acestea pot fi setate prin kwarg-ul reverse_bits și, respectiv, kwarg-ul plot_barriers. Următoarele exemple funcționează cu orice renderer; mpl este folosit aici pentru concizie.

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

Personalizări specifice rendererului

Unele opțiuni de personalizare disponibile sunt specifice unui renderer.

Argumentul fold setează o lățime maximă pentru output. În renderul text, acesta setează lungimea liniilor diagramei înainte de a fi împachetată la linia următoare. Când se folosește renderul mpl, acesta reprezintă numărul de straturi (vizuale) înainte de a continua pe linia următoare.

Renderul mpl are kwarg-ul style, care modifică culorile și contururile. Consultă documentația API pentru mai multe detalii.

Opțiunea scale scalează output-ul rendererelor mpl și 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

Funcție de sine stătătoare pentru desenarea Circuit-ului

Dacă ai o aplicație în care preferi să desenezi un Circuit cu o funcție de sine stătătoare, în loc să folosești o metodă a unui obiect Circuit, poți utiliza direct funcția circuit_drawer(), care face parte din interfața publică stabilă din qiskit.visualization. Funcția se comportă identic cu metoda circuit.draw(), cu excepția că primește un obiect Circuit ca argument obligatoriu.

from qiskit.visualization import circuit_drawer

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

Output of the previous code cell

Pași următori

Recomandări