使用調適型 target 配置檔執行混合式量子運算作業

混合式運算結合了傳統和量子運算程式,以解決複雜的問題。

在混合式運算中,傳統程式代碼會根據中電路測量控制量子作業的執行,而實體量子位仍為使用中。 您可以在單一量子程式中使用常見的程式設計技術,例如巢狀條件、迴圈和函數調用,以執行複雜的問題,減少所需的拍攝次數。 使用量子位重複使用技術,較大的程式可以使用較少的量子位在機器上執行。

本文說明如何使用配置檔將混合式作業提交至 Azure Quantum QIR Adaptive RItarget 。 Adaptive RI target 配置檔支援中電路測量、測量型控制流程、量子位重設和傳統整數計算。

必要條件

支援 targets

若要執行混合式量子運算作業,您必須選取支援 Adaptive RI target 配置檔量子提供者。

Azure Quantum 中的調適型 target 配置檔目前支援 Quantinuumtargets。

提交調適型 RI 作業

若要提交混合式量子運算作業,您必須將 target 設定檔 設定為 QIR Adaptive RI,其中 RI 代表 “qubit Reset 和 Integer computations” 。

配置檔 QIR Adaptive RItarget 提供中電路測量、測量型控制流程、量子位重設和傳統整數計算的支援。

您可以將混合式量子作業提交至 Azure Quantum 作為 Q# 獨立程式或 Python + Q# 程式。 若要設定混合式量子作業的 target 配置檔,請參閱下列各節。

target若要在 Visual Studio Code 中設定混合式作業的配置檔,請遵循下列步驟:

  1. Q#在 Visual Studio Code 中開啟程式。
  2. 選取 [檢視] -> [命令選擇區] 並鍵入 Q#:設定 Azure Quantum QIR target 設定檔。 按 Enter 鍵。
  3. 選取 QIR Adaptive RI

設定 QIR Adaptive RI 為 target 配置文件之後,您可以將程式 Q# 提交為混合式量子作業至 Quantinuum。

  1. 選取 [ 檢視 -> 命令選擇區 ],然後輸入 Q#:連線至 Azure Quantum 工作區。 按 Enter 鍵。
  2. 選取 [Azure 帳戶],然後依照提示連線到您慣用的目錄、訂用帳戶和工作區。
  3. 聯機之後,請在 [ 總管] 窗格中展開 [Quantum 工作區]。
  4. 展開您的工作區,然後展開 Quantinuum 提供者。
  5. 選取任何可用的 targetQuantinuum ,例如 quantinuum.sim.h1-1e
  6. 選取名稱右側的 target 播放圖示,開始提交目前的 Q# 程式。
  7. 新增名稱以識別作業,以及拍攝次數。
  8. 按 [Enter] 以提交作業。 工作狀態會顯示在畫面底部。
  9. 展開 [作業],並將滑鼠停留在您的作業上,以顯示作業的時間和狀態。

支援的功能

下表列出 Azure Quantum 中搭配 Quantinuum 進行混合式量子運算的支援功能。

支援的功能 備註
Dynamics 值 布爾值和整數,其值相依於度量結果
迴圈 僅限傳統系結的迴圈
任意控制流程 使用 if/else 分支
中電路測量 利用傳統快取器資源
量子位重複使用 支援
即時傳統計算 64 位帶正負號的整數算術
利用傳統快取器資源

當選取target的語言功能不受支援時Q#,QDK 會提供target特定意見反應。 Q#如果您的程式在執行混合式量子作業時包含不支援的功能,您會在設計時間收到錯誤訊息。 如需詳細資訊,請參閱 QIR Wiki 頁面

注意

您必須選取適當的 QIR Adaptive RItarget 配置檔,才能在使用 Q# 不支援的功能 target 時取得適當的意見反應。

若要查看作用中支援的功能,請將下列程式代碼 Q# 複製到檔案中,並新增後續的代碼段。

namespace HybridIntegrated {
    open Microsoft.Quantum.Measurement;
    open Microsoft.Quantum.Math;
    open Microsoft.Quantum.Convert;

    @EntryPoint()
    operation Main() : Result {
        use (q0, q1) = (Qubit(), Qubit());
        H(q0);
        let r0 = MResetZ(q0);

        // Copy here the code snippets below to see the supported features 
        // in action.
        // Supported features include dynamic values, classically-bounded loops, 
        // arbitrary control flow, and mid-circuit measurement.

        r0
    }

}

Quantinuum 支援動態布爾值和整數,這表示相依於度量結果的 bools 和整數。 請注意, r0 這是 Result 可用來產生動態布爾值和整數值的型別。

        let dynamicBool = r0 != Zero; 
        let dynamicBool = ResultAsBool(r0); 
        let dynamicInt = dynamicBool ? 0 | 1; 

Quantinuum 支援動態布爾值和整數,不過,它不支援其他數據類型的動態值,例如 double。 複製下列程序代碼,以查看有關動態值限制的意見反應。

        let dynamicDouble = r0 == One ? 1. | 0.; // cannot use a dynamic double value
        let dynamicInt = r0 == One ? 1 | 0;
        let dynamicDouble = IntAsDouble(dynamicInt); // cannot use a dynamic double value
        let dynamicRoot = Sqrt(dynamicDouble); // cannot use a dynamic double value

即使某些數據類型不支援動態值,這些數據類型仍可與靜態值搭配使用。

    let staticRoot = Sqrt(4.0);
    let staticBigInt = IntAsBigInt(2);

即使是支援型別的動態值在某些情況下也無法使用。 例如,Quantinuum 不支援動態陣列,也就是說,其大小相依於測量結果的陣列。 Quantinuum 也不支援動態系結的迴圈。 複製下列程式代碼以查看動態值的限制。

        let dynamicInt = r0 == Zero ? 2 | 4;
        let dynamicallySizedArray = [0, size = dynamicInt]; // cannot use a dynamically-sized array
        let staticallySizedArray = [0, size = 10];
        // Loops with a dynamic condition are not supported by Quantinuum.
        for _ in 0..dynamicInt {
            Rx(PI(), q1);
        }
        
        // Loops with a static condition are supported.
        let staticInt = 3;
        for _ in 0..staticInt {  
            Rx(PI(), q1);  
        }

Quantinuum 支援使用靜態和動態條件的控制流程,包括 if/else 分支。 動態條件的分支也稱為以測量結果為基礎的分支。

        let dynamicInt = r0 == Zero ? 0 | 1; 
        if dynamicInt > 0 {
            X(q1);
        }
        let staticInt = 1;
        if staticInt > 5 {
            Y(q1);
        } else {
            Z(q1);
        }

Quantinuum 支援具有傳統條件的迴圈,包括 if 表達式。

        for idx in 0..3 {
            if idx % 2 == 0 {
                Rx(ArcSin(1.), q0);
                Rz(IntAsDouble(idx) * PI(), q1)
            } else {
                Ry(ArcCos(-1.), q1);
                Rz(IntAsDouble(idx) * PI(), q1)
            }
        }

Quantinuum 支援中電路測量,也就是根據測量結果進行分支。

        if r0 == One {
            X(q1);
        }
        let r1 = MResetZ(q1);
        if r0 != r1 {
            let angle = PI() + PI() + PI()* Sin(PI()/2.0);
            Rxx(angle, q0, q1);
        } else {
            Rxx(PI() + PI() + 2.0 * PI() * Sin(PI()/2.0), q1, q0);
        }

估計混合式量子運算作業的成本

您可以先在模擬器上執行混合式量子運算作業,以估計在Quantinuum硬體上執行混合式量子運算作業的成本。

在模擬器上成功執行之後:

  1. 在您的 Azure Quantum 工作區中,選取 [ 作業管理]。
  2. 選取您提交的作業。
  3. 在 [ 作業詳細數據] 彈出視窗中,選取 [ 成本估計 ] 以檢視已使用多少 eHQC(Quantinuum 模擬器點數)。 此數位會直接轉譯為在Quantinuum硬體上執行作業所需的 HQC 數目(Quantinuum 量子點數)。

成本估計

注意

Quantinuum 會取消註冊整個線路,並計算所有程式代碼路徑的成本,無論其是否有條件地執行。

混合式量子運算範例

您可以在程式代碼範例存放庫中找到Q#下列範例。 它們示範混合式量子運算的目前功能集。

三量子位重複程序代碼

此範例示範如何建立 三個量子位重複程序代碼 ,以用來偵測和更正位翻轉錯誤。

它會利用整合式混合式運算功能來計算在邏輯量子位緩存器狀態一致時執行錯誤更正的次數。

您可以在這裡找到程式碼範例

反覆階段估計

此範例程式示範 內的 Q#反覆階段估計。 它會使用反覆階段估計來計算編碼在量子位和輔助量子位上 target 編碼的兩個二維向量之間的內部乘積。 另一個控制量子位也會初始化,這是用於測量的唯一量子位。

線路一開始會編碼量子位和輔助量子位上的 target 向量組。 然後,它會將 Oracle 運算子套用至整個緩存器,並控制在 $\ket +$ 狀態中設定的控制量子位。 受控制的 Oracle 運算符會產生控制量子位 $\ket 1$ 狀態的階段。 然後,您可以將 H 閘道套用至控制量子位,讓測量時可觀察階段。

您可以在這裡找到程式碼範例

注意

此範例程式代碼是由畢馬威 Quantum 小組成員在 澳大利亞 中撰寫,且屬於 MIT 授權。 它示範的擴充功能 QIR Adaptive RItargets ,並利用周框迴圈、運行時間的傳統函式呼叫、巢狀條件式 if 語句、中間電路測量和量子位重複使用。