如何使用 視覺化量子電路圖 Q#

量子電路圖是量子作業的視覺表示法。 它們會透過量子程序顯示量子位的流程,包括套用的閘道和測量。

在本文中,您將瞭解如何使用 Visual Studio Code 或 Jupyter Notebook,以可視化方式呈現量子演算法與量子電路圖。

如需量子電路圖慣例的詳細資訊,請參閱 量子電路慣例

必要條件

VS Code

Jupyter 筆記本

使用 Visual Studio Code 的量子線路

請遵循下列步驟,在 Visual Studio Code 中將程式的量子線路 Q# 可視化。 如需量子電路圖慣例的詳細資訊,請參閱 量子電路慣例

檢視程式的電路圖Q#

  1. 在Visual Studio Code 中開啟檔案 Q# ,或 載入其中一個量子範例

  2. 若要將程式的量子線路 Q# 可視化,請選取 [檢視 -> 命令選擇區 ] 並輸入 「circuit」,其中應該會顯示 Q#:Show circuit 選項。 您也可以從下列@EntryPoint()命令清單中按兩下 [線路]。

    Q# Visual Studio Code 中的檔案螢幕快照,其中顯示尋找程式代碼鏡頭線路命令的位置。

  3. 線路會顯示在 Q# 線路視窗中。 例如,下列線路會對應至將量子位置於迭加中的作業,然後測量它。 電路圖顯示一個量子位緩存器,其已初始化為 |0⟩狀態。 然後,Hadamard 閘道 H 會套用至量子位,後面接著 度量作業,以計量符號表示。

    Q#顯示隨機位作業結果電路圖的線路視窗螢幕快照。

檢視作業的電路圖

您可以將單 Q# 一作業的量子電路可視化。 若要這樣做,請按兩下 出現在作業宣告上方的程式代碼鏡頭中的 [線路 ] 按鈕。

Visual Studio Code 的螢幕快照,顯示如何在偵錯程序之後,將線路窗格中的 Q# 線路可視化。

偵錯時檢視電路圖

Q#偵錯程式時,您可以根據程式的目前狀態,將量子線路可視化。

  1. 從下列@EntryPoint()程式代碼鏡頭命令清單中選取 [錯] 按鈕。

  2. 在左側的 [執行和偵錯] 檢視中,展開 [變數] 窗格下的 [Quantum Circuit] 區段,以在您逐步執行程式時顯示線路。

    Visual Studio Code 的螢幕快照,顯示如何在偵錯程式時將線路可視化。

  3. 您可以逐步執行程式代碼,並在各種點設定斷點,以查看程式執行時迴圈更新。

  4. 目前的量子線路會顯示在 Q# [線路] 面板中。 此電路圖代表模擬器的目前狀態,也就是在目前執行點之前已套用的閘道。

    Visual Studio Code 的螢幕快照,顯示如何可視化單 Q# 一作業的線路。

使用 Jupyter Notebook 的量子線路

在 Jupyter Notebooks 中,您可以使用套件將量子線路 qsharp-widgets 可視化。 此套件提供小工具,可將量子電路圖轉譯為 SVG 影像。

  1. 在 Visual Studio Code 中,選取 [ 檢視 > 命令選擇區 ],然後選取 [ 建立:新增 Jupyter Notebook]。

  2. 在筆記本的第一個數據格中,執行下列程式代碼以 匯入 Q# 模組

    import qsharp
    
  3. 新增儲存格 並輸入程式 Q# 碼。 例如,下列程式代碼會準備 Bell State。

    %%qsharp
    
    // Prepare a Bell State.
    use register = Qubit[2];
    H(register[0]);
    CNOT(register[0], register[1]);
    
  4. 您可以使用 函 dump_circuit() 式,根據程式的目前狀態來顯示量子線路。 例如,電路圖顯示兩個量子位緩存器,這些緩存器已初始化為 |0⟩狀態。 然後,Hadamard 閘道 H 會套用至第一個量子位。 之後,CNOT 閘道會使用第一個量子位做為控件來套用,其表示為點,而第二個量子位 target則以 X 表示。

    qsharp.dump_circuit()
    
    q_0    ── H ──── ● ──
    q_1    ───────── X ──
    
  5. 您可以使用封裝,將量子線路可視化為 SVG 影像qsharp-widgets。 在此情況下,CNOT 閘道會以連接兩個量子位的線條表示,而控制量子位上的點和量子位上的 target 環狀交叉。 如需詳細資訊,請參閱 量子電路慣例

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

    Jupyter Notebook 的螢幕快照,其中顯示如何可視化作業的 Q# 線路。

檢視項目表達式的電路圖

您可以呼叫 qsharp.circuit() 項目表示式,並傳遞專案表達式做為自變數,以產生任何程式的電路圖。

  1. 例如,新增數據格並複製下列程序代碼,以準備 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. 新增數據格並執行下列程序代碼,以可視化方式呈現線路。 例如,準備具有3個量子位的 GHZ 狀態。

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

使用量子位檢視作業的電路圖

您可以產生任何 採用量子位或量子位 數位數組之作業的電路圖。 此圖顯示輸入量子位的線路數目,以及作業內配置的任何其他量子位。 當作業採用量子位數組時,線路會將數位顯示為2個量子位 (Qubit[])的緩存器。

  1. 新增儲存格並複製下列範例。 此程式代碼會準備 cat 狀態。

    %%qsharp
    
    operation PrepareCatState(register : Qubit[]) : Unit {
        H(register[0]);
        ApplyToEach(CNOT(register[0], _), register[1...]);
    }
    
  2. 新增數據格並執行下列程序代碼,以可視化作業的 PrepareCatState 線路。

    Circuit(qsharp.circuit(operation="PrepareCatState"))
    

影響電路圖的條件

可視化量子電路時,下列條件可能會影響電路圖的視覺效果。

動態線路

電路圖是藉由在程式內 Q# 執行所有傳統邏輯來產生,並追蹤已配置或已套用閘道的任何量子位。 只要迴圈和條件只處理傳統值,就會受到支援。

不過,包含迴圈和使用量子位測量結果的條件表達式的程式比較棘手,以電路圖表示。 例如,如下所示的表達式

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

無法以直接的電路圖表示,因為閘道是測量結果的條件。 這類線路稱為 動態 線路。

您可以在量子模擬器中執行程式,並在套用閘道時追蹤閘道,以產生動態線路的電路圖。 這稱為 追蹤 模式,因為量子位和網關正在追蹤,因為正在執行模擬。

追蹤電路的缺點是,它們只會擷取單一仿真的測量結果和後續的網關應用程式。 在上述範例中,如果度量結果為 Zero,您就不會在 X 圖表中看到閘道。 仿真的另一個執行可能會顯示稍微不同的線路。

目標配置檔

目前選取 target 的配置檔會影響如何產生電路圖。 目標配置檔可用來指定硬體的功能 target ,以及對量子程式施加的限制。

target當配置檔設定為 UnrestrictedQIR Adaptive RI 時,電路圖會顯示程式中叫用的Q#量子作業。 target當配置檔設定為 QIR 基底時,電路圖會顯示將程式提交至具有此target配置檔的 Azure Quantum 時,將在硬體上執行的量子作業。

注意

  • 若要在 VS Code 中選取 target 設定檔,請選取 [檢視 -> 命令選擇區 ],然後選取 Q#:設定 Azure Quantum QIR target 配置檔。 您可以從下拉式清單中選取 QIR baseQIR Adaptive RIunrestricted

  • 若要在 Python 中選取target設定檔,請呼叫 qsharp.init(target_profile=qsharp.TargetProfile.Base)qsharp.init(target_profile=qsharp.TargetProfile.Unrestricted)qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RI)

具體而言,會套用閘道分解,讓產生的線路與硬體的功能 target 相容。 這些是會在程式代碼產生和提交至 Azure Quantum 期間套用的相同分解。

  1. 例如,請考慮下列 Q# 可測量量子位和量子位數組的程式。

    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. 當配置檔設定為 UnrestrictedQIR Adaptive RI 時target,線路上顯示的閘道會與程式中叫用的Q#量子作業完全對應。

    配置檔不受限制時 target 量子線路的螢幕快照。

  3. target當配置檔是 QIR 基底時,線路看起來會有所不同。 由於基底配置檔 targets 不允許在測量之後重複使用量子位,因此測量現在會改為在糾纏的量子位上執行。 由於 Reset 作業不是基底配置檔中支援的閘道,因此會卸除。 如果此程式透過此 target 配置檔提交至 Azure Quantum,產生的線路會比對硬體上執行的專案。

    配置檔為 QIR 基底時的 target 量子線路螢幕快照。