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

使用 可视化量子线路图 Q#

量子线路图是量子操作的可视化表示形式。 它们显示量子比特通过量子程序的流动,包括应用于它们的门和度量。

本文介绍如何使用 Visual Studio Code 和 Jupyter Notebook 通过量子线路图直观地表示量子算法。

有关量子线路图约定的详细信息,请参阅 量子线路约定

先决条件

如果要使用 Visual Studio Code 可视化量子线路,需要:

带Visual Studio Code的量子线路

按照以下步骤在 Visual Studio Code 中可视化程序的量子线路Q#。 有关量子线路图约定的详细信息,请参阅 量子线路约定

查看程序的线路图Q#

  1. Q#在 Visual Studio Code 中打开文件,或加载其中一个量子样本

  2. 若要可视化程序的量子线路 Q# ,请选择“ 视图 -> 命令面板 ”并键入“线路”,此时会显示 Q#:显示线路 选项。 还可以从下面的@EntryPoint()命令列表中单击“线路”。

    Q# Visual Studio Code中的文件的屏幕截图,其中显示了在何处查找代码镜头线路命令。

  3. 线路显示在 Q# 线路窗口中。 例如,以下线路对应于将量子比特置于叠加中,然后对其进行测量的操作。 线路图显示了一个量子比特寄存器,该寄存器已初始化为 |0⟩ 状态。 然后,将 Hadamard 门 H 应用于量子比特,然后是 测量操作,该操作由计量符号表示。

    线路窗口的 Q# 屏幕截图,其中显示了随机位操作的结果线路图。

查看操作的线路图

可以可视化单个 Q# 操作的量子线路。 为此,请单击操作声明上方显示的代码镜头中的“ 线路 ”按钮。

Visual Studio Code的屏幕截图,显示调试程序后如何在线路Q#窗格中可视化线路。

调试时查看线路图

调试Q#程序时,可以根据程序的当前状态可视化量子线路。

  1. 单击下面的@EntryPoint()代码镜头命令列表中的“调试”按钮。

  2. 在左侧的“运行和调试”视图中,展开“变量”窗格下的“Quantum 线路”部分,以在单步执行程序时显示线路。

    Visual Studio Code的屏幕截图,其中显示了如何在调试程序时可视化线路。

  3. 可以单步执行代码并在各个点中设置断点,以查看程序运行时的线路更新。

  4. 当前量子线路显示在“线路”Q#面板中。 此线路图表示模拟器的当前状态,即在当前执行点之前应用的入口。

    Visual Studio Code的屏幕截图,其中显示了如何可视化单个Q#操作的线路。

使用 Jupyter Notebook 的量子线路

在 Jupyter Notebooks 中,可以使用 包可视化 qsharp-widgets 量子线路。 此包提供将量子线路图呈现为 SVG 图像的小组件。

  1. 在“Visual Studio Code”中,依次选择“查看>命令面板”和“Create:新建Jupyter Notebook”。

  2. 在笔记本的第一个单元中,运行以下代码以导入模块Q#

    import qsharp
    
  3. 添加新单元格 并输入 Q# 代码。 例如,以下代码准备一个贝尔状态。

    %%qsharp
    
    // Prepare a Bell State.
    use register = Qubit[2];
    H(register[0]);
    CNOT(register[0], register[1]);
    
  4. 可以使用 dump_circuit() 函数根据程序的当前状态显示量子线路。 例如,线路图显示了初始化为 |0⟩ 状态的两个量子比特寄存器。 然后,将 Hadamard 门 H 应用于第一个量子比特。 之后,使用第一个量子比特作为控件(表示为点)和第二个量子位 target(表示为 X)应用 CNOT 门。

    qsharp.dump_circuit()
    
    q_0    ── H ──── ● ──
    q_1    ───────── X ──
    
  5. 可以使用 包将量子线路可视化为 SVG 图像qsharp-widgets。 在这种情况下,CNOT 门表示为连接两个量子比特的线,控制量子比特上有一个点,量子比特上有一个限制的 target 十字。 有关详细信息,请参阅 Quantum 线路约定

    from qsharp_widgets import Circuit
    
    Circuit(qsharp.dump_circuit())
    

    Jupyter Notebook的屏幕截图,其中显示了如何可视化操作的线路Q#。

查看入口表达式的线路图

可以通过调用qsharp.circuit()条目表达式并将其作为参数传递,为具有入口表达式的任何程序生成线路图。

  1. 例如,添加新单元格并复制以下代码,以准备 GHZ 状态。

    %%qsharp
    
    open Microsoft.Quantum.Diagnostics;
    open Microsoft.Quantum.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;
    }
    
  2. 添加新单元格并运行以下代码以可视化线路。 例如,准备具有 3 个量子比特的 GHZ 状态。

    Circuit(qsharp.circuit("GHZSample(3)"))
    

查看具有量子比特的操作的线路图

可以为 采用量子比特或量子比特 数组的任何操作生成线路图。 该图显示了输入量子比特以及操作中分配的任何其他量子比特的线路数。 当运算采用量子比特 (Qubit[])数组时,线路将该数组显示为 2 个量子比特的寄存器。

  1. 添加新单元格并复制以下示例。 此代码准备猫状态。

    %%qsharp
    
    operation PrepareCatState(register : Qubit[]) : Unit {
        H(register[0]);
        ApplyToEach(CNOT(register[0], _), register[1...]);
    }
    
  2. 添加新单元格并运行以下代码以可视化操作的 PrepareCatState 线路。

    Circuit(qsharp.circuit(operation="PrepareCatState"))
    

影响线路图的条件

可视化量子线路时,以下条件可能会影响线路图的可视化效果。

动态线路

线路图是通过在程序中执行所有经典逻辑 Q# 并跟踪已分配的任何量子比特或已应用的门来生成的。 只要循环和条件仅处理经典值,就受支持。

但是,包含使用量子比特度量结果的循环和条件表达式的程序更难用线路图表示。 例如,如下所示的表达式

if (M(q) == One) {
   X(q)
}

不能用简单的线路图表示,因为门是度量结果的条件。 此类线路称为 动态 线路。

通过在量子模拟器中运行程序,并在应用门时跟踪门,可以为动态线路生成线路图。 这称为 跟踪 模式,因为在执行模拟时跟踪量子比特和门。

跟踪电路的缺点是,它们只捕获单个模拟的测试结果和随后的门应用。 在上面的示例中,如果度量值为 Zero,则不会 X 在关系图中看到入口。 另一次模拟运行可能会显示略有不同的线路。

目标配置文件

当前选择 target 的配置文件会影响线路图的生成方式。 目标配置文件用于指定硬件的功能 target ,以及对量子程序施加的限制。

当配置文件 target 设置为 “不受限制”时,线路图会显示在程序中调用的 Q# 量子操作。 当 target 配置文件设置为 QIR 基时,线路图显示如果使用此 target 配置文件将程序提交到 Azure Quantum,将在硬件上运行的量子操作。

注意

  • 若要在 VS Code 中选择 target 配置文件,请转到 视图 -> 命令面板 并编写 Q#:设置 Azure Quantum QIR target 配置文件。 可以从下拉列表中选择 UnrestrictedQIR Base Profile

  • target若要在 Python 中选择配置文件,请写入 qsharp.init(target_profile=qsharp.TargetProfile.Unrestricted)qsharp.init(target_profile=qsharp.TargetProfile.Base)

具体而言,将应用门分解,使生成的线路与硬件的功能 target 兼容。 这些分解与在代码生成和提交到 Azure Quantum 期间应用相同。

  1. 例如,考虑以下 Q# 测量量子比特和量子比特数组的程序。

    namespace Sample {
        open Microsoft.Quantum.Measurement;
    
        @EntryPoint()
        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);
        }
    }
    
  2. 当 target profile 设置为 Unrestricted 时,线路上显示的入口与程序中 Q# 调用的量子操作完全对应。

    配置文件为“不受限制”时 target 量子线路的屏幕截图。

  3. 当 target 配置文件是 QIR 基础时,线路看起来就不同了。 由于基本配置文件 targets 不允许在测量后重复使用量子比特,因此现在对纠缠量子比特执行测量。 由于 Reset 操作不是基本配置文件中支持的入口,因此会将其删除。 生成的线路与使用此配置文件将此程序提交到 Azure Quantum target 时将在硬件上运行的线路匹配。

    配置文件为 QIR 基时 target 量子线路的屏幕截图。