Vizualizace diagramů kvantových obvodů pomocí Q#
Diagramy kvantových obvodů představují vizuální znázornění kvantových operací. Zobrazují tok qubitů prostřednictvím kvantového programu, včetně bran a měření použitých na ně.
V tomto článku se dozvíte, jak vizuálně znázorňovat kvantové algoritmy pomocí diagramů kvantových obvodů pomocí editoru Visual Studio Code nebo Poznámkových bloků Jupyter.
Další informace o konvencích diagramů kvantových obvodů najdete v tématu Konvence kvantových obvodů.
Požadavky
VS Code
Nejnovější verze editoru Visual Studio Code nebo otevření editoru VS Code na webu
Nejnovější verze rozšíření Azure Quantum Development Kit.
Nejnovější balíčky Azure Quantum
qsharp
aazure-quantum
Python.python -m pip install --upgrade qsharp azure-quantum
Poznámkové bloky Jupyter
Nejnovější verze editoru Visual Studio Code nebo otevření editoru VS Code na webu
VS Code s nainstalovanými rozšířeními Azure Quantum Development Kit, Python a Jupyter
Nejnovější azure Quantum
qsharp
aqsharp-widgets
balíčky aipykernel
balíček.python -m pip install --upgrade qsharp qsharp-widgets ipykernel
Kvantové okruhy pomocí editoru Visual Studio Code
Pomocí těchto kroků vizualizujete kvantové okruhy Q# programů v editoru Visual Studio Code. Další informace o konvencích diagramů kvantových obvodů najdete v tématu Konvence kvantových obvodů.
Zobrazení diagramů okruhů pro Q# program
Otevřete soubor v editoru Q# Visual Studio Code nebo načtěte některou z kvantových ukázek.
Pokud chcete vizualizovat kvantový okruh Q# programu, vyberte Zobrazit –> Paleta příkazů a zadejte "okruh", který by měl zobrazit Q#možnost : Zobrazit okruh . Můžete také kliknout na Okruh ze seznamu příkazů předcházejících
Main()
.Okruh se zobrazí v okně okruhu Q# . Následující okruh například odpovídá operaci, která umístí qubit do superpozice a pak ho změruje. Diagram okruhu znázorňuje jeden qubitový registr, který je inicializován do stavu |0⟩. Pak se na qubit použije brána Hadamard H, následovaná měrnou operací, která je reprezentována symbolem měřiče.
Zobrazení diagramů okruhů pro operace
Kvantový okruh můžete vizualizovat pro jednu Q# operaci. Uděláte to tak, že kliknete na tlačítko Okruh v objektivu kódu, který se zobrazí nad deklaraci operace.
Zobrazení diagramů okruhů při ladění
Při ladění Q# programu můžete kvantový okruh vizualizovat na základě aktuálního stavu programu.
V seznamu příkazů objektivu kódu předcházejících
Main()
vyberte tlačítko Ladit .V zobrazení Spustit a ladit na levé straně rozbalte část Kvantového okruhu v podokně Proměnné, abyste zobrazili okruh při procházení programu.
Můžete procházet kód a nastavit zarážky v různých bodech, abyste viděli aktualizaci okruhu při spuštění programu.
Aktuální kvantový okruh se zobrazuje na panelu Q#Okruh. Tento diagram obvodu představuje aktuální stav simulátoru, tj. brány, které byly použity až do aktuálního bodu provádění.
Kvantové obvody s poznámkovými bloky Jupyter
V Poznámkových blocích Jupyter můžete pomocí balíčku vizualizovat qsharp-widgets
kvantové okruhy. Tento balíček poskytuje widget, který vykresluje diagram kvantového obvodu jako obrázek SVG.
V editoru Visual Studio Code vyberte paletu Zobrazit > příkaz a vyberte Vytvořit: Nový poznámkový blok Jupyter.
V první buňce poznámkového bloku spusťte následující kód pro import Q# modulu.
import qsharp
Přidejte novou buňku Q# a zadejte kód. Například následující kód připraví Stav zvonu.
%%qsharp // Prepare a Bell State. use register = Qubit[2]; H(register[0]); CNOT(register[0], register[1]);
Funkci můžete použít
dump_circuit()
k zobrazení kvantového okruhu na základě aktuálního stavu programu. Diagram okruhu například zobrazuje dva qubitové registry, které se inicializují do stavu |0⟩. Pak se hadamardská brána H použije na první qubit. Potom se použije brána CNOT pomocí prvního qubitu jako ovládacího prvku, který je reprezentován jako tečka, a druhý qubit jako target, který je reprezentován jako X.qsharp.dump_circuit()
q_0 ── H ──── ● ── q_1 ───────── X ──
Kvantové okruhy můžete vizualizovat jako image SVG pomocí
qsharp-widgets
balíčku. V tomto případě je brána CNOT reprezentována jako čára spojující dva qubity s tečkou na řídicím qubitu a křížkem na qubitu target . Další informace najdete v tématu Konvence kvantových obvodů.from qsharp_widgets import Circuit Circuit(qsharp.dump_circuit())
Zobrazení diagramů okruhů pro vstupní výraz
Diagram okruhu můžete vygenerovat pro libovolný program pomocí vstupního výrazu voláním qsharp.circuit()
a předáním vstupního výrazu jako argumentu.
Přidejte například novou buňku a zkopírujte následující kód, který připraví stav GHZ.
%%qsharp import Std.Diagnostics.*; import Std.Measurement.*; operation GHZSample(n: Int) : Result[] { use qs = Qubit[n]; H(qs[0]); ApplyToEach(CNOT(qs[0], _), qs[1...]); let results = MeasureEachZ(qs); ResetAll(qs); return results; }
Přidejte novou buňku a spusťte následující kód pro vizualizaci okruhu. Například připravte stav GHZ se 3 qubity.
Circuit(qsharp.circuit("GHZSample(3)"))
Zobrazení diagramů okruhů pro operace s qubity
Diagramy okruhů můžete generovat pro libovolnou operaci, která přijímá qubity nebo pole qubitů. Diagram znázorňuje tolik vodičů, kolik je vstupních qubitů, a všechny další qubity, které jsou přiděleny v rámci operace. Když operace vezme pole qubitů (Qubit[])
, okruh zobrazí pole jako registr 2 qubitů.
Přidejte novou buňku a zkopírujte následující příklad. Tento kód připraví stav kočky.
%%qsharp operation PrepareCatState(register : Qubit[]) : Unit { H(register[0]); ApplyToEach(CNOT(register[0], _), register[1...]); }
Přidejte novou buňku a spuštěním následujícího kódu vizualizujete okruh
PrepareCatState
operace.Circuit(qsharp.circuit(operation="PrepareCatState"))
Podmínky, které ovlivňují diagramy obvodů
Při vizualizaci kvantových obvodů můžou mít následující podmínky vliv na vizualizaci diagramu okruhu.
Dynamické obvody
Diagramy okruhů se generují spuštěním všech klasických logik v rámci Q# programu a sledováním všech qubitů, které byly přiděleny nebo brány použité. Smyčky a podmíněné výrazy jsou podporovány, pokud se zabývají pouze klasickými hodnotami.
Programy, které obsahují smyčky a podmíněné výrazy, které používají výsledky měření qubitu, jsou ale složitější pro reprezentaci s diagramem okruhu. Například výraz podobný následujícímu:
if (M(q) == One) {
X(q)
}
nelze reprezentovat jednoduchým diagramem obvodu, protože brány jsou podmíněné na výsledku měření. Takový okruh se nazývá dynamický okruh.
Diagramy okruhů je možné generovat pro dynamické okruhy spuštěním programu v kvantovém simulátoru a trasováním bran při jejich použití. Tomu se říká režim trasování , protože qubity a brány se sledují, protože probíhá simulace.
Nevýhodou trasovaných obvodů je, že zaznamenávají pouze výsledek měření a následné aplikace bran pro jednu simulaci. Pokud je Zero
v předchozím příkladu výsledek měření , v diagramu nevidíte bránu X
. Dalším spuštěním simulace může být trochu jiný okruh.
Target profil
Aktuálně vybraný target profil ovlivňuje způsob generování diagramů obvodů. Target profily se používají k určení možností hardwaru target a omezení, která jsou pro kvantový program uložená.
target Pokud je profil nastavený na Unrestricted nebo QIR Adaptive RI, diagramy okruhů zobrazují kvantové operace, které jsou vyvolány v Q# programu. target Když je profil nastavený na základ QIR, diagramy okruhů zobrazují kvantové operace, které by se spouštěly na hardwaru, pokud je program odeslán do Azure Quantum s tímto target profilem.
Poznámka:
Pokud chcete vybrat profil v editoru target VS Code, vyberte Zobrazit –> Paleta příkazů a vyberteQ#: Nastavte profil Azure Quantum QIRtarget. Můžete vybrat
QIR base
položku ,QIR Adaptive RI
nebounrestricted
z rozevíracího seznamu.Výběr profilu v Pythonutarget, volání
qsharp.init(target_profile=qsharp.TargetProfile.Base)
qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RI)
neboqsharp.init(target_profile=qsharp.TargetProfile.Unrestricted)
.
Konkrétně se používají dekompozice bran, které by výsledný okruh byly kompatibilní s možnostmi hardwaru target . Jedná se o stejné rozklady, které by se použily při generování kódu a odesílání do Azure Quantum.
Představte si například následující Q# program, který měří qubit a pole qubitů.
import Std.Measurement.*; operation Main() : (Result, Result[]) { // The `M` operation performs a measurement of a single qubit in the // computational basis, also known as the Pauli Z basis. use q = Qubit(); let result = M(q); Reset(q); // The `MeasureEachZ` operation measures each qubit in an array in the // computational basis and returns an array of `Result` values. use qs = Qubit[2]; let results = MeasureEachZ(qs); return (result, results); }
Pokud target je profil nastavený na Unrestricted nebo QIR Adaptive RI, brány zobrazené v okruhu přesně odpovídají kvantovým operacím, které jsou vyvolány v Q# programu.
target Pokud je profil základem QIR, okruh vypadá jinak. Vzhledem k tomu, že základní profil targets nepovoluje opakované použití qubitu po měření, měření se teď provádí na propleteném qubitu. Vzhledem k tomu
Reset
, že operace není podporovanou bránou v základním profilu, je zrušena. Výsledný okruh odpovídá tomu, co by se spustilo na hardwaru, pokud se tento program odešle do Azure Quantum s tímto target profilem.