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.
Utilizatorii OSX pot obține pachetele LaTeX necesare prin intermediul pachetului mactex.
# Matplotlib drawing
circuit.draw(output="mpl")
# Latex drawing
circuit.draw(output="latex")
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")
# Or save a LaTeX rendering
circuit.draw(output="latex", filename="circuit-latex.pdf")
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")
# 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)
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)
# Scale the mpl output to 1/2 the normal size
circuit.draw(output="mpl", scale=0.5)
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)
Pași următori
- Vezi un exemplu de vizualizare a Circuit-ului în tutorialul Algoritmul lui Grover.
- Vizualizează circuite simple folosind IBM Quantum Composer.
- Vizualizează sincronizarea Circuit-ului.
- Consultă documentația API pentru vizualizări Qiskit.