Jak wizualizować diagramy obwodów kwantowych za pomocą polecenia Q#
Diagramy obwodów kwantowych to wizualna reprezentacja operacji kwantowych. Pokazują one przepływ kubitów za pośrednictwem programu kwantowego, w tym bram i pomiarów zastosowanych do nich.
W tym artykule dowiesz się, jak wizualnie reprezentować algorytmy kwantowe za pomocą diagramów obwodów kwantowych przy użyciu programu Visual Studio Code lub notesów Jupyter Notebook.
Aby uzyskać więcej informacji na temat konwencji diagramu obwodu kwantowego, zobacz Konwencje obwodów kwantowych.
Wymagania wstępne
VS Code
Najnowsza wersja programu Visual Studio Code lub otwórz program VS Code w sieci Web.
Najnowsza wersja rozszerzenia zestawu Azure Quantum Development Kit.
Najnowsze pakiety usługi Azure Quantum
qsharp
iazure-quantum
Python.python -m pip install --upgrade qsharp azure-quantum
Notesy programu Jupyter
Najnowsza wersja programu Visual Studio Code lub otwórz program VS Code w sieci Web.
Program VS Code z zainstalowanymi rozszerzeniami Azure Quantum Development Kit, Python i Jupyter .
Najnowsza wersja usługi Azure Quantum
qsharp
iqsharp-widgets
pakiety orazipykernel
pakiet.python -m pip install --upgrade qsharp qsharp-widgets ipykernel
Obwody kwantowe z programem Visual Studio Code
Wykonaj następujące kroki, aby wizualizować obwody Q# kwantowe programów w programie Visual Studio Code. Aby uzyskać więcej informacji na temat konwencji diagramu obwodu kwantowego, zobacz Konwencje obwodów kwantowych.
Wyświetlanie diagramów obwodów dla Q# programu
Q# Otwórz plik w programie Visual Studio Code lub załaduj jeden z przykładów kwantowych.
Aby zwizualizować obwód Q# kwantowy programu, wybierz pozycję Widok —> Paleta poleceń i wpisz "circuit", który powinien wyświetlić Q#opcję : Pokaż obwód . Możesz również kliknąć pozycję Obwód z listy poleceń poprzedzających
Main()
polecenie .Obwód jest wyświetlany w oknie obwodu Q# . Na przykład poniższy obwód odpowiada operacji, która umieściła kubit w superpozycji, a następnie mierzy ją. Diagram obwodu przedstawia jeden rejestr kubitów, który został zainicjowany do stanu |0⟩. Następnie brama Hadamarda, H, jest stosowana do kubitu, a następnie przez operację pomiaru, która jest reprezentowana przez symbol miernika.
Wyświetlanie diagramów obwodów dla operacji
Możesz zwizualizować obwód kwantowy dla jednej Q# operacji. Aby to zrobić, kliknij przycisk Obwód w obiektywie kodu, który pojawia się powyżej deklaracji operacji.
Wyświetlanie diagramów obwodów podczas debugowania
Podczas debugowania Q# programu można wizualizować obwód kwantowy na podstawie bieżącego stanu programu.
Wybierz przycisk Debuguj z listy poleceń obiektywu kodu poprzedzających
Main()
polecenie .W widoku Uruchamianie i debugowanie po lewej stronie rozwiń sekcję Obwód kwantowy w okienku Zmienne, aby wyświetlić obwód podczas przechodzenia przez program.
Możesz przejść przez kod i ustawić punkty przerwania w różnych punktach, aby zobaczyć aktualizację obwodu podczas uruchamiania programu.
Bieżący obwód kwantowy jest wyświetlany na Q# panelu Obwody. Ten diagram obwodu reprezentuje bieżący stan symulatora, czyli bramy, które zostały zastosowane do bieżącego punktu wykonywania.
Obwody kwantowe z notesami Jupyter Notebook
W notesach Jupyter Notebook można wizualizować obwody kwantowe przy użyciu qsharp-widgets
pakietu. Ten pakiet udostępnia widżet renderujący diagram obwodu kwantowego jako obraz SVG.
W programie Visual Studio Code wybierz pozycję Wyświetl paletę poleceń i wybierz pozycję Utwórz: nowy notes Jupyter.>
W pierwszej komórce notesu uruchom następujący kod, aby zaimportować Q# moduł.
import qsharp
Dodaj nową komórkę i wprowadź Q# kod. Na przykład poniższy kod przygotowuje stan bell.
%%qsharp // Prepare a Bell State. use register = Qubit[2]; H(register[0]); CNOT(register[0], register[1]);
Za pomocą
dump_circuit()
funkcji można wyświetlić obwód kwantowy na podstawie bieżącego stanu programu. Na przykład diagram obwodu przedstawia dwa rejestry kubitów, które są inicjowane do stanu |0⟩. Następnie brama Hadamard, H, jest stosowana do pierwszego kubitu. Następnie brama CNOT jest stosowana przy użyciu pierwszego kubitu jako kontrolki, która jest reprezentowana jako kropka, a drugi kubit jako target, który jest reprezentowany jako X.qsharp.dump_circuit()
q_0 ── H ──── ● ── q_1 ───────── X ──
Obwody kwantowe można wizualizować jako obraz SVG przy użyciu
qsharp-widgets
pakietu. W tym przypadku brama CNOT jest reprezentowana jako linia łącząca dwa kubity, z kropką na kubitie kontrolnym i skrzyżowanym krzyżem na kubitie target . Aby uzyskać więcej informacji, zobacz Konwencje obwodów kwantowych.from qsharp_widgets import Circuit Circuit(qsharp.dump_circuit())
Wyświetlanie diagramów obwodów dla wyrażenia wejścia
Diagram obwodu dla dowolnego programu z wyrażeniem wejściowym można wygenerować, wywołując qsharp.circuit()
i przekazując wyrażenie entry jako argument.
Na przykład dodaj nową komórkę i skopiuj następujący kod, który przygotowuje stan 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; }
Dodaj nową komórkę i uruchom następujący kod, aby zwizualizować obwód. Na przykład przygotuj stan GHZ z 3 kubitami.
Circuit(qsharp.circuit("GHZSample(3)"))
Wyświetlanie diagramów obwodów dla operacji z kubitami
Diagramy obwodów można wygenerować dla dowolnej operacji, która przyjmuje kubity lub tablice kubitów. Na diagramie pokazano tyle przewodów, ile jest kubitów wejściowych oraz wszelkich dodatkowych kubitów przydzielonych w ramach operacji. Gdy operacja przyjmuje tablicę kubitów (Qubit[])
, obwód pokazuje tablicę jako rejestr 2 kubitów.
Dodaj nową komórkę i skopiuj poniższy przykład. Ten kod przygotowuje stan kota.
%%qsharp operation PrepareCatState(register : Qubit[]) : Unit { H(register[0]); ApplyToEach(CNOT(register[0], _), register[1...]); }
Dodaj nową komórkę i uruchom następujący kod, aby zwizualizować obwód
PrepareCatState
operacji.Circuit(qsharp.circuit(operation="PrepareCatState"))
Warunki wpływające na diagramy obwodów
Podczas wizualizacji obwodów kwantowych następujące warunki mogą mieć wpływ na wizualizację diagramu obwodu.
Obwody dynamiczne
Diagramy obwodów są generowane przez wykonanie całej klasycznej logiki w Q# programie i śledzenie wszelkich kubitów, które zostały przydzielone lub bramy, które zostały zastosowane. Pętle i warunkowe są obsługiwane tak długo, jak obsługują tylko wartości klasyczne.
Jednak programy zawierające pętle i wyrażenia warunkowe korzystające z wyników pomiaru kubitu są trudniejsze do reprezentowania za pomocą diagramu obwodu. Na przykład wyrażenie podobne do poniższego
if (M(q) == One) {
X(q)
}
nie można przedstawić za pomocą prostego diagramu obwodu, ponieważ bramy są zależne od wyniku pomiaru. Taki obwód jest nazywany obwodem dynamicznym.
Diagramy obwodów można wygenerować dla obwodów dynamicznych, uruchamiając program w symulatorze kwantowym i śledząc bramy w miarę ich stosowania. Jest to nazywane trybem śledzenia , ponieważ kubity i bramy są śledzone w miarę wykonywania symulacji.
Wadą śledzenia obwodów jest to, że przechwytują tylko wynik pomiaru, a w związku z tym aplikacje bramki dla pojedynczej symulacji. W powyższym przykładzie, jeśli wynikiem pomiaru jest Zero
, nie widzisz bramy X
na diagramie. Inny przebieg symulacji może pokazać nieco inny obwód.
Target profil
Aktualnie wybrany target profil wpływa na sposób generowania diagramów obwodów. Target profile służą do określania możliwości sprzętu target oraz ograniczeń nakładanych na program kwantowy.
target Gdy profil ma ustawioną wartość Unrestricted lub QIR Adaptive RI, diagramy obwodów pokazują operacje kwantowe wywoływane w Q# programie. target Gdy profil jest ustawiony na bazę QIR, diagramy obwodów pokazują operacje kwantowe, które byłyby uruchamiane na sprzęcie, jeśli program zostanie przesłany do usługi Azure Quantum z tym target profilem.
Uwaga
Aby wybrać target profil w programie VS Code, wybierz pozycję Widok —> Paleta poleceń i wybierz pozycję Q#: Ustaw profil usługi Azure Quantum QIRtarget. Możesz wybrać pozycję
QIR base
,QIR Adaptive RI
lubunrestricted
z listy rozwijanej.Aby wybrać profil w języku Python, wywołaj metodę target
qsharp.init(target_profile=qsharp.TargetProfile.Base)
lubqsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RI)
qsharp.init(target_profile=qsharp.TargetProfile.Unrestricted)
.
W szczególności stosuje się dekompozycje bramy, które sprawią, że wynikowy obwód będzie zgodny z możliwościami sprzętu target . Są to te same dekompozycje, które byłyby stosowane podczas generowania kodu i przesyłania do usługi Azure Quantum.
Rozważmy na przykład następujący Q# program, który mierzy kubit i tablicę kubitów.
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); }
Gdy target profil jest ustawiony na Unrestricted lub QIR Adaptive RI, bramy wyświetlane w obwodzie odpowiadają dokładnie operacjom kwantowym wywoływanym w Q# programie.
Gdy profil jest bazą targetQIR, obwód wygląda inaczej. Ponieważ profil targets podstawowy nie zezwala na ponowne użycie kubitu po pomiarze, pomiar jest teraz wykonywany na splątanym kubitie. Ponieważ
Reset
operacja nie jest obsługiwaną bramą w profilu podstawowym, została porzucona. Wynikowy obwód odpowiada temu, co byłoby uruchamiane na sprzęcie, jeśli ten program zostanie przesłany do usługi Azure Quantum przy użyciu tego target profilu.