Wizualizowanie diagramów obwodów kwantowych za pomocą polecenia Q#
Diagramy obwodów kwantowych to wizualna reprezentacja operacji kwantowych. Pokazują one przepływ kubitów przez program kwantowy, w tym bramy i pomiary zastosowane do nich.
W tym artykule dowiesz się, jak wizualnie reprezentować algorytmy kwantowe przy użyciu diagramów obwodów kwantowych przy użyciu Visual Studio Code i notesów Jupyter Notebook.
Aby uzyskać więcej informacji na temat konwencji diagramu obwodu kwantowego, zobacz Konwencje obwodów kwantowych.
Wymagania wstępne
Jeśli chcesz użyć Visual Studio Code do wizualizacji obwodów kwantowych, potrzebne są następujące elementy:
- Najnowsza wersja Visual Studio Code lub otwórz program VS Code w sieci Web.
- Najnowsza wersja rozszerzenia Azure Quantum Development Kit .
Obwody kwantowe z Visual Studio Code
Wykonaj następujące kroki, aby wizualizować obwody Q# kwantowe programów w 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 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 "obwód", który powinien wywołać Q#opcję : Pokaż obwód . Możesz również kliknąć pozycję Obwód z listy poleceń poniżej
@EntryPoint()
.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 operacji pomiaru, która jest reprezentowana przez symbol miernika.
Wyświetlanie diagramów obwodów dla operacji
Obwód kwantowy można wizualizować dla jednej Q# operacji. W tym celu kliknij przycisk Obwód w obiektywie kodu, który pojawia się powyżej deklaracji operacji.
Wyświetlanie diagramów obwodów podczas debugowania
Podczas debugowaniaQ# programu można wizualizować obwód kwantowy na podstawie bieżącego stanu programu.
Kliknij przycisk Debuguj z listy poleceń obiektywu kodu poniżej
@EntryPoint()
.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 w Q# panelu Obwód. 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, który renderuje diagram obwodu kwantowego jako obraz SVG.
W Visual Studio Code wybierz pozycję Wyświetl > paletę poleceń i wybierz pozycję Twórca: Nowy Jupyter Notebook.
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 dzwonu.
%%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 Hadamarda, 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 sterującym 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ściowego
Diagram obwodu można wygenerować dla dowolnego programu z wyrażeniem wejściowym przez wywołanie qsharp.circuit()
i przekazanie wyrażenia wpisu jako argumentu.
Na przykład dodaj nową komórkę i skopiuj następujący kod, który przygotowuje stan GHZ.
%%qsharp open Microsoft.Quantum.Diagnostics; open Microsoft.Quantum.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 każdej operacji, która przyjmuje kubity lub tablice kubitów . Na diagramie pokazano tyle przewodów, ile jest kubitów wejściowych, oraz wszelkie dodatkowe kubity przydzielone 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 wizualizowania 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 wszystkich przydzielonych kubitów lub bram, które zostały zastosowane. Pętle i warunkowe są obsługiwane tak długo, jak mają do czynienia tylko z wartościami klasycznymi.
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że być reprezentowany 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 podczas wykonywania symulacji.
Wadą śledzenia obwodów jest to, że przechwytują tylko wynik pomiaru, a w związku z tym zastosowania bramki dla jednej symulacji. W powyższym przykładzie, jeśli wynik pomiaru to Zero
, brama nie jest widoczna X
na diagramie. Inny przebieg symulacji może pokazywać nieco inny obwód.
Profil docelowy
Aktualnie wybrany target profil wpływa na sposób generowania diagramów obwodów. Profile docelowe służą do określania możliwości sprzętu target oraz ograniczeń nakładanych na program kwantowy.
target Gdy profil ma wartość Unrestricted, 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 przy użyciu tego target profilu.
Uwaga
Aby wybrać target profil w programie VS Code, przejdź do pozycji Widok —> Paleta poleceń i napiszQ#: Ustaw profil usługi Azure Quantum QIRtarget. Możesz wybrać
Unrestricted
lubQIR Base Profile
z listy rozwijanej.Aby wybrać target profil w języku Python, napisz
qsharp.init(target_profile=qsharp.TargetProfile.Unrestricted)
lubqsharp.init(target_profile=qsharp.TargetProfile.Base)
.
W szczególności stosuje się dekompozycje bramy, które sprawiają, że wynikowy obwód jest 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.
namespace Sample { open Microsoft.Quantum.Measurement; @EntryPoint() 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); } }
Po target ustawieniu profilu na wartość Unrestricted bramy wyświetlane w obwodzie odpowiadają dokładnie operacjom kwantowym wywoływanym w Q# programie.
target Gdy profil jest podstawą QIR, 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 będzie uruchamiane na sprzęcie, jeśli ten program zostanie przesłany do usługi Azure Quantum z tym target profilem.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla