如何使用 視覺化量子電路圖 Q#
量子電路圖是量子作業的視覺表示法。 它們會透過量子程序顯示量子位的流程,包括套用的閘道和測量。
在本文中,您將瞭解如何使用 Visual Studio Code 或 Jupyter Notebook,以可視化方式呈現量子演算法與量子電路圖。
如需量子電路圖慣例的詳細資訊,請參閱 量子電路慣例。
必要條件
VS Code
最新版的 Visual Studio Code 或開啟 Web上的 VS Code。
最新版的 Azure Quantum 開發套件延伸模組。
最新的 Azure Quantum
qsharp
和azure-quantum
Python 套件。python -m pip install --upgrade qsharp azure-quantum
Jupyter 筆記本
最新版的 Visual Studio Code 或開啟 Web上的 VS Code。
已安裝 Azure Quantum Development Kit、 Python 和 Jupyter 擴充功能的 VS Code。
最新的 Azure Quantum
qsharp
和qsharp-widgets
套件,以及套件ipykernel
。python -m pip install --upgrade qsharp qsharp-widgets ipykernel
使用 Visual Studio Code 的量子線路
請遵循下列步驟,在 Visual Studio Code 中將程式的量子線路 Q# 可視化。 如需量子電路圖慣例的詳細資訊,請參閱 量子電路慣例。
檢視程式的電路圖Q#
在Visual Studio Code 中開啟檔案 Q# ,或 載入其中一個量子範例。
若要將程式的量子線路 Q# 可視化,請選取 [檢視 -> 命令選擇區 ] 並輸入 「circuit」,其中應該會顯示 Q#:Show circuit 選項。 您也可以從前面的
Main()
命令清單中按兩下 [線路]。線路會顯示在 Q# 線路視窗中。 例如,下列線路會對應至將量子位置於迭加中的作業,然後測量它。 電路圖顯示一個量子位緩存器,其已初始化為 |0⟩狀態。 然後,Hadamard 閘道 H 會套用至量子位,後面接著 度量作業,以計量符號表示。
檢視作業的電路圖
您可以將單 Q# 一作業的量子電路可視化。 若要這樣做,請按兩下 出現在作業宣告上方的程式代碼鏡頭中的 [線路 ] 按鈕。
偵錯時檢視電路圖
Q#偵錯程式時,您可以根據程式的目前狀態,將量子線路可視化。
從前面的
Main()
程式代碼鏡頭命令清單中選取 [偵錯] 按鈕。在左側的 [執行和偵錯] 檢視中,展開 [變數] 窗格下的 [Quantum Circuit] 區段,以在您逐步執行程式時顯示線路。
您可以逐步執行程式代碼,並在各種點設定斷點,以查看程式執行時迴圈更新。
目前的量子線路會顯示在 Q# [線路] 面板中。 此電路圖代表模擬器的目前狀態,也就是在目前執行點之前已套用的閘道。
使用 Jupyter Notebook 的量子線路
在 Jupyter Notebooks 中,您可以使用套件將量子線路 qsharp-widgets
可視化。 此套件提供小工具,可將量子電路圖轉譯為 SVG 影像。
在 Visual Studio Code 中,選取 [ 檢視 > 命令選擇區 ],然後選取 [ 建立:新增 Jupyter Notebook]。
在筆記本的第一個數據格中,執行下列程式代碼以 匯入 Q# 模組。
import qsharp
新增儲存格 並輸入程式 Q# 碼。 例如,下列程式代碼會準備 Bell State。
%%qsharp // Prepare a Bell State. use register = Qubit[2]; H(register[0]); CNOT(register[0], register[1]);
您可以使用 函
dump_circuit()
式,根據程式的目前狀態來顯示量子線路。 例如,電路圖顯示兩個量子位緩存器,這些緩存器已初始化為 |0⟩狀態。 然後,Hadamard 閘道 H 會套用至第一個量子位。 之後,CNOT 閘道會使用第一個量子位做為控件來套用,其表示為點,而第二個量子位 target則以 X 表示。qsharp.dump_circuit()
q_0 ── H ──── ● ── q_1 ───────── X ──
您可以使用封裝,將量子線路可視化為 SVG 影像
qsharp-widgets
。 在此情況下,CNOT 閘道會以連接兩個量子位的線條表示,而控制量子位上的點和量子位上的 target 環狀交叉。 如需詳細資訊,請參閱 量子電路慣例。from qsharp_widgets import Circuit Circuit(qsharp.dump_circuit())
檢視項目表達式的電路圖
您可以呼叫 qsharp.circuit()
項目表示式,並傳遞專案表達式做為自變數,以產生任何程式的電路圖。
例如,新增數據格並複製下列程序代碼,以準備 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; }
新增數據格並執行下列程序代碼,以可視化方式呈現線路。 例如,準備具有3個量子位的 GHZ 狀態。
Circuit(qsharp.circuit("GHZSample(3)"))
使用量子位檢視作業的電路圖
您可以產生任何 採用量子位或量子位 數位數組之作業的電路圖。 此圖顯示輸入量子位的線路數目,以及作業內配置的任何其他量子位。 當作業採用量子位數組時,線路會將數位顯示為2個量子位 (Qubit[])
的緩存器。
新增儲存格並複製下列範例。 此程式代碼會準備 cat 狀態。
%%qsharp operation PrepareCatState(register : Qubit[]) : Unit { H(register[0]); ApplyToEach(CNOT(register[0], _), register[1...]); }
新增數據格並執行下列程序代碼,以可視化作業的
PrepareCatState
線路。Circuit(qsharp.circuit(operation="PrepareCatState"))
影響電路圖的條件
可視化量子電路時,下列條件可能會影響電路圖的視覺效果。
動態線路
電路圖是藉由在程式內 Q# 執行所有傳統邏輯來產生,並追蹤已配置或已套用閘道的任何量子位。 只要迴圈和條件只處理傳統值,就會受到支援。
不過,包含迴圈和使用量子位測量結果的條件表達式的程式比較棘手,以電路圖表示。 例如,如下所示的表達式
if (M(q) == One) {
X(q)
}
無法以直接的電路圖表示,因為閘道是測量結果的條件。 這類線路稱為 動態 線路。
您可以在量子模擬器中執行程式,並在套用閘道時追蹤閘道,以產生動態線路的電路圖。 這稱為 追蹤 模式,因為量子位和網關正在追蹤,因為正在執行模擬。
追蹤電路的缺點是,它們只會擷取單一仿真的測量結果和後續的網關應用程式。 在上述範例中,如果度量結果為 Zero
,您就不會在 X
圖表中看到閘道。 仿真的另一個執行可能會顯示稍微不同的線路。
Target 設定檔
目前選取 target 的配置檔會影響如何產生電路圖。 Target 配置檔可用來指定硬體的功能 target ,以及對量子程式施加的限制。
target當配置檔設定為 Unrestricted 或 QIR Adaptive RI 時,電路圖會顯示程式中叫用的Q#量子作業。 target當配置檔設定為 QIR 基底時,電路圖會顯示將程式提交至具有此target配置檔的 Azure Quantum 時,將在硬體上執行的量子作業。
注意
若要在 VS Code 中選取 target 設定檔,請選取 [檢視 -> 命令選擇區 ],然後選取 Q#:設定 Azure Quantum QIR target 配置檔。 您可以從下拉式清單中選取
QIR base
、QIR Adaptive RI
或unrestricted
。若要在 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 期間套用的相同分解。
例如,請考慮下列 Q# 可測量量子位和量子位數組的程式。
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); }
當配置檔設定為 Unrestricted 或 QIR Adaptive RI 時target,線路上顯示的閘道會與程式中叫用的Q#量子作業完全對應。
target當配置檔是 QIR 基底時,線路看起來會有所不同。 由於基底配置檔 targets 不允許在測量之後重複使用量子位,因此測量現在會改為在糾纏的量子位上執行。 由於
Reset
作業不是基底配置檔中支援的閘道,因此會卸除。 如果此程式透過此 target 配置檔提交至 Azure Quantum,產生的線路會比對硬體上執行的專案。