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

将 Q# 代码迁移到新式 QDK

2024 年 1 月发布的 Azure Quantum 开发工具包 (现代 QDK) 是 Visual Studio Code 和 Azure Quantum 门户中使用的默认Q#开发工具包。 有关新功能和改进的详细信息,请参阅 新式 QDK 中的新增功能

如果你有为 Microsoft Quantum 开发工具包 (经典 QDK) 编写的现有程序,则至少需要为新的 API、进程和工具修改某些元素。 此外,还对语言语法进行了改进, Q# 使编码更轻松、更灵活。

本文将指导你完成在新的 QDK 上启动和运行代码的最常见方案。S

弃用 Visual Studio 作为开发平台

新式 QDK 删除了对 Visual Studio 和关联的 .NET 量子库的支持。 如果已有 Visual Studio 项目,强烈建议使用本文中的指南将它们迁移到新式 QDK。 若要继续对项目使用经典 QDK,请参阅 继续在经典 QDK 中工作

从 Q# 文件导入模块

对于使用 Q# (*.qs) 文件将函数和操作作为模块导入 Q# 的 Python 程序,导入语法已更改。

在经典 QDK 中,若要从 文件source.qs导入并运行Random()操作:

namespace Sample {
    operation Random() : Result {
        use q = Qubit();
        H(q);
        let result = M(q);
        Reset(q);
        return result
    }
}

将使用标准 Python 导入语法:

from Sample import Random

print(Random.simulate())

source.qs要求和 Python 程序位于同一文件夹中。

若要使用新式 QDK 导入相同的操作,请定义一个项目Q#,以便以更高效、更合乎逻辑的方式组织源文件和库。 有关定义 Q# 项目的详细步骤,请参阅 使用 Q# 项目

设置项目文件夹并创建简单的清单文件后,使用 qsharp.init 指向项目根目录,访问qsharp.eval源文件并导入<命名空间>。<>operation_name。

qsharp.init(project_root = '/MyProjectFolder')
print(qsharp.eval("Sample.Random()"))

如果要导入的操作或函数采用输入值,也可以传递这些值:

print(qsharp.eval("Sample.Random(4)"))

在本地模拟器上运行程序

经典 QDK 中的大多数内存中模拟器已弃用,将 稀疏模拟器 保留为 VS Code 和 Azure Quantum 门户中的默认本地模拟器。

已弃用的模拟器:

  • 全状态模拟器
  • 噪声模拟器
  • 跟踪模拟器
  • Toffoli 模拟器

运行默认稀疏模拟器:

方案 方法
Q#在 VS Code 中的程序中 选择“运行文件”Q#
在 Python 笔记本单元格中 result=qsharp.eval("EntryPointOperation()")

result=qsharp.run("EntryPointOperation()", shots=##)
在笔记本单元格中%%qsharp EntryPointOperation()

强制释放量子比特

新式 QDK 强制要求量子比特处于地面或 |0⟩ 状态,然后再在其作用域末尾释放。 这是为了防止量子比特在量子硬件上运行程序时可能以意外状态重复使用。

例如,以下代码触发运行时错误:

operation MyOperation() : Result {
    use q = Qubit();
        X(q);
        return M(q);
}

需要修改 和 以在返回度量值之前重置量子比特:

operation MyOperation() : Result {
    use q = Qubit();
        X(q);
        let r = M(q);
        Reset(q);
        return r;
}

或使用重置量子比特的操作作为测量的一部分:

open Microsoft.Quantum.Measurement;
operation MyOperation() : Result {
    use q = Qubit();
    X(q);
    return MResetZ(q);
}

配置基本配置文件

与本地模拟器不同,Azure Quantum 硬件目标尚不支持运行所有 Q# 程序所需的全部功能。 如果要将作业提交到 Azure Quantum,在编译程序之前,需要设置目标配置文件以告知 Q# 目标硬件支持哪些功能。 目前,只有符合 QIR 基本配置文件的程序才能提交到 Azure Quantum。 请注意,对于在本地模拟器上运行代码,可以使用任何配置文件配置。

VS Code

VS Code 在文件底部 Q# 的状态栏中显示配置文件模式,可以是 QIR:BaseUnrestricted无限制 模式最适用于在模拟器上运行代码。 如果要将作业提交到 Azure Quantum,并收到未为基本配置文件设置程序的警告,请在状态栏中选择“ 不受限制 ”,然后选择“ QIR: Base ”作为配置文件。

Jupyter Notebook 和 Python

若要设置基本配置文件,请使用 qsharp.init 函数:

qsharp.init(target_profile=qsharp.TargetProfile.Base)

注意

  • 函数 qsharp.init 替换 %azure.target-capability magic 命令。
  • 如果重置目标配置文件,则需要在编译之前重新运行 Q# 单元格或导入。

编译 Q# 要提交到 Azure Quantum 的程序

使用新式 QDK 时,需要在将作业提交到 Azure Quantum 之前编译程序。

注意

有关使用 Q# 程序、Python 程序或 Jupyter Notebook 将作业提交到 Azure Quantum 的分步方案,请参阅 将作业提交到 Azure Quantum

VS Code

Q#当你在工作区中选择提供程序目标并选择“提交当前Q#程序”时,VS Code 中的程序会自动编译程序。 如果出现编译器错误,可以通过按 F5 来调试文件。 有关详细信息,请参阅 将作业提交到 Azure Quantum

Jupyter Notebook 和 Python

对于使用 Workspace 类连接到 Azure Quantum 的Jupyter Notebook和 Python 程序,需要编译程序,然后使用作业提交将其发送到 Azure Quantum。

  1. Q#运行在单元格中%%qsharp导入或编写的代码。

  2. qsharp.compile使用 函数,传递Q#要用作入口点的操作或函数。 例如,对于此 Q# 程序:

    operation MyOperation() : Result {
        use q = Qubit();
            H(q);
            let r = M(q);
            Reset(q);
            return r;
    }
    

    将操作传递 MyOperation() 为:

    MyProgram = qsharp.compile("MyOperation()")
    
  3. 然后,使用 函数将编译的结果 MyProgram 传递到 Azure Quantum target.submit

    job = target.submit(MyProgram, "job name", ...)
    

Azure CLI

还可以使用 Azure CLI 连接 Python 和作业并将其 Q# 提交到 Azure Quantum。 对于此方案,必须将已编译的程序另存为文本文件。 有关分步过程,请参阅 将作业提交到 Azure Quantum

连接到 Azure Quantum

对于 Q# VS Code 中的程序,可以连接到 Azure Quantum 工作区并在 VS Code 中提交作业。

对于 Python 和 Jupyter Notebook 程序,默认连接方法是 azure.quantum.Workspace 类,它将替换弃用的 IQ#%azure magic 命令和 qsharp.azure 模块。 有关所有这些命令的示例,请参阅 将作业提交到 Azure Quantum

弃用的 magic 命令或 API 使用
%azure.connect
qsharp.azure.connect ()
wksp = azure.quantum.Workspace (
resource_id=“”,
location=“”)
%azure.target
qsharp.azure.target ()
target = wksp.get_targets (“<target_name>”)
%azure.execute
qsharp.azure.execute ()
job = target.submit (...) 非阻塞 I/O
%azure.submit
qsharp.azure.submit ()
job = target.submit (<QirInputData>, <jobName>, input_params={“count: <##>”})
%azure.jobs
qsharp.azure.jobs ()
wksp.list_jobs ()
%azure.output
qsharp.azure.output (
)
job.get_results ()
%azure.status
qsharp.azure.status ()
job.details.status
%azure.quotas wksp.get_quotas ()

其他已弃用的 magic 命令

弃用的 magic 命令    
%check_kata 已放弃
%chemistry.broombridge 已放弃
%chemistry.encode 已放弃
%chemistry.fh.add_terms 已放弃
%chemistry.fh.load 已放弃
%chemistry.inputstate.load 已放弃
%config 已放弃
%debug 已放弃
%experimental.build_info 已放弃
%kata 已放弃
%lsmagic 已放弃
%lsopen 已放弃
%noise_model 已放弃
%package 已放弃
%performance 已放弃
%project 已放弃
%who 已放弃
%workspace 已放弃