共用方式為


使用 視覺化量子線路圖 Q#

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

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

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

必要條件

如果您想要使用 Visual Studio Code 將量子線路可視化,您需要:

具有 Visual Studio Code的量子線路

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

檢視程序的線路圖Q#

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

  2. 若要可視化程式的量子線路 Q# ,請選取 [檢視 -> 命令選擇區 ],然後輸入應該啟動 [ Q#:顯示線路 ] 選項。 您也可以從下方@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] 中,選取 [檢視>命令選擇區],然後選取 [Create:新增 Jupyter Notebook

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

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

    %%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. 新增儲存格並複製下列範例。 此程式代碼會準備貓狀態。

    %%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當配置檔設定為 [不受限制] 時,線路圖會顯示程式中叫用的Q#量子作業。 target當配置檔設定為 QIR 基底時,線路圖會顯示當程式提交至具有此target配置檔的 Azure Quantum 時,會在硬體上執行的量子作業。

注意

  • 若要在 VS Code 中選取 target 設定檔,請移至 [檢視 -> 命令選擇區 ] 並寫入 Q#:設定 Azure Quantum QIR target 配置檔。 您可以從下拉式清單中選取 UnrestrictedQIR Base Profile

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

具體而言,會套用閘道分解,讓產生的線路與硬體的功能 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. 當配置檔設定為 [不受限制] 時target,線路上顯示的網關會完全符合程式中叫用的Q#量子作業。

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

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

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