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

稀疏量子模拟器

稀疏模拟器是 Azure Quantum 开发环境的默认本地模拟器,并利用量子状态向量的稀疏表示形式。 此功能允许稀疏模拟器最大程度地减少表示量子态所使用的内存占用情况,从而允许对大量量子比特进行模拟。 对于表示在计算基中处于稀疏状态的量子态,也就是说在计算基中大多数振幅系数为零的量子态,稀疏模拟器非常有用。 因此,稀疏模拟器使用户能够研究比全状态模拟器能表示的更大型的应用程序,后者在指数级多的零振幅上浪费内存和时间。

有关稀疏模拟器的详细信息,请参阅 Jaques 和 Häner (arXiv:2105.01533)

调用稀疏模拟器

稀疏模拟器是安装了 Azure Quantum Development Kit 扩展的 Visual Studio Code 中的默认本地模拟器。

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

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

向稀疏模拟器中添加 Pauli 噪音

稀疏模拟器支持向模拟添加 Pauli 噪声。 使用此功能可以模拟干扰对量子运算和度量的影响。 干扰模型是使用 Pauli 噪声概率字典指定的,其中键是 Pauli 运算符,并且X值是应用相应 Pauli 运算符YZ的概率。 干扰模型可用于 Q# 程序、Python 程序或在 VS Code 设置中配置。

使用 VS Code 的设置添加 Pauli 干扰

通过配置 Q#> Simulation:Pauli Noise 用户设置,可以在 Visual Studio Code 中全局配置 Pauli 噪音。

显示噪声模拟器设置的 Q# 屏幕截图。

这些设置适用于 VS Code 中运行的所有 Q# 程序的直方图结果,以及程序中引用的所有入口、度量和量子比特。 这些设置与使用 ConfigurePauliNoise() 函数相同。

运行下列未配置噪音的 GHz 示例程序的直方图,大约一半时间将返回 $\ket{c0}$,另一半时间返回 $\ket{c1}$。

import Std.Diagnostics.*;
import Std.Measurement.*;

operation Main() : Result []{
    let num = 5;
    return GHzSample(num);
}
operation GHzSample(n: Int) : Result[] {
    use qs = Qubit[n];
    H(qs[0]);
    ApplyCNOTChain(qs);
    let results = MeasureEachZ(qs);
    ResetAll(qs);
    return results;
}

屏幕截图显示无干扰的结果。

但是,添加 1% 位翻转噪声时,状态开始扩散,而在 25% 噪声的情况下,该状态变得无法与噪声区分。

显示 1 个% 噪音和 25 个% 噪音的结果的屏幕截图。

向程序添加 Pauli 噪音Q#

可以使用函数 ConfigurePauliNoise() 为单个 Q# 程序设置或修改噪音模型。 使用 ConfigurePauliNoise(),可以精确控制噪音在 Q# 程序中的应用位置。

注释

如果在 VS Code 设置中配置干扰,则干扰将应用于所有 Q# 程序。 如果在Q#程序中使用ConfigurePauliNoise配置噪声,那么该噪声设置会在该程序运行期间覆盖 VS Code 的噪声设置。

例如,在前面的程序中,可以在量子比特分配后立即添加干扰:

...
operation GHzSample(n: Int) : Result[] {
    use qs = Qubit[n];
    ConfigurePauliNoise(0.05, 0.0, 0.0); // 5% bit-flip noise applies to all operations
    H(qs[0]);
...

屏幕截图显示在量子位分配后添加干扰的结果。

或就在测量操作开始之前。

    ...
    use qs = Qubit[n];
    H(qs[0]);

    ApplyCNOTChain(qs);
    ConfigurePauliNoise(0.05, 0.0, 0.0); // noise applies only to measurement operation 
    let results = MeasureEachZ(qs);
    ...

屏幕截图显示了在测量之前刚刚添加干扰后的结果。

还可以用于 ConfigurePauliNoise() 重置或清除干扰配置。 在此示例中,噪声设置是在量子位分配后设置的,然后在 Hadamard 操作后立即清除,以便噪声仅应用于 H(); 操作。

...
operation GHzSample(n: Int) : Result[] {
    use qs = Qubit[n];
    ConfigurePauliNoise(0.05, 0.0, 0.0); // noise applies to H() operation
    H(qs[0]);
    ConfigurePauliNoise(0.0, 0.0, 0.0); // clear noise settings
...

Std.Diagnostics 库中提供了以下函数来配置 Q# 程序中的噪声:

功能 Description Example
ConfigurePauliNoise() 为模拟器运行配置 Pauli 干扰,参数表示 X、Y 和 Z 门的概率。 干扰配置适用于程序中的所有后续入口、度量和量子比特 Q# 。 绕过 VS Code 中的任何干扰设置,并可由后续 ConfigurePauliNoise() 调用重置。 ConfigurePauliNoise(0.1, 0.0, 0.5)

ConfigurePauliNoise(BitFlipNoise(0.1))
BitFlipNoise() 将干扰配置为仅具有指定概率的 X 门。 干扰配置适用于程序中的所有后续入口、度量和量子比特 Q# 。 10% 位翻转干扰:
ConfigurePauliNoise(BitFlipNoise(0.1)) $\equiv$ ConfigurePauliNoise(0.1, 0.0, 0.0)
PhaseFlipNoise() 将干扰配置为仅具有指定概率的 Z 门。 干扰配置适用于程序中的所有后续入口、度量和量子比特 Q# 。 10% 相位翻转噪声
ConfigurePauliNoise(PhaseFlipNoise(0.1)) $\equiv$ ConfigurePauliNoise(0.0, 0.0, 0.1)
DepolarizingNoise() 将噪声配置为概率相等的 X、Y 或 Z 门。 6% 去极化噪音:
ConfigurePauliNoise(DepolarizingNoise(0.06)) $\equiv$ ConfigurePauliNoise(0.2, 0.2, 0.2)
NoNoise() 配置噪声模型为无噪声。 ConfigurePauliNoise(NoNoise()) $\equiv$ ConfigurePauliNoise(0.0, 0.0, 0.0)
ApplyIdleNoise 在模拟期间将配置的干扰应用于单个量子比特。 ...
use q = Qubit[2];
ConfigurePauliNoise(0.1, 0.0, 0.0);
ApplyIdleNoise(q[0]);
...

将 Pauli 干扰添加到 Python 程序或 Jupyter Notebook

Pauli 噪音配置可通过 qdk.qsharp Python 包获得,qdk.widgets 包提供直方图功能。 噪声作为一个参数被添加到 qsharp.run 方法中。

  • qsharp.BitFlipNoise
  • qsharp.PhaseFlipNoise
  • qsharp.DepolarizingNoise

下面的示例演示了 10% 去极化噪音对贝尔态测量的影响。

from qdk import qsharp
from qdk import widgets
%%qsharp

operation BellPair() : Result[] {
    use q = Qubit[2];
    H(q[0]);
    CNOT(q[0], q[1]);
    MResetEachZ(q)
}
results = qsharp.run("BellPair()", 20, noise=qsharp.DepolarizingNoise(0.1))
results

通过指定每个 Pauli 运算符的概率,可以向干扰模型添加任意 Pauli 噪音。 让我们使用前面的 GHz 示例程序:

%%qsharp

operation GHzSample() : Result[] {
    use q = Qubit[5];
    H(q[0]);
    ApplyCNOTChain(q);
    MResetEachZ(q)
}

此程序运行时,将以 20% 的概率引入噪声(其中,位翻转和相位翻转各占一半的概率)。

result = qsharp.run("GHzSample()", 20, noise=(0.1, 0.0, 0.1))
display(widgets.Histogram(result))

此运行应用 Pauli-Y 干扰,概率为 10%。

result = qsharp.run("GHzSample()", 20, noise=(0.0, 0.1, 0.0))
display(widgets.Histogram(result))