開始使用 Q# 程式和 Visual Studio Code

在本文中,您將找到使用 VC Code 建立 Q#、Jupyter Notebook 或 Python 量子運算作業的步驟,並使用 VS Code 將 Q#、Jupyter Notebook 或 Python 量子運算作業提交至 Azure Quantum。

將 Q# 作業提交至 Azure Quantum

瞭解如何使用 VS Code 執行、偵錯和提交 Q# 程式至 Azure Quantum。

必要條件

如需安裝詳細數據,請參閱 在 VS Code 上安裝新式 QDK

載入 Q# 範例程式

  1. 在 VS Code 中,選取 [ 檔案 > 新文本檔] ,並將檔案儲存為 RandomNum.qs

  2. 開啟 RandomNum.qs 並輸入 sample,然後從選項清單中選取 [隨機位範例 ],然後儲存盤案。

    螢幕快照:在檔案中撰寫文字範例時,顯示程式代碼範例清單 Visual Studio Code 中的 Q# 檔案。

注意

您也可以開啟自己的 Q# 檔案。 如果您執行較舊的 Q# 程式並遇到錯誤,請參閱 測試和 偵錯或 將程式移轉至新式 QDK

執行 Q# 程式

  1. 若要在本機測試在內建模擬器上執行程式,請按下下方@EntryPoint()命令清單中的 [執行],或按 Ctrl+F5。 您的輸出會出現在偵錯控制台中。

  2. 若要在將程式提交至 Azure Quantum 之前進行偵錯,請按下下方@EntryPoint()命令清單中的 [錯],或按 F5。 使用頂端的偵錯控件來逐一查看、進入和移出程序代碼。 如需偵錯 Q# 程式的詳細資訊,請參閱 測試和偵錯

    Visual Studio Code 中 Q# 檔案的螢幕快照,其中顯示使用執行和偵錯命令尋找程式碼鏡頭的位置。

將頻率直方圖可視化

頻率直方圖代表從執行量子程式多次或「擷取」取得的結果分佈。 直方圖中的每個橫條都會對應至可能的結果,而其高度代表觀察到結果的次數。 頻率直方圖有助於可視化這些結果的機率分佈。

  1. 選取 [檢視 -> 命令選擇區 ] 並輸入 「直方圖」,這應該 會顯示 Q#:執行檔案並顯示直方圖 選項。 您也可以從下列@EntryPoint()命令清單中按下直方圖。 選取此選項以開啟 [Q# 直方圖] 視窗。

    Visual Studio Code 中 Q# 檔案的螢幕快照,其中顯示使用直方圖命令尋找程式碼鏡頭的位置。

  2. 輸入數個要執行程序的 螢幕 快照,例如 100 次,然後按 Enter 鍵。 直方圖會顯示在 Q# 直方圖視窗中。

  3. 按兩下左上方 的設定圖示 以顯示選項。

    顯示如何顯示設定 Visual Studio Code 的 Q# 直方圖視窗螢幕快照。

  4. 按兩下列以顯示該結果的 百分比 。 在此情況下,有兩個可能的結果:0 和 1,而每個結果的百分比接近 50%。

    螢幕快照:Visual Studio Code 中的 [Q# 直方圖] 視窗。

提示

您可以使用滑鼠滾輪或軌跡板手勢來縮放直方圖。 放大時,您可以在捲動時按 『Alt』 移動瀏覽圖表。

將量子電路可視化

量子電路圖是量子作業的視覺表示法。 它們會透過量子程序顯示量子位的流程,包括套用的閘道和測量。 如需詳細資訊,請參閱 Visual Studio Code 中的量子電路圖

  1. 選取 [檢視 -> 命令選擇區 ] 並輸入 「線路」,其應該會顯示 Q#:顯示線路 選項。 您也可以從下列@EntryPoint()命令清單中按兩下 [線路]。

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

  2. 線路會顯示在 Q# 線路視窗中。 線路圖顯示一個量子位緩存器,其初始化為 |0⟩狀態。 然後,Hadamard 閘道 H 會套用至量子位,後面接著度量 作業,以計量符號表示。 如需詳細資訊,請參閱 量子電路慣例

    [Q# 線路] 視窗的螢幕快照,其中顯示隨機位作業產生的線路圖。

聯機到 Azure Quantum 並提交您的作業

您可以直接從 VS Code 連線和提交作業。 在此範例中,您會將作業提交至 Rigetti 模擬器。

  1. 選取 [檢視 -> 命令選擇區 ],然後輸入 Q#:連線至 Azure Quantum 工作區。 按下 Enter

  2. 選取 [Azure 帳戶],然後依照提示連線到您慣用的目錄、訂用帳戶和工作區。

    注意

    如果您有 連接字串,您可以選取 [連接字串],並貼上對應至 Azure Quantum 工作區的 連接字串。 如需詳細資訊,請參閱使用 連接字串 連線到 Quantum 工作區

  3. 連線之後,請在 [總管 ] 窗格中展開 [Quantum Workspaces]。

  4. 展開您的工作區,然後展開 Rigetti 提供者。

    注意

    如果連線到 Azure Quantum 時發生問題,工作區名稱旁會顯示警告圖示。 將滑鼠停留在工作區名稱上方,以顯示錯誤資訊。

  5. 選取 rigetti.sim.qvm 作為您的 target。

    Visual Studio Code 螢幕快照,其中顯示如何將 Rigetti 模擬器選取為 target。

  6. 選取名稱右側的 target 播放圖示,開始提交目前的 Q# 程式。 如果您收到彈出視窗,請選取 [變更 QIR target 配置檔並繼續]。

    Visual Studio Code 螢幕快照,其中顯示如何以 身分target執行 Rigetti 模擬器。

  7. 新增名稱以識別作業。

  8. 新增執行程式的次數或次數。

  9. Enter 以提交作業。 工作狀態會顯示在畫面底部。

  10. 展開 [作業 ] 並將滑鼠停留在您的作業上,以顯示作業的時間和狀態。

  11. 若要檢視結果,請選取作業名稱旁的雲端圖示,從工作區記憶體下載結果,並將其顯示在 VS Code 中。

    Visual Studio Code 螢幕快照,其中顯示如何下載和檢視量子作業的結果。

將 Jupyter Notebooks 作業提交至 Azure Quantum

瞭解如何使用 VS Code 執行、偵錯和提交 Q# Jupyter Notebook 至 Azure Quantum。 本文中的步驟也適用於 Azure Quantum 入口網站中本機 Jupyter 伺服器或筆記本上的 Jupyter Notebook。

必要條件

如需安裝詳細數據,請參閱 在 VS Code 上安裝新式 QDK

在本機模擬器中執行及測試您的程式

  1. 在 VS Code 中,選取 [檢視>命令選擇區],然後選取 [Create:新增 Jupyter Notebook

  2. 在右上方,VS Code 會偵測並顯示針對筆記本選取的 Python 版本和虛擬 Python 環境。 如果您有多個 Python 環境,您可能需要使用右上方的核心選擇器來選取核心。 如果未偵測到任何環境,請參閱 VS Code 中的 Jupyter Notebook 以 取得設定資訊。

  3. 在筆記本的第一個數據格中,執行下列 Python 程式代碼以匯入必要的模組:

    import qsharp
    import azure.quantum
    
    • 模組 qsharp%%qsharp 啟動magic命令,讓您直接在儲存格中輸入Q# 程式代碼。
    • azure-quantum 模組提供 Azure Quantum 工作區的連線能力。

    注意

    如果未偵測到 Jupyter Python 核心 ipykernel ,VS Code 會提示您安裝它。

  4. 新增另一個儲存格,然後輸入這個 Q# 程式代碼,以傳回使用者指定的隨機位數:

    注意

    請注意,當您輸入 magic 命令 %%qsharp時,筆記本數據格就會將類型從 Python 變更為 Q#

    %%qsharp
    
    operation Random() : Result {
        use q = Qubit();
        H(q);
        let result = M(q);
        Reset(q);
        return result
    }
    
    operation RandomNBits(N: Int): Result[] {
        mutable results = [];
        for i in 0 .. N - 1 {
            let r = Random();
            set results += [r];
        }
        return results
    }
    
  5. 若要測試您的作業,您可以使用 eval 方法,此方法可以呼叫先前在筆記本中定義的任何 Q# 作業:

    qsharp.eval("RandomNBits(4)")
    
    [Zero, One, One, Zero]
    
  6. 若要將程式執行至本機模擬器,請使用 run 方法。 shots指定 執行程式的 或 次數,模擬器會將結果傳回為 Python 清單。

    qsharp.run("RandomNBits(4)", shots=10)
    
    [[One, One, One, One],
    [Zero, Zero, One, Zero],
    [One, Zero, Zero, One],
    [Zero, One, Zero, Zero],
    [One, Zero, One, One],
    [One, Zero, One, Zero],
    [One, One, One, Zero],
    [One, One, One, One],
    [Zero, Zero, Zero, One],
    [One, Zero, Zero, One]]
    

將量子線路可視化

您可以使用封裝將 qsharp-widgets 量子線路可視化。 此套件提供小工具,可將量子線路圖轉譯為 SVG 影像。 如需詳細資訊,請參閱 使用 Jupyter Notebook 的量子線路圖

將下列程式代碼新增至新的數據格,以可視化方式呈現線路:

from qsharp_widgets import Circuit

Circuit(qsharp.circuit("RandomNBits(4)"))

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

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

使用基底配置檔編譯作業

當您在本機量子模擬器上執行程式時,可以提交任何類型的 Q# 程式。 不過,Azure Quantum 硬體 targets 尚未支持執行所有 Q# 程式所需的完整功能。 若要將 Q# 程式編譯並提交至 Azure Quantum,您必須設定 target 設定檔,以告訴 Q# 硬體 target 支援哪些功能。 目前為基底配置檔。 如需詳細資訊,請參閱 Azure Quantum 中的配置檔類型

若要重新初始化 Q# 解釋器,並使用基底設定檔編譯程式:

  1. init使用 方法來設定設定檔:

    qsharp.init(target_profile=qsharp.TargetProfile.Base)
    
  2. 由於您重新初始化解釋器,因此您必須使用新的設定檔再次執行程式碼:

    %%qsharp
    
    operation Random() : Result {
        use q = Qubit();
        H(q);
        let result = M(q);
        Reset(q);
        return result
    }
    
    operation RandomNBits(N: Int): Result[] {
        mutable results = [];
        for i in 0 .. N - 1 {
            let r = Random();
            set results += [r];
        }
        return results
    }
    
  3. 接下來,使用 compile 方法來指定作業或函式,這是程序進入點。 這會將您的程式代碼編譯為 QIR 格式,然後可以提交至任何量子硬體:

    MyProgram = qsharp.compile("RandomNBits(4)")
    

聯機到 Azure Quantum 並提交您的作業

既然您已將程式編譯成正確的格式,請建立 azure.quantum.Workspace 對象以連線到 Azure Quantum。 您將使用 Azure Quantum 工作區的資源識別碼進行連線。 您可以從 Azure 入口網站 中的工作區概觀頁面複製資源識別碼和位置。

  1. 在新的數據格中,從您的 Azure Quantum 工作區填入您的資源識別碼和位置:

    MyWorkspace = azure.quantum.Workspace(
        resource_id = "MyResourceID",
        location = "MyLocation"
    )
    
  2. get_targets使用 方法來檢視工作區中的可用硬體targets:

    MyTargets = MyWorkspace.get_targets()
    print("This workspace's targets:")
    MyTargets
    
  3. rigetti.sim.qvmtarget選取 :

    MyTarget = MyWorkspace.get_targets("rigetti.sim.qvm")
    
  4. 最後,使用 submit 方法來提交程式及其參數,並顯示結果:

    job = MyTarget.submit(MyProgram, "MyQuantumJob", shots=100)
    job.get_results()
    
    {'Histogram': ['[0, 0, 0, 0]',
      0.3,
      '[1, 0, 0, 0]',
      0.1,
      '[1, 1, 1, 1]',
      0.3,
      '[0, 1, 1, 1]',
      0.3]}
    
  5. 作業的所有屬性都可在 中 job.details存取,例如:

    print(job.details)
    print("\nJob name:", job.details.name)
    print("Job status:", job.details.status)
    print("Job ID:", job.details.id)
    
    {'additional_properties': {'isCancelling': False}, 'id': '0150202e-9638-11ee-be2f-b16153380354', 'name': 'MyQuantumJob', 'provider_id': 'rigetti'...}
    Job name: MyQuantumJob
    Job status: Succeeded
    Job ID: 0150202e-9638-11ee-be2f-b16153380354
    

使用 Q# 作業將 Python 提交至 Azure Quantum

瞭解如何使用 VS Code 撰寫 Python 程式來呼叫 Q# 作業、使用 Python 命令或 Azure CLI 連線到 Azure,以及提交您的作業。

必要條件

如需安裝詳細數據,請參閱 在 VS Code 上安裝新式 QDK

Create 併匯入 Q# 作業

qsharp透過套件,您可以將函式和作業儲存在 Q# 檔案中,並建立 Q# 專案,讓您從 Python 程式代碼呼叫其中任何函式。 當您需要啟動接受輸入參數的程式時,這特別有用。

  1. 請遵循步驟來建立 Q# 專案

  2. 開啟新的文字檔,新增下列 Q# 程式代碼,以傳回使用者指定的隨機位數目,並將檔案儲存至您的專案為 source.qs

    注意

    請注意,此 Q# 程式代碼沒有@EntryPoint類似 Q# 程式的函式 (請參閱將 Q# 作業提交至 Azure Quantum) ,但需要命名空間,不同於 Jupyter Notebook (請參閱將 Jupyter Notebook 作業提交至 Azure Quantum) 。

    namespace Sample {
    
      operation Random() : Result {
            use q = Qubit();
            H(q);
            let result = M(q);
            Reset(q);
            return result
      }
    
      operation RandomNBits(N: Int): Result[] {
            mutable results = [];
            for i in 0 .. N - 1 {
               let r = Random();
               set results += [r];
            }
            return results
      }
    }
    
  3. 在相同的資料夾中,開啟另一個檔案,並將其儲存為 randomNum.py

  4. 新增下列程式代碼以匯入 qsharpazure.quantum 模組。

    import qsharp
    import azure.quantum
    
  5. 接下來,新增程式代碼以定義 Q# 專案根資料夾,並測試在本機模擬器上執行 target 作業。 作業是由命名空間>呼叫<。<>operation_name ( ) ,在此情況下,您會傳入要傳回的隨機位數目。

    qsharp.init(project_root = '/MyProjectRootFolder')
    print(qsharp.eval("Sample.RandomNBits(4)"))
    
    [Zero, One, One, Zero]
    
  6. 您也可以使用 run 方法測試作業,此方法會傳遞其他 shots 參數,並在 Python 清單中傳回結果。 在 中 randomNum.py,將先前的 print 語句取代為下列專案:

    result = qsharp.run("Sample.RandomNBits(4)", shots=10)
    for x in result:
        print(x)
    
    [[One, One, One, One],
    [Zero, Zero, One, Zero],
    [One, Zero, Zero, One],
    [Zero, One, Zero, Zero],
    [One, Zero, One, One],
    [One, Zero, One, Zero],
    [One, One, One, Zero],
    [One, One, One, One],
    [Zero, Zero, Zero, One],
    [One, Zero, Zero, One]]
    

使用基底配置檔編譯作業

當您在本機量子模擬器上執行程式時,可以提交任何類型的 Q# 程式。 不過,Azure Quantum 硬體 targets 尚未支持執行所有 Q# 程式所需的完整功能。 若要將 Q# 程式編譯並提交至 Azure Quantum,您必須設定 target 設定檔,以告知 Q# 硬體 target 支援的功能。 目前為基底配置檔。 如需詳細資訊,請參閱 Azure Quantum 中的配置檔類型

注意

為僅限 VS Code 中的 Q# 程式,VS Code 會自動設定基底配置檔。

  1. init使用 方法來設定設定檔:

    qsharp.init(target_profile=qsharp.TargetProfile.Base)
    
  2. compile然後使用 方法來指定作業或函式,這是您程序的進入點。 然後,編譯的程式可以提交至任何量子硬體:

    MyProgram = qsharp.compile("Sample.RandomNBits(4)")
    

聯機到 Azure Quantum 並提交您的作業

您可以使用 Python 建立 Workspace 的物件連線到 Azure Quantum 並提交作業,或使用 Azure CLI 連線和提交作業。 使用 Azure CLI 需要您將編譯的程式儲存為文字檔,並使用 CLI 命令提交該檔案。

既然您已將程式編譯成正確的格式,請建立 azure.quantum.Workspace 對象以連線到 Azure Quantum。 您將使用 Azure Quantum 工作區的資源識別碼進行連線。 您可以從 Azure 入口網站 中的工作區概觀頁面複製資源識別碼和位置。

  1. 將下列程式代碼新增至 randomNum.py,從您的 Azure Quantum 工作區填入您的資源識別碼和位置:

    workspace = azure.quantum.Workspace(
        resource_id = "MyResourceID",
        location = "MyLocation"
    )
    
  2. get_targets使用 方法,在您的工作區中顯示可用的硬體targets:

    MyTargets = workspace.get_targets()
    print("This workspace's targets:")
    for x in MyTargets:
        print(x)
    
  3. rigetti.sim.qvmtarget選取 :

    MyTarget = workspace.get_targets("rigetti.sim.qvm")
    
  4. 最後,使用 submit 方法來提交程式及其參數。 作業結果會以 Python 字典的形式傳回。

    job = MyTarget.submit(MyProgram, "MyPythonJob", shots=100)
    results = job.get_results()
    print("\nResults: ", results)
    
  5. 只要擷取值並加以顯示:

    resultList = results.get("Histogram")
    for x in resultList:
        print(x)
    
    [0, 0, 0, 0]
    0.3
    [1, 0, 0, 0]
    0.1
    [1, 1, 1, 1]
    0.3
    [0, 1, 1, 1]
    0.3
    
  6. 作業的所有屬性都可在 中 job.details存取,例如:

    print(job.details)
    print("\nJob name:", job.details.name)
    print("Job status:", job.details.status)
    print("Job ID:", job.details.id)
    
    {'additional_properties': {'isCancelling': False}, 'id': '0fc396d2-97dd-11ee-9958-6ca1004ff31f', 'name': 'MyPythonJob', 'provider_id': 'rigetti'...}
    Job name: MyPythonJob
    Job status: Succeeded
    Job ID: fc396d2-97dd-11ee-9958-6ca1004ff31f
    

後續步驟