如何使用 Visual Studio Code 提交 Q# 程式

瞭解如何使用 Visual Studio Code 建立 Q# 程式,並將其提交至實際的量子硬體。 您可以將量子運算作業提交至 Azure Quantum 作為獨立的 Q# 程式、將 Q# 與 Python 結合在 Q# 專案中,然後執行 Jupyter Notebook。

將 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# 程式並遇到錯誤,請參閱 測試和偵錯

執行 Q# 程式

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

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

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

將頻率直方圖可視化

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

  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# 檔案螢幕快照,其中顯示尋找程式代碼鏡頭線路命令的位置。

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

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

連線至 Azure Quantum 並提交您的作業

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

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

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

    注意

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

  3. 聯機之後,請在 [ 總管] 窗格中展開 [Quantum 工作區]。

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

    注意

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

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

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

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

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

  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 伺服器或 Notebook 上的 Jupyter Notebook。

必要條件

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

在本機模擬器中執行和測試程式

  1. 在 VS Code 中,選取 [檢視]>[命令選擇區],然後選取 [建立:新增 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()
    
    {'[0, 1, 1, 1]': 0.08,
     '[1, 1, 0, 0]': 0.1,
     '[0, 0, 1, 0]': 0.04,
     '[0, 1, 0, 0]': 0.05,
     '[1, 0, 1, 0]': 0.05,
     '[1, 0, 0, 0]': 0.07,
     '[0, 1, 0, 1]': 0.07,
     '[1, 0, 1, 1]': 0.07,
     '[0, 0, 0, 0]': 0.08,
     '[1, 1, 1, 0]': 0.05,
     '[0, 0, 0, 1]': 0.1,
     '[0, 0, 1, 1]': 0.04,
     '[0, 1, 1, 0]': 0.09,
     '[1, 0, 0, 1]': 0.04,
     '[1, 1, 1, 1]': 0.05,
     '[1, 1, 0, 1]': 0.02}
    
  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
    

其他作業詳細數據

azure.quantum Python 套件包含其他方法來顯示更詳細的作業數據。

  • job.get_results_histogram():此方法會針對每個唯一的度量傳回結果和拍攝計數的字典。 例如,上一個作業的結果會是

    print(job.get_results_histogram()) 
    
    {   
        '[0, 1, 1, 1]' : {'Outcome' : [0, 1, 1, 1], 'Count' : 8},  
        '[1, 1, 0, 0]' : {'Outcome' : [1, 1, 0, 0], 'Count' : 10},
        '[0, 0, 1, 0]' : {'Outcome' : [0, 0, 1, 0], 'Count' : 4},
        '[0, 1, 0, 0]' : {'Outcome' : [0, 1, 0, 0], 'Count' : 5},
        '[1, 0, 1, 0]' : {'Outcome' : [1, 0, 1, 0], 'Count' : 5},  
        '[1, 0, 0, 0]' : {'Outcome' : [1, 0, 0, 0], 'Count' : 7},
        '[0, 1, 0, 1]' : {'Outcome' : [0, 1, 0, 1], 'Count' : 7},
        '[1, 0, 1, 1]' : {'Outcome' : [1, 0, 1, 1], 'Count' : 7},
        '[0, 0, 0, 0]' : {'Outcome' : [0, 0, 0, 0], 'Count' : 8},  
        '[1, 1, 1, 0]' : {'Outcome' : [1, 1, 1, 0], 'Count' : 5},
        '[0, 0, 0, 1]' : {'Outcome' : [0, 0, 0, 1], 'Count' : 10},
        '[0, 0, 1, 1]' : {'Outcome' : [0, 0, 1, 1], 'Count' : 4},
        '[0, 1, 1, 0]' : {'Outcome' : [0, 1, 1, 0], 'Count' : 9},  
        '[1, 0, 0, 1]' : {'Outcome' : [1, 0, 0, 1], 'Count' : 4},
        '[1, 1, 1, 1]' : {'Outcome' : [1, 1, 1, 1], 'Count' : 5},
        '[1, 1, 0, 1]' : {'Outcome' : [1, 1, 0, 1], 'Count' : 2}
    }
    
  • job.get_results_shots() :此方法會傳回每個拍攝結果的清單。 例如,上一個作業的結果會是

    print(job.get_results_shots()) 
    
    [ [0, 1, 1, 1], [1, 0, 1, 1], [0, 0, 1, 1], [1, 1, 0, 1], [1, 0, 0, 0], [1, 0, 1, 1], [1, 1, 0, 1], ...]
    

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

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

必要條件

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

建立並匯入 Q# 作業

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

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

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

    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. 在專案根資料夾中(使用 qsharp.json 檔案),開啟另一個檔案,並將它儲存為 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 支援的功能。 目前為 BaseAdpative_RI 配置檔。 如需詳細資訊,請參閱 Azure Quantum 中的配置檔類型。

注意

若為 僅限 VS Code 中的 Q# 程式,VS Code 會自動設定 Base 設定檔。

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

    qsharp.init(project_root = '../MyProjectRootFolder', target_profile=qsharp.TargetProfile.Base)
    

    注意

    因為您要重新初始化 qsharp 狀態,所以您必須再次設定 project_root 參數,讓編譯程式知道要在哪裡尋找 RandomNBits 作業。 這也可以在上一個程式的步驟 5 中完成。

  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. 只要擷取值並加以顯示:

    for x in results:
        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
    

其他作業詳細數據

azure.quantum Python 套件包含其他方法來顯示更詳細的作業數據。

  • job.get_results_histogram():此方法會針對每個唯一的度量傳回結果和拍攝計數的字典。 例如,上一個作業的結果會是

    results = job.get_results_histogram()
    for x in results.items():
        print(x)
    
    {   
        '[0, 0, 0, 0]' : {'Outcome' : [0, 0, 0, 0], 'Count' : 30},  
        '[1, 0, 0, 0]' : {'Outcome' : [1, 0, 0, 0], 'Count' : 10},
        '[1, 1, 1, 1]' : {'Outcome' : [1, 1, 1, 1], 'Count' : 30},
        '[0, 1, 1, 1]' : {'Outcome' : [0, 1, 1, 1], 'Count' : 30}
    }
    
  • job.get_results_shots() :此方法會傳回每個拍攝結果的清單。 例如,上一個作業的結果會是

    print(job.get_results_shots()) 
    
    [ [0, 0, 0, 0], [1, 1, 1, 1], [0, 1, 1, 1], [1, 1, 1, 1], [1, 0, 0, 0], [0, 1, 1, 1], [0, 0, 0, 0], ...]