qml.tape¶
量子带是一种数据结构,可以在PennyLane中表示量子电路和测量统计数据。它们是可以记录和处理量子操作和测量的排队上下文。
除了可以通过QNodes内部创建,量子带还可以被创建、嵌套、扩展(通过 expand())和手动执行。
最后,量子胶带与通过Autograd、JAX、TensorFlow和PyTorch的自动微分完全兼容。
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 还携带未处理的队列,除了处理过的 operations 和 measurements,以增加内存占用。
>>> 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 包¶
函数¶
|
展开所有StatePrepBase操作在录音带中的实例。 |
|
返回一个函数,该函数从量子函数生成qscript,而不进行任何操作排队。 |
|
将 plxpr 转换为 tape。 |
类¶
|
一个模板和量子函数检查器,允许轻松检查已应用的算子,而不需要QNode。 |
|
表示在量子设备上执行的操作和测量的指令。 |
|
一个量子磁带录音机,用于记录和存储变分量子程序。 |
出现了一个与量子胶带相关的错误。 |
类继承图¶
