培训
你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
如何使用 可视化量子线路图 Q#
量子线路图是量子操作的可视表示形式。 它们通过量子程序显示量子比特的流动,包括应用于量子程序的入口和度量。
本文介绍如何使用 Visual Studio Code 或 Jupyter Notebook 通过量子线路图直观地表示量子算法。
有关量子线路图约定的详细信息,请参阅 Quantum 线路约定。
VS Code
最新版本的 Visual Studio Code 或打开网页版 VS Code。
最新版本的 Azure Quantum 开发工具包扩展。
最新的 Azure Quantum
qsharp
和azure-quantum
Python 包。Bashpython -m pip install --upgrade qsharp azure-quantum
Jupyter Notebook
最新版本的 Visual Studio Code 或打开网页版 VS Code。
最新的 Azure Quantum
qsharp
和qsharp-widgets
包以及包ipykernel
。Bashpython -m pip install --upgrade qsharp qsharp-widgets ipykernel
按照以下步骤在 Visual Studio Code 中可视化程序的量子线路 Q# 。 有关量子线路图约定的详细信息,请参阅 Quantum 线路约定。
Q#在 Visual Studio Code 中打开文件,或加载其中一个量子样本。
若要可视化程序的量子线路Q#,请选择“视图 -> 命令面板”,然后键入“线路”,应显示Q#:“显示线路”选项。 还可以从前面的
Main()
命令列表中单击“线路”。线路显示在 Q# 线路窗口中。 例如,以下线路对应于将量子比特置于叠加中的操作,然后对其进行度量。 线路图显示了一个量子比特寄存器,该寄存器已初始化为 |0⟩ 状态。 然后,Hadamard 门 H 将应用于量子比特,后跟 度量运算,该操作由计量符号表示。
可以可视化单个 Q# 操作的量子线路。 为此,请单击 操作声明上方的代码镜头中的“线路 ”按钮。
调试Q#程序时,可以根据程序的当前状态可视化量子线路。
从前面的
Main()
代码镜头命令列表中选择“调试”按钮。在左侧的“运行和调试”视图中,展开“变量”窗格下的“Quantum 线路”部分,在单步执行程序时显示线路。
可以单步执行代码并在各种点中设置断点,以查看程序运行时的线路更新。
当前量子线路显示在 Q# “线路”面板中。 此线路图表示模拟器的当前状态,即已应用到当前执行点的入口。
在 Jupyter Notebooks 中,可以使用包可视化量子线路 qsharp-widgets
。 此包提供一个小组件,用于将量子线路图呈现为 SVG 图像。
在 Visual Studio Code 中,选择“视图”>“命令面板”,然后选择“创建:新 Jupyter Notebook”。
在笔记本的第一个单元中,运行以下代码来 导入 Q# 模块。
Pythonimport qsharp
添加新单元格 并输入 Q# 代码。 例如,以下代码准备 Bell State。
Q#%%qsharp // Prepare a Bell State. use register = Qubit[2]; H(register[0]); CNOT(register[0], register[1]);
可以使用
dump_circuit()
函数根据程序的当前状态显示量子线路。 例如,线路图显示了两个量子比特寄存器,这些寄存器初始化为 |0⟩ 状态。 然后,Hadamard 门 H 将应用于第一个量子比特。 之后,使用第一个量子比特作为控件应用 CNOT 门,该量子比特表示为点,第二个量子位 target表示为 X。Pythonqsharp.dump_circuit()
输出q_0 ── H ──── ● ── q_1 ───────── X ──
可以使用包将量子线路可视化为 SVG 图像
qsharp-widgets
。 在这种情况下,CNOT 门表示为连接两个量子位的线,控制量子比特上有一个点,量子比特上有一个圆点,量子比特上有 target 一个圆点。 有关详细信息,请参阅 Quantum 线路约定。Pythonfrom qsharp_widgets import Circuit Circuit(qsharp.dump_circuit())
可以通过调用qsharp.circuit()
条目表达式并将其作为参数传递条目表达式来为任何程序生成线路图。
例如,添加新单元格并复制以下代码,该代码准备 GHZ 状态。
Q#%%qsharp import Std.Diagnostics.*; import Std.Measurement.*; operation GHZSample(n: Int) : Result[] { use qs = Qubit[n]; H(qs[0]); ApplyToEach(CNOT(qs[0], _), qs[1...]); let results = MeasureEachZ(qs); ResetAll(qs); return results; }
添加新单元格并运行以下代码来可视化线路。 例如,准备具有 3 个量子位的 GHZ 状态。
PythonCircuit(qsharp.circuit("GHZSample(3)"))
可以为采用量子比特或量子比特数组的任何操作生成线路图。 此图显示了输入量子比特数和操作中分配的任何其他量子比特数。 当操作采用量子比特 (Qubit[])
数组时,线路会将该数组显示为 2 个量子比特的寄存器。
添加新单元格并复制以下示例。 此代码准备 cat 状态。
Q#%%qsharp operation PrepareCatState(register : Qubit[]) : Unit { H(register[0]); ApplyToEach(CNOT(register[0], _), register[1...]); }
添加新单元格并运行以下代码来可视化操作的
PrepareCatState
线路。PythonCircuit(qsharp.circuit(operation="PrepareCatState"))
可视化量子线路时,以下条件可能会影响线路图的可视化效果。
线路图是通过在程序内 Q# 执行所有经典逻辑来生成的,并跟踪已分配的任何量子比特或已应用的入口。 只要循环和条件只处理经典值,就会受到支持。
但是,包含循环和条件表达式(使用量子比特度量结果)的程序比较棘手,用线路图表示。 例如,如下所示的表达式
if (M(q) == One) {
X(q)
}
不能用简单的线路图表示,因为入口是度量结果的条件。 此类线路称为 动态 线路。
可以通过在量子模拟器中运行程序并跟踪应用入口来为动态线路生成线路关系图。 这称为 跟踪 模式,因为正在执行模拟时跟踪量子比特和入口。
跟踪线路的缺点是,它们只捕获单个模拟的测量结果和随后的门应用程序。 在上面的示例中,如果度量结果为 Zero
,则看不到 X
关系图中的门。 模拟的另一次运行可能会显示略有不同的线路。
当前选定的 target 配置文件会影响线路图的生成方式。 Target 配置文件用于指定硬件的功能 target ,以及对量子程序施加的限制。
当 target 配置文件设置为 “无限制 ”或 “QIR 自适应 RI”时,线路图会显示在程序中调用的 Q# 量子操作。 target当配置文件设置为 QIR 基时,线路图会显示将使用此配置文件将程序提交到 Azure Quantum target 时,将在硬件上运行的量子操作。
备注
target若要在 VS Code 中选择配置文件,请选择“视图 -> 命令面板”,然后选择Q#:设置 Azure Quantum QIR target 配置文件。 可以从下拉列表中选择
QIR base
或QIR Adaptive RI
unrestricted
从下拉列表中选择。target若要在 Python 中选择配置文件,请调用
qsharp.init(target_profile=qsharp.TargetProfile.Base)
或qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RI)
qsharp.init(target_profile=qsharp.TargetProfile.Unrestricted)
。
具体而言,将应用门分解,使生成的线路与硬件的功能 target 兼容。 这些分解是在代码生成和提交到 Azure Quantum 期间应用的。
例如,请考虑以下 Q# 用于度量量子比特和量子比特数组的程序。
Q#import Std.Measurement.*; operation Main() : (Result, Result[]) { // The `M` operation performs a measurement of a single qubit in the // computational basis, also known as the Pauli Z basis. use q = Qubit(); let result = M(q); Reset(q); // The `MeasureEachZ` operation measures each qubit in an array in the // computational basis and returns an array of `Result` values. use qs = Qubit[2]; let results = MeasureEachZ(qs); return (result, results); }
当配置文件设置为“无限制”或“QIR 自适应 RI”时target,线路上显示的门与程序中调用的Q#量子操作完全对应。
当 target 配置文件是 QIR 基时,线路看起来不同。 由于基本配置文件 targets 不允许在测量后重复使用量子比特,因此现在对纠缠量子比特执行测量。 由于
Reset
基本配置文件中不支持操作,因此会将其删除。 如果此程序通过此 target 配置文件提交到 Azure Quantum,生成的线路将匹配硬件上运行的内容。