qml.tape

量子带是一种数据结构,可以在PennyLane中表示量子电路和测量统计数据。它们是可以记录和处理量子操作和测量的排队上下文。

除了可以通过QNodes内部创建,量子带还可以被创建、嵌套、扩展(通过 expand())和手动执行。

最后,量子胶带与通过Autograd、JAX、TensorFlow和PyTorch的自动微分完全兼容。

警告

除非您是PennyLane或插件开发者,否则您可能不需要直接使用这些类。

有关创建QNodes的更多细节,请参阅量子电路页面,以及qnode()装饰器和QNode()构造函数。

QuantumTape与QuantumScript

A QuantumScript 是量子电路的纯粹表示,只能通过初始化构建。一旦初始化,其内容在整个生命周期内应保持不可变。

>>> ops = [qml.PauliX(0)]
>>> measurements = [qml.expval(qml.PauliZ(0))]
>>> QuantumScript(ops, measurements, shots=10)
<QuantumScript: wires=[0], params=0>

一个 QuantumTape 具有额外的排队能力,并且继承自 AnnotatedQueue。它的内容在退出上下文时设置,而不是在初始化时设置。由于排队需要与全局单例 QueuingManager 交互,QuantumTape 需要一个 threading.RLock,这使其在分布式场景中的使用变得复杂。

>>> with QuantumTape(shots=10) as tape:
...     qml.PauliX(0)
...     qml.expval(qml.PauliZ(0))
>>> tape
<QuantumTape: wires=[0], params=0>

QuantumTape 还携带未处理的队列,除了处理过的 operationsmeasurements,以增加内存占用。

>>> tape.items()
((PauliX(wires=[0]), {}), (expval(PauliZ(wires=[0])), {}))

为了捕获一个量子函数,我们推荐将量子函数排队到一个 AnnotatedQueue 中,然后将其处理成 QuantumScript

>>> with qml.queuing.AnnotatedQueue() as q:
...     qfunc(*args, **kwargs)
>>> QuantumScript.from_queue(q)
<QuantumScript: wires=[0], params=0>

由于排队也对操作的“身份”敏感,而不仅仅是其内容,因此必须复制操作,以便在QuantumTape中多次使用。一个QuantumScript可以允许在电路中多次使用相同的操作,从而可能减少其内存占用。

>>> op = qml.T(0)
>>> QuantumScript([op] * 100, [qml.probs(wires=0)])

由于用户熟悉术语 QuantumTape,因此在文档中应使用该术语。为了提高性能并减少意外副作用,QuantumScript仅在PennyLane源代码中严格使用。

pennylane.tape 包

函数

expand_tape_state_prep(tape[, skip_first])

展开所有StatePrepBase操作在录音带中的实例。

make_qscript(fn[, shots])

返回一个函数,该函数从量子函数生成qscript,而不进行任何操作排队。

plxpr_to_tape(plxpr, consts, *args[, shots])

将 plxpr 转换为 tape。

OperationRecorder([ops, measurements, shots])

一个模板和量子函数检查器,允许轻松检查已应用的算子,而不需要QNode。

QuantumScript([ops, measurements, shots, ...])

表示在量子设备上执行的操作和测量的指令。

QuantumTape([操作, 测量, 投射, ...])

一个量子磁带录音机,用于记录和存储变分量子程序。

TapeError

出现了一个与量子胶带相关的错误。

类继承图

Inheritance diagram of pennylane.tape.operation_recorder.OperationRecorder, pennylane.tape.qscript.QuantumScript, pennylane.tape.tape.QuantumTape, pennylane.tape.tape.TapeError