qml.噪声

该模块包含构建和操纵基于插入的噪声模型的功能,其中噪声门和通道根据目标操作和测量进行插入。

概述

PennyLane中的基于插入的噪声模型是通过从条件映射定义的,这些条件被指定为 BooleanFn 对象,映射到 量子函数 类似的可调用对象,这些可调用对象包含要应用的噪声操作,但没有任何返回语句。可以提供额外的与噪声相关的元数据来构建噪声模型,使用:

NoiseModel(model_map[, meas_map])

根据条件与可调用对象的映射构建一个噪声模型,这些可调用对象定义了噪声操作,并使用一些可选的元数据。

每个在 model_map (和 meas_map) 中的条件根据其属性的某些条件(例如类型、参数、线路等)评估量子电路中的门操作(和终端测量),并在条件为真时使用相应的可调用函数来应用噪声操作,利用用户提供的元数据(例如硬件拓扑或弛豫时间)。一旦构建了噪声模型,可以通过以下变换将其附加到电路或设备上:

add_noise(tape, noise_model[, level])

根据提供的噪声模型插入操作。

布尔函数

噪声模型中的每个 BooleanFn 都是在给定量子电路的操作上进行评估的。可以使用以下助手构造标准布尔函数:

meas_eq(mps)

构建一个条件作为 BooleanFn 以评估给定的测量过程是否等于指定的测量过程。

op_eq(ops)

构建一个条件作为一个 BooleanFn 用于评估给定操作是否等于指定操作。

op_in(操作)

构建一个条件作为 BooleanFn 用于评估给定操作是否存在于指定的操作集合中。

wires_eq(导线)

构建一个条件作为一个 BooleanFn 用于评估给定的线是否等于指定的线集合。

wires_in(导线)

构建一个条件作为 BooleanFn,用于评估输入操作的线路是否在指定的线路集合内。

例如,一个布尔函数,用于检查一个操作是否在导线 0 上,可以如下创建:

>>> fn = qml.noise.wires_eq(0)
>>> op1, op2 = qml.PauliX(0), qml.PauliX(1)
>>> fn(op1)
True
>>> fn(op2)
False

任意布尔函数也可以通过以下装饰器包装自定义条件的函数形式来定义:

BooleanFn(fn[, name])

用于简单可调用的布尔输出的包装器,可以被位运算符操作和组合。

例如,可以创建一个布尔函数来识别一个RX门,具有最大参数值:

@qml.BooleanFn
def rx_condition(op, **metadata):
    return isinstance(op, qml.RX) and op.parameters[0] < 1.0

布尔函数可以使用标准的按位运算符组合,例如 &|^~。结果将是另一个布尔函数。重要的是要注意,由于Python将按照组合的顺序评估表达式,即从左到右,因此组合的顺序可能很重要,尽管按位操作在定义上是对称的。

嘈杂量子函数

如果一个布尔函数在量子电路的给定操作上评估为 True,则对应的量子函数会在操作之后直接插入噪声。量子函数的签名应为 fn(op, **metadata),这允许依赖于前面的操作和噪声模型中指定的元数据。例如,以下噪声模型为 RX 门添加了过度旋转:

def noisy_rx(op, **metadata):
    qml.RX(op.parameters[0] * 0.05, op.wires)

noise_model = qml.NoiseModel({rx_condition: noisy_rx})

一个常见的用例是拥有一个单一操作的 噪声通道,其连线与前面的操作相同。这可以使用以下方法构建:

partial_wires(操作, *args, **kwargs)

根据给定的门操作或测量过程构建一个部分函数,除wires之外的所有参数都被冻结。

例如,可以使用以下方法创建一个常值超旋转:

>>> rx_constant = qml.noise.partial_wires(qml.RX(0.1, wires=[0]))
>>> rx_constant(2)
RX(0.1, 2)
>>> qml.NoiseModel({rx_condition: rx_constant})
NoiseModel({
    BooleanFn(rx_condition): RX(phi=0.1)
})

示例噪声模型

以下示例显示了如何在Pennylane中设置人工噪声模型:

# Set up the conditions
c0 = qml.noise.op_eq(qml.PauliX) | qml.noise.op_eq(qml.PauliY)
c1 = qml.noise.op_eq(qml.Hadamard) & qml.noise.wires_in([0, 1])
c2 = qml.noise.op_eq(qml.RX)

@qml.BooleanFn
def c3(op, **metadata):
    return isinstance(op, qml.RY) and op.parameters[0] >= 0.5

# Set up noisy ops
n0 = qml.noise.partial_wires(qml.AmplitudeDamping, 0.4)

def n1(op, **metadata):
    ThermalRelaxationError(0.4, metadata["t1"], 0.2, 0.6, op.wires)

def n2(op, **metadata):
    qml.RX(op.parameters[0] * 0.05, op.wires)

n3 = qml.noise.partial_wires(qml.PhaseDamping, 0.9)

# Set up noise model
noise_model = qml.NoiseModel({c0: n0, c1: n1, c2: n2}, t1=0.04)
noise_model += {c3: n3}  # One-at-a-time construction
>>> noise_model
NoiseModel({
    OpEq(PauliX) | OpEq(PauliY): AmplitudeDamping(gamma=0.4)
    OpEq(Hadamard) & WiresIn([0, 1]): n1
    OpEq(RX): n2
    BooleanFn(c3): PhaseDamping(gamma=0.9)
}, t1 = 0.04)

API 概述

以下是通过调用上述助手函数创建的 BooleanFn 对象,例如 op_eq()。这些对象不需要直接实例化。

MeasEq(mps)

用于评估给定的测量过程是否等于指定的测量过程的条件。

OpEq(ops)

一个用于评估给定操作是否等于指定操作的条件。

OpIn(ops)

一个用于评估给定操作是否在指定操作集合中的条件。

WiresEq(电缆)

用于评估给定的线是否等于指定的一组线的条件。

WiresIn(电线)

一个用于评估操作的线路是否存在于指定线路集合中的条件。

位运算比如 AndOrboolean_fn 模块中用以下类表示:

(left, right)

面向开发者的类,用于实现可调用对象的按位 AND,该对象被BooleanFn封装。

或者(left, right)

面向开发者的类,用于实现针对与 BooleanFn 包装的可调用对象的按位 OR

Xor(左, 右)

面向开发者的类,用于实现位运算 XOR,适用于用 BooleanFn 包装的可调用对象。

Not(左)

面向开发者的类,用于实现位操作 NOT,适用于包装在 BooleanFn 中的可调用对象。

类继承图

注意所有子类都继承自同一个父类 BooleanFn,但位于不同的模块中。

噪声条件:

Inheritance diagram of pennylane.noise.conditionals

布尔函数条件:

Inheritance diagram of pennylane.boolean_fn