你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用自适应 target 配置文件运行混合量子计算作业

混合计算结合了经典计算和量子计算过程来解决复杂的问题。

在混合计算中,经典代码基于中间电路测量控制量子操作的执行,而物理量子比特保持活动状态。 可以在单个量子程序中使用常见的编程技术,例如嵌套条件、循环和函数调用,以运行复杂的问题,从而减少所需的镜头数。 借助量子比特重用技术,较大的程序可以使用较少的量子比特在计算机上运行。

本文介绍如何使用 QIR Adaptive RItarget 配置文件将混合作业提交到 Azure Quantum。 自适应 RI target 配置文件支持中间电路测量、基于度量的控制流、量子比特重置和经典整数计算。

先决条件

已支持 targets

若要运行混合量子计算作业,需要选择支持自适应 RI target 配置文件量子提供程序。

目前,Azure Quantum 中的自适应target配置文件在 Quantinuumtargets 上受支持。

提交自适应 RI 作业

若要提交混合量子计算作业,需要将 target 配置文件 配置为 QIR Adaptive RIRI 代表的位置“qubit Reset 和 Integer computations”。

该 QIR Adaptive RItarget 配置文件支持中线测量、基于度量的控制流、量子比特重置和经典整数计算。

可以将混合量子作业作为 Q# 独立程序或 Python + Q# 程序提交到 Azure Quantum。 若要配置混合量子作业的 target 配置文件,请参阅以下部分。

若要在 Visual Studio Code 中配置 target 混合作业的配置文件,请执行以下步骤:

  1. Q#在 Visual Studio Code 中打开程序。
  2. 选择“视图”->“命令面板”并键入“Q#:设置 Azure Quantum QIR target 配置文件”。 按 Enter
  3. 选择 QIR Adaptive RI

将程序设置为QIR Adaptive RItarget配置文件后,可以将程序作为混合量子作业提交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 页面

注意

在使用不支持的功能target时Q#,需要选择适当的QIR Adaptive RItarget配置文件以获取适当的反馈。

若要查看支持的功能,请将以下代码复制到文件中 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 支持动态布尔值和整数,这意味着依赖于度量结果的布尔值和整数。 请注意, r0Result 类型可用于生成动态布尔值和整数值。

        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 门来读取此点,以使在测量时可观察阶段。

可在此处找到代码示例

注意

此示例代码由 毕马威 量子团队成员在 澳大利亚 中编写,属于 MIT 许可证。 它演示了扩展的功能 QIR Adaptive RItargets ,并利用了有限循环、运行时的经典函数调用、嵌套条件 if 语句、中间线路度量和量子比特重用。