Vizualizace diagramů kvantových obvodů pomocí Q#

Diagramy kvantových obvodů jsou vizuální reprezentací kvantových operací. Zobrazují tok qubitů prostřednictvím kvantového programu, včetně bran a měření, která se na ně vztahují.

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 a poznámkových bloků Jupyter Notebook.

Další informace o konvencích diagramů kvantových obvodů najdete v tématu Konvence kvantových obvodů.

Požadavky

Pokud chcete pomocí editoru Visual Studio Code vizualizovat kvantové obvody, potřebujete:

Kvantové obvody s editorem Visual Studio Code

Pokud chcete vizualizovat kvantové okruhy programů v editoru Q# Visual Studio Code, postupujte podle těchto kroků. Další informace o konvencích diagramů kvantových obvodů najdete v tématu Konvence kvantových obvodů.

Zobrazení diagramů okruhů pro Q# program

  1. Otevřete soubor v editoru Q# Visual Studio Code nebo načtěte některou z kvantových ukázek.

  2. Pokud chcete vizualizovat kvantový okruh Q# programu, vyberte Zobrazit –> paleta příkazů a zadejte "circuit", který by měl zobrazit Q#možnost : Zobrazit okruh . Můžete také kliknout na Okruh ze seznamu příkazů níže @EntryPoint().

    Snímek obrazovky se souborem v editoru Q# Visual Studio Code znázorňující, kde najít příkaz okruhu lens kódu

  3. Okruh se zobrazí v okně okruhu Q# . Například následující okruh odpovídá operaci, která vloží 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 hadamardská brána H, po které následuje operace měření, která je reprezentována symbolem měřiče.

    Snímek obrazovky s Q# oknem okruhu s výsledným diagramem okruhu pro operaci náhodného bitu

Zobrazení diagramů obvodů pro operace

Kvantový obvod můžete vizualizovat pro jednu Q# operaci. Chcete-li to provést, klikněte na tlačítko Okruh v objektivu kódu, který se zobrazí nad deklarací operace.

Snímek obrazovky editoru Visual Studio Code znázorňující vizualizaci okruhů v Q# podokně okruhů po ladění programu

Zobrazení diagramů okruhů při ladění

Při laděníQ# programu můžete vizualizovat kvantový okruh na základě aktuálního stavu programu.

  1. Klikněte na tlačítko Ladit v seznamu příkazů pro objektiv kódu níže @EntryPoint().

  2. V zobrazení Spustit a ladit na levé straně rozbalte oddíl Quantum Circuit v podokně Proměnné a zobrazte okruh při procházení programu.

    Snímek obrazovky editoru Visual Studio Code znázorňující, jak vizualizovat okruh při ladění programu

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

  4. Aktuální kvantový obvod se zobrazí na paneluQ# Okruh. Tento diagram okruhu představuje aktuální stav simulátoru, tj. bran, které byly použity až do aktuálního bodu provádění.

    Snímek obrazovky editoru Visual Studio Code znázorňující, jak vizualizovat okruh pro jednu Q# operaci

Kvantové obvody s poznámkovými bloky Jupyter

V Jupyter Notebooks můžete pomocí balíčku vizualizovat kvantové okruhy qsharp-widgets . Tento balíček obsahuje widget, který vykresluje diagram kvantového obvodu jako obrázek SVG.

  1. V editoru Visual Studio Code vyberte Zobrazit > paletu příkazů a vyberte Create: Nový Jupyter Notebook.

  2. V první buňce poznámkového bloku spusťte následující kód pro import Q# modulu.

    import qsharp
    
  3. Přidejte novou buňkuQ# a zadejte kód. Například následující kód připraví Bell State.

    %%qsharp
    
    // Prepare a Bell State.
    use register = Qubit[2];
    H(register[0]);
    CNOT(register[0], register[1]);
    
  4. Funkci můžete použít dump_circuit() k zobrazení kvantového obvodu na základě aktuálního stavu programu. Například diagram obvodu zobrazuje dva qubitové registry, které jsou inicializovány do stavu |0⟩. Pak se hadamardská brána H použije na první qubit. Poté se brána CNOT použije 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 ──
    
  5. Pomocí balíčku můžete vizualizovat kvantové obvody jako image qsharp-widgetsSVG. V tomto případě je brána CNOT reprezentována jako čára spojující dva qubity s tečkou na řídicím qubitu a ohraničeným křížkem na qubitu target . Další informace najdete v tématu Konvence kvantových obvodů.

    from qsharp_widgets import Circuit
    
    Circuit(qsharp.dump_circuit())
    

    Snímek obrazovky Jupyter Notebook znázorňující, jak vizualizovat okruh pro Q# operaci

Zobrazení diagramů obvodů pro vstupní výraz

Diagram okruhu pro libovolný program se vstupním výrazem můžete vygenerovat voláním qsharp.circuit() a předáním vstupního výrazu jako argumentu.

  1. Například přidejte novou buňku a zkopírujte následující kód, který připraví stav 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. Přidejte novou buňku a spusťte následující kód pro vizualizaci okruhu. Můžete například připravit stav GHZ se 3 qubity.

    Circuit(qsharp.circuit("GHZSample(3)"))
    

Zobrazení diagramů obvodů pro operace s qubity

Diagramy obvodů můžete generovat pro jakoukoli operaci, která přijímá qubity nebo pole qubitů. Diagram znázorňuje tolik vodičů, kolik je vstupních qubitů, plus všechny další qubity, které jsou přiděleny v rámci operace. Když operace převezme pole qubitů (Qubit[]), okruh zobrazí pole jako registr 2 qubitů.

  1. 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...]);
    }
    
  2. 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 vizualizaci diagramu obvodů ovlivnit následující podmínky.

Dynamické okruhy

Diagramy okruhů se generují spuštěním veškeré klasické logiky v rámci Q# programu a sledováním všech přidělených qubitů nebo použitých bran. Smyčky a podmíněné hodnoty 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 však složitější na reprezentaci pomocí diagramu okruhu. Například výraz podobný následujícímu

if (M(q) == One) {
   X(q)
}

nelze vyjádřit přímočarým diagramem obvodu, protože brány jsou podmíněny výsledkem 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 trasují při simulaci.

Nevýhodou trasovaných obvodů je, že zachycují pouze výsledek měření a následné aplikace hradla pro jednu simulaci. Pokud je Zerove výše uvedeném příkladu výsledek měření , v diagramu X nevidíte bránu. Další spuštění simulace může ukázat trochu jiný okruh.

Cílový profil

Aktuálně vybraný target profil ovlivňuje způsob generování diagramů obvodů. Cílové profily slouží k určení možností hardwaru target a omezení, která jsou pro kvantový program uložená.

target Pokud je profil nastavený na neomezený, diagramy obvodů zobrazují kvantové operace, které jsou vyvolány v Q# programu. target Pokud je profil nastavený na základ QIR, diagramy okruhů zobrazují kvantové operace, které by se spustily na hardwaru, pokud se program odešle do Azure Quantum s tímto target profilem.

Poznámka

  • Pokud chcete vybrat target profil ve VS Code, přejděte na Zobrazení –> Paleta příkazů a napišteQ#: Nastavte profil Azure Quantum QIRtarget. V rozevíracím seznamu můžete vybrat Unrestricted nebo QIR Base Profile .

  • Pokud chcete vybrat target profil v Pythonu, napište qsharp.init(target_profile=qsharp.TargetProfile.Unrestricted) nebo qsharp.init(target_profile=qsharp.TargetProfile.Base).

Konkrétně se používají dekompozice hradla, díky kterým by výsledný obvod byl 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.

  1. Představte si například následující Q# program, který měří qubit a pole qubitů.

    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. Pokud target je profil nastavený na neomezené, brány zobrazené v okruhu přesně odpovídají kvantovým operacím, které jsou vyvolány v Q# programu.

    Snímek obrazovky s kvantovými obvody, pokud target je profil neomezený

  3. target Pokud je profil základem QIR, okruh vypadá jinak. Vzhledem k tomu, že základní profil targets neumožňuje opakované použití qubitů 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, zahodí se. 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.

    Snímek obrazovky s kvantovými obvody, když target je profil základem QIR