Udostępnij za pośrednictwem


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

Notesy programu Jupyter

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

  1. Q# Otwórz plik w programie Visual Studio Code lub załaduj jeden z przykładów kwantowych.

  2. 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 .

    Q# Zrzut ekranu przedstawiający plik w programie Visual Studio Code pokazujący, gdzie znaleźć polecenie obwodu obiektywu kodu.

  3. 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.

    Q# Zrzut ekranu przedstawiający okno obwodu przedstawiające wynikowy diagram obwodu dla losowej operacji bitowej.

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.

Zrzut ekranu programu Visual Studio Code przedstawiający sposób wizualizacji obwodów w okienku Q# obwodów po debugowaniu programu.

Wyświetlanie diagramów obwodów podczas debugowania

Podczas debugowania Q# programu można wizualizować obwód kwantowy na podstawie bieżącego stanu programu.

  1. Wybierz przycisk Debuguj z listy poleceń obiektywu kodu poprzedzających Main()polecenie .

  2. 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.

    Zrzut ekranu programu Visual Studio Code przedstawiający sposób wizualizacji obwodu podczas debugowania programu.

  3. Możesz przejść przez kod i ustawić punkty przerwania w różnych punktach, aby zobaczyć aktualizację obwodu podczas uruchamiania programu.

  4. 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.

    Zrzut ekranu programu Visual Studio Code przedstawiający sposób wizualizacji obwodu dla pojedynczej Q# operacji.

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.

  1. W programie Visual Studio Code wybierz pozycję Wyświetl paletę poleceń i wybierz pozycję Utwórz: nowy notes Jupyter.>

  2. W pierwszej komórce notesu uruchom następujący kod, aby zaimportować Q# moduł.

    import qsharp
    
  3. 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]);
    
  4. 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 ──
    
  5. 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())
    

    Zrzut ekranu przedstawiający notes Jupyter Notebook przedstawiający sposób wizualizacji obwodu Q# dla operacji.

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.

  1. 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;
    }
    
  2. 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.

  1. 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...]);
    }
    
  2. 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 RIlub unrestricted z listy rozwijanej.

  • Aby wybrać profil w języku Python, wywołaj metodę target qsharp.init(target_profile=qsharp.TargetProfile.Base)lub qsharp.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.

  1. 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);
    }
    
  2. 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.

    Zrzut ekranu przedstawiający obwody kwantowe, gdy target profil jest nieograniczony.

  3. 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.

    Zrzut ekranu przedstawiający obwody kwantowe, gdy target profil jest bazą QIR.