Microsoft Quantum Development Kit(QDK)為具備 OpenQASM 整合的 Azure Quantum 程式提供不同的開發環境。 在本文中,您將學習如何開發和執行 OpenQASM 以下語言的程式碼:
- QDK (Visual Studio Code) 中的 VS Code 延伸
- Jupyter Notebook 裡的 QDK Python 套件。
開發者工具,例如 CodeLends、IntelliSense、程式碼補全和斷點除錯,僅在 VS Code 擴充功能中提供。 其他功能僅在 Python 套件中提供。 例如,你可以將 Q# 和 OpenQASM 可呼叫物件當作 Python 物件傳遞,並將接受輸入的 OpenQASM 程式編譯為 QIR。
先決條件
安裝最新版本的 VS Code
若要在 Python 和 Jupyter Notebook 中使用 OpenQASM,請在 安裝最新版本的 Python 擴充功能 以及 VS Code。
使用
jupyter額外選項安裝最新版本的qdkPython 套件:pip install --upgrade "qdk[jupyter]"
在OpenQASM中與VS Code一起使用QDK擴充功能
要在 OpenQASM 中撰寫 VS Code 程式碼,請開啟 Q# 專案,並建立副檔名為 OpenQASM 的 .qasm 檔案。
QDK 自動辨識該 .qasm 檔案為 OpenQASM,而且 QDK 在你撰寫程式碼時,相關 OpenQASM 功能也會隨之開放。
在QDK的OpenQASM程式中,以下VS Code功能是可用的:
- 程式碼完成
- 程式碼輔助鏡(執行、 直方圖、 估計、 偵錯和 電路)
- 語法醒目提示和基本語法功能,例如大括弧比對
- 在 OpenQASM 原始檔案中進行錯誤檢查
- OpenQASM 來源檔案的斷點除錯和腳本執行
- 使用即時電路生成進行除錯
- 與 Azure Quantum 整合以提交量子任務
要從 OpenQASM 執行你的 VS Code 程式,你可以使用 QDK 的本地模擬器,或是將程式碼以工作形式提交給 Azure Quantum。
在本地模擬器上執行程式碼QDK
要在本地稀疏量子模擬器執行你的 OpenQASM 程式碼,請打開 VS Code一個 .qasm 檔案,然後從檔案開頭的程式碼鏡頭中選擇 執行 指令。 你的程式輸出會顯示在 VS Code 終端機中。
備註
QDK 會自動嘗試設定支援您的程式的 QIR target 設定檔。 如果 QIR target 設定不支援你程式中的操作,執行 OpenQASM 程式碼時就會出現編譯器錯誤。 欲了解更多關於target剖面的資訊,請參閱不同類型的target剖面,見Azure Quantum。
內建範例程式
QDK隨附數個適用於OpenQASM的內建量子演算法範例。 要嘗試這些範例演算法,請在空的 sample 檔案中輸入 .qasm。 隨即會出現包含範例演算法的完成清單。 選擇範例,然後執行產生的程序代碼。
在本機偵錯 VS Code
QDK包含用於OpenQASM的調試程式。 除錯器支援斷點式除錯,並能渲染程式狀態。
要啟動除錯器,請從程式碼鏡頭中選擇 除錯 指令。
在偵錯模式中,您可以在程式代碼中設定斷點,以協助您進行偵錯。 你的程式狀態會顯示在 執行與除錯 面板中。 例如,您可以檢視局部變數狀態和量子位狀態。
在 Azure Quantum 執行你的程式碼
若要在 OpenQASMAzure Quantum 上執行 targets 程式,你需要有一個 Azure Quantum 工作區。 要建立 Azure Quantum 工作區,請參見 建立工作 Azure Quantum 區。
若要從 OpenQASM 將 Azure Quantum 作業提交到 VS Code,您需要連線到您的 Azure Quantum 工作區。 若要從 VS Code 連線到您的工作區,請參閱 使用連接字串進行連線。
若要從 OpenQASM 將 Azure Quantum 作業提交到 VS Code,請按照下列步驟操作:
- 在
qasm中開啟包含您程式的 VS Code 檔案。 - 選擇 Microsoft Quantum 圖示以開啟 Microsoft Quantum 面板。
- 展開 QUANTUM WORKSPACES 下拉選單,選擇你的工作區。
- 展開「 提供者」 下拉選單,選擇一個提供者,然後選擇 target 你想執行工作的供應商。 例如,將你的作業提交到
rigetti.svm.simtarget,以便在 Rigetti 的後端模擬器上執行你的程式。 欲了解更多提供者及 target 可用性資訊,請參閱「 現有工作空間中新增或移除提供者」。 - 選擇名稱 target 旁的遊玩圖示。
- 要提交工作,請輸入 工作名稱 提示和拍攝 次數 提示的數值。
要查看工作的時間和狀態,請展開 工作下拉 選單並將滑鼠移到工作名稱上。 要下載職缺結果,請選擇職缺名稱旁的直方圖或文字圖示。
在 Python 和 Jupyter Notebook 中使用 OpenQASM
使用 QDK Python 套件,你可以直接執行OpenQASM程式碼,並將電路作為操作傳OpenQASM給 Q# 程式。 把你的 OpenQASM 程式碼寫成 Python 字串,然後用這個字串在 Python 環境中執行、匯入或編譯你的 OpenQASM 程式碼。
直接在 Python 裡執行 OpenQASM
要直接執行 OpenQASM 程式碼,請使用 run 模組中的 qdk.openqasm 函式。 例如,以下程式碼在一個帶有噪音的簡單 OpenQASM 程式的本地模擬器上執行 10 次模擬:
from qdk import BitFlipNoise
from qdk.openqasm import run
qasm_code = """
include "stdgates.inc";
qubit[2] q;
reset q;
h q[0];
cx q[0], q[1];
bit c = measure q[1];
"""
results = run(qasm_code, shots=10, noise=BitFlipNoise(0.1))
print(results)
在 Q 中呼叫程式 OpenQASM #
你可以用 import_openqasm 函式把 OpenQASM 程式當作 Python 物件,然後在 Python 程式碼中後面呼叫這個物件。 例如,以下單元將一個OpenQASM電路儲存在一個名為bell的Python物件中:
from qdk import qsharp
from qdk.openqasm import import_openqasm
qasm_code = """
include "stdgates.inc";
qubit[2] q;
reset q;
h q[0];
cx q[0], q[1];
bit c = measure q[1];
"""
import_openqasm(qasm_code, name="bell")
當 bell 是你環境的一部分時,你可以直接從 Q# 儲存格執行:
%%qsharp
use qs = Qubit[2];
bell(qs)
你也可以用 QDK 套件 bell的功能來搭配,例如雜訊模擬、電路渲染和程式碼產生。
參數化 OpenQASM 程式
以下單元建立一個OpenQASM電路,該電路以 theta 角度作為輸入,然後將這個電路作為Python函數來調用。
from qdk.openqasm import import_openqasm, ProgramType
qasm_code = """
include "stdgates.inc";
input float theta;
qubit[2] q;
rx(theta) q[0];
rx(-theta) q[1];
bit[2] c;
c = measure q;
"""
import_openqasm(qasm_code, name="parameterized_circuit", program_type=ProgramType.File)
from qdk.code.qasm_import import parameterized_circuit
parameterized_circuit(1.57)
將一個 OpenQASM 程式傳遞給 Q#
使用 QDK Python 套件,你可以直接將程式OpenQASM傳給 Q# 程式。 例如,以下程式碼會建立一個名為 OpenQASM 的 Entangle 程式,然後在 Q# 程式中使用 Entangle 作為操作:
from qdk.openqasm import import_openqasm
from qdk import qsharp
qasm_code = """
include "stdgates.inc";
qubit[2] qs;
h qs[0];
cx qs[0], qs[1];
"""
import_openqasm(qasm_code, name="Entangle")
qsharp.eval("{ use qs = Qubit[2]; Entangle(qs); MResetEachZ(qs) }")
當你匯入 Q# 並匯入 OpenQASM 程式,且在 Python 環境中有 qsharp.eval 和 import_openqasm,這些程式就會變成你可以在 Python 程式碼中呼叫的Python物件。 例如,以下程式碼會建立一個名為 TestAntiCorrelation Q# 的程式,並將該 EntangleOpenQASM 程式傳遞給 TestAntiCorrelation:
qsharp.eval("""
operation TestAntiCorrelation(entangler : Qubit[] => Unit) : Result[] {
use qs = Qubit[2];
X(qs[1]);
entangler(qs);
MResetEachZ(qs)
}
""")
from qdk.code import Entangle, TestAntiCorrelation
TestAntiCorrelation(Entangle)
將程式編譯 OpenQASM 成 QIR
您可以使用函式OpenQASM將代碼編譯compile成 Quantum Intermediate Representation(QIR)。
例如,下列數據格會將 OpenQASM 參數化線路的程式代碼編譯成 QIR:
from qdk import TargetProfile
from qdk.openqasm import import_openqasm, ProgramType
from qdk import qsharp
qsharp.init(target_profile=TargetProfile.Base)
qasm_code = """
include "stdgates.inc";
input float theta;
qubit[2] q;
rx(theta) q[0];
rx(-theta) q[1];
bit[2] c;
c = measure q;
"""
import_openqasm(qasm_code, name="parameterized_circuit", program_type=ProgramType.File)
from qdk.code.qasm_import import parameterized_circuit
bound_compilation = qsharp.compile(parameterized_circuit, 1.57)
print(bound_compilation)
備註
要編譯OpenQASM將輸入變數整合進 QIR 的程式,你需要使用 QDK Python 套件。 你不能使用 OpenQASM 中的 QDK 擴充套件將參數化 VS Code 程式編譯成 QIR。
將 OpenQASM 計畫提交至 Azure Quantum
若要提交OpenQASM程式執行於Azure Quantumtarget ,先將程式碼編譯OpenQASM成 QIR,然後提交 QIR 執行Azure Quantum。
例如,將一個簡單的糾纏電路編譯成 QIR。
from qdk.openqasm import compile
qasm_code = """
include "stdgates.inc";
bit[2] c;
qubit[2] q;
h q[0];
cx q[0], q[1];
c = measure q;
"""
qir_compilation = compile(qasm_code)
若要執行傳送至 Azure Quantum 的 QIR 作業,請連線到您的量子工作區,並將該作業提交至工作區中其中一個可用的 targets。 例如,提交糾纏電路的 QIR,讓它在 IonQ 的後端模擬器上執行。
from qdk.azure import Workspace
workspace = Workspace(resource_id="") # Add the resource ID of your workspace
target = workspace.get_targets('ionq.simulator')
job = target.submit(qir_compilation, shots=100)
print("Job submitted. Waiting for results...")
results = job.get_results()
print(results)
持續 OpenQASM 發展 QDK
OpenQASM中的QDK支援正在進行中。