Vizualizace Circuit
Verze balíčků
Kód na této stránce byl vyvinut s použitím následujících požadavků. Doporučujeme používat tyto verze nebo novější.
qiskit[all]~=2.3.0
Velmi často je užitečné vidět Circuit, které vytváříš. Ke zobrazení Qiskit Circuit použij níže uvedené možnosti.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit
Nakresli kvantový Circuit
Třída QuantumCircuit podporuje kreslení Circuit prostřednictvím metody draw() nebo výpisem objektu Circuit. Ve výchozím nastavení obě možnosti vykreslí verzi diagramu Circuit v ASCII artu.
Všimni si, že print vrac í None, ale má vedlejší efekt v podobě výpisu diagramu, zatímco QuantumCircuit.draw vrací diagram bez vedlejších efektů. Protože Jupyter notebooky zobrazují výstup posledního řádku každé buňky, zdá se, že mají stejný efekt.
# 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
Alternativní renderery
Textový výstup je užitečný pro rychlé zobrazení výsledku při vývoji Circuit, ale nenabízí největší flexibilitu. Existují dva alternativní renderery pro kvantový Circuit. Jeden používá Matplotlib a druhý používá LaTeX. Renderer LaTeX vyžaduje balíček qcircuit. Tyto renderery vybereš nastavením argumentu "output" na řetězce mpl a latex.
Uživatelé OSX mohou získat požadované balíčky LaTeX prostřednictvím balíčku mactex.
# Matplotlib drawing
circuit.draw(output="mpl")
# Latex drawing
circuit.draw(output="latex")
Uložení výstupu
Kreslení Circuit ve velkém měřítku přímo v Jupyter notebooku může být pomalé nebo nečitelné. Diagram můžeš uložit přímo do souboru, pak ho otevřít v prohlížeči obrázků a podle potřeby přiblížit.
# 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")
Ovládání kreslení Circuit
Ve výchozím nastavení metoda draw() vrací vykreslený obrázek jako objekt a nic nevypisuje. Přesná třída, která je vrácena, závisí na zadaném výstupu: 'text' (výchozí) vrací objekt TextDrawer, 'mpl' vrací objekt matplotlib.Figure a latex vrací objekt PIL.Image. Jupyter notebooky těmto návratovým typům rozumí a správně je vykreslují, ale při spuštění mimo Jupyter se obrázky nezobrazí automaticky.
Metoda draw() má volitelné argumenty pro zobrazení nebo uložení výstupu. Pokud je zadán, kwarg filename přijme cestu, do které uloží vykreslený výstup. Případně, pokud používáš výstupy mpl nebo latex, můžeš pomocí kwarg interactive otevřít obrázek v novém okně (toto nemusí vždy fungovat z notebooku).
Přizpůsobení výstupu
V závislosti na výstupu existují také možnosti přizpůsobení diagramu Circuit.
Zakázání vykreslování bariér a obrácení pořadí bitů
První dvě možnosti jsou sdíleny mezi všemi třemi backendy. Umožňují ti konfigurovat pořadí bitů i to, zda bariéry kreslit. Lze je nastavit pomocí kwarg reverse_bits a kwarg plot_barriers. Následující příklady fungují s jakýmkoli rendererem; zde je pro stručnost použit mpl.
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)
Přizpůsobení specifická pro renderer
Některé dostupné možnosti přizpůsobení jsou specifické pro daný renderer.
Argument fold nastavuje maximální šířku výstupu. V rendereru text toto nastavuje délku řádků diagramu před zalomením na další řádek. Při použití rendereru mpl se jedná o počet (vizuálních) vrstev před zalomením na další řádek.
Renderer mpl má kwarg style, který mění barvy a obrysy. Více podrobností najdeš v dokumentaci API.
Možnost scale škáluje výstup rendererů mpl a 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)
Samostatná funkce pro kreslení Circuit
Pokud máš aplikaci, kde dáváš přednost kreslení Circuit pomocí samostatné funkce namísto metody objektu Circuit, můžeš přímo použít funkci circuit_drawer(), která je součástí veřejného stabilního rozhraní z qiskit.visualization. Funkce se chová identicky jako metoda circuit.draw(), s tím rozdílem, že přijímá objekt Circuit jako povinný argument.
from qiskit.visualization import circuit_drawer
circuit_drawer(circuit, output="mpl", plot_barriers=False)
Další kroky
- Podívej se na příklad vizualizace Circuit v tutoriálu Groverův algoritmus.
- Vizualizuj jednoduché Circuit pomocí IBM Quantum Composer.
- Vizualizuj časování Circuit.
- Projdi si dokumentaci API vizualizací Qiskit.