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:

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

  1. Q# Otwórz plik w 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 "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().

    Q# Zrzut ekranu przedstawiający plik w 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 operacji 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

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.

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

Wyświetlanie diagramów obwodów podczas debugowania

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

  1. Kliknij przycisk Debuguj z listy poleceń obiektywu kodu poniżej @EntryPoint().

  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 przedstawiający Visual Studio Code sposób wizualizowania 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 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.

    Zrzut ekranu przedstawiający Visual Studio Code sposób wizualizacji obwodu dla jednej 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, który renderuje diagram obwodu kwantowego jako obraz SVG.

  1. W Visual Studio Code wybierz pozycję Wyświetl > paletę poleceń i wybierz pozycję Twórca: Nowy Jupyter Notebook.

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

    %%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 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 ──
    
  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 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())
    

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

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.

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

  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 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 lub QIR Base Profile z listy rozwijanej.

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

  1. 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);
        }
    }
    
  2. Po target ustawieniu profilu na wartość Unrestricted 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. 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.

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