qml.资源

这个 resource 模块提供了类和功能,用于估计实现高级量子算法所需的量子资源(量子比特数量、电路深度等)。

期望值函数

estimate_error(coeffs[, variances, shots])

估计在给定数量的测量中计算期望值的误差。

estimate_shots(coeffs[, variances, error])

估计计算目标误差的期望值所需的测量次数。

电路规格

specs(qnode[, level])

关于量子电路的资源信息。

量子相位估计资源

FirstQuantization(n, eta[, omega, error, ...])

估计第一量化中使用平面波基的量子相位估计算法所需的非Clifford门和逻辑量子比特的数量。

DoubleFactorization(one_electron, two_electron)

估计在双重因子化哈密顿量下,量子相位估计算法中非Clifford门和逻辑量子比特的数量。

错误跟踪

AlgorithmicError(错误)

表示抽象错误类型的抽象基类。

SpectralNormError(错误)

表示谱范数误差的类。

ErrorOperation(*params[, wires, id])

表示具有某种形式的算法误差的量子操作的基类。

资源类

资源([num_wires, num_gates, ...])

包含存储关键资源的属性,例如门的数量、导线的数量、shots、深度和门类型。

ResourcesOperation(*参数[, 导线, 标识])

表示施加于量子态的量子门或通道的基类,并存储量子门的资源要求。

资源函数

add_in_series(r1, r2)

假设电路是串行执行的,将两个 Resources 对象相加。

add_in_parallel(r1, r2)

在假设电路并行执行的情况下,添加两个 Resources 对象。

mul_in_series(资源, 标量)

Resources对象乘以一个标量,就好像电路在串联中重复了那么多次。

mul_in_parallel(资源, 标量)

Resources对象乘以一个标量,就好像电路并行重复了那么多次。

substitute(初始资源, 门信息, ...)

用另一个 Resources 对象的内容替换 Resources 对象中的指定门。

自定义操作的资源跟踪

我们可以使用 null.qubit 设备与 qml.Tracker 来跟踪量子电路中自定义操作所使用的资源,而无需执行。

class MyCustomAlgorithm(ResourcesOperation):
    num_wires = 2

    def resources(self):
        return Resources(
            num_wires=self.num_wires,
            num_gates=5,
            gate_types={"Hadamard": 2, "CNOT": 1, "PauliZ": 2},
            gate_sizes={1: 4, 2: 1},
            depth=3,
        )

dev = qml.device("null.qubit", wires=[0, 1, 2], shots=100)

@qml.qnode(dev)
def circuit(theta):
    qml.RZ(theta, wires=0)
    qml.CNOT(wires=[0,1])
    MyCustomAlgorithm(wires=[1, 2])
    return qml.expval(qml.Z(1))

x = np.array(1.23, requires_grad=True)

with qml.Tracker(dev) as tracker:
    circuit(x)

我们可以通过访问 resources 键来检查资源:

>>> resources_lst = tracker.history['resources']
>>> print(resources_lst[0])
num_wires: 3
num_gates: 7
depth: 5
shots: Shots(None)
gate_types:
{"RZ": 1, "CNOT": 2, "Hadamard": 2, "PauliZ": 2}
gate_sizes:
{1: 5, 2: 2}