电路到张量网络转换器

简介

从 cuQuantum Python v22.07 开始,我们提供了一个 CircuitToEinsum 转换器,它可以接受 qiskit.QuantumCircuitcirq.Circuit,并为目标操作生成相应的张量网络收缩。该转换器的目标是允许 Qiskit 和 Cirq 用户轻松探索 cuTensorNet 库的功能。正如在 张量网络简介 中提到的,量子电路可以被视为张量网络。对于任何量子电路,CircuitToEinsum 都可以构建相应的张量网络来计算各种感兴趣的量。输出张量网络以带有张量操作数的爱因斯坦求和表达式返回。

我们支持以下操作

  • state_vector():此爱因斯坦求和表达式的收缩产生最终状态系数,作为一个 N 维张量,其中 N 是电路中量子比特的数量。张量的模式标签对应于 CircuitToEinsum.qubits

  • amplitude():此爱因斯坦求和表达式的收缩产生给定比特字符串的幅度系数。

  • batched_amplitudes():此爱因斯坦求和表达式的收缩产生量子比特子集的幅度系数,而其他量子比特固定在某些状态。

  • reduced_density_matrix():此爱因斯坦求和表达式的收缩产生量子比特子集的约化密度矩阵,可以选择将另一个量子比特子集设置为固定状态。

  • expectation():此爱因斯坦求和表达式的收缩产生给定泡利串的期望值。

CircuitToEinsum 类还允许用户通过构造转换器对象时使用 backend 参数来指定所需的张量后端(cupytorchnumpy)。然后,返回的爱因斯坦求和表达式和张量操作数可以直接用作 cuquantum.contract() 或相应后端的 einsum 函数的输入参数。

使用示例

import cirq
import cupy

from cuquantum import contract, CircuitToEinsum

# create a random cirq.Circuit
circuit = cirq.testing.random_circuit(qubits=4, n_moments=4, op_density=0.9, random_state=1)
# same task can be achieved with qiskit.circuit.random.random_circuit

# construct the CircuitToEinsum converter targeting double precision and cupy operands
converter = CircuitToEinsum(circuit, dtype='complex128', backend='cupy')

# generate the Einstein summation expression and tensor operands for computing the amplitude coefficient of bitstring 0000
expression, operands = converter.amplitude(bitstring='0000')
assert all([isinstance(op, cupy.ndarray) for op in operands])

# contract the network to compute the amplitude
amplitude = contract(expression, *operands)
amplitude_cupy = cupy.einsum(expression, *operands)
assert cupy.allclose(amplitude, amplitude_cupy)

多个 Jupyter 笔记本可用,供 Cirq 和 Qiskit 用户轻松构建基于 cuTensorNet 的张量网络模拟。