电路到张量网络转换器¶
简介¶
从 cuQuantum Python v22.07 开始,我们提供了一个 CircuitToEinsum
转换器,它可以接受 qiskit.QuantumCircuit
或 cirq.Circuit
,并为目标操作生成相应的张量网络收缩。该转换器的目标是允许 Qiskit 和 Cirq 用户轻松探索 cuTensorNet 库的功能。正如在 张量网络简介 中提到的,量子电路可以被视为张量网络。对于任何量子电路,CircuitToEinsum
都可以构建相应的张量网络来计算各种感兴趣的量。输出张量网络以带有张量操作数的爱因斯坦求和表达式返回。
我们支持以下操作
state_vector()
:此爱因斯坦求和表达式的收缩产生最终状态系数,作为一个 N 维张量,其中 N 是电路中量子比特的数量。张量的模式标签对应于CircuitToEinsum.qubits
。
amplitude()
:此爱因斯坦求和表达式的收缩产生给定比特字符串的幅度系数。
batched_amplitudes()
:此爱因斯坦求和表达式的收缩产生量子比特子集的幅度系数,而其他量子比特固定在某些状态。
reduced_density_matrix()
:此爱因斯坦求和表达式的收缩产生量子比特子集的约化密度矩阵,可以选择将另一个量子比特子集设置为固定状态。
expectation()
:此爱因斯坦求和表达式的收缩产生给定泡利串的期望值。
CircuitToEinsum
类还允许用户通过构造转换器对象时使用 backend
参数来指定所需的张量后端(cupy
、torch
、numpy
)。然后,返回的爱因斯坦求和表达式和张量操作数可以直接用作 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 的张量网络模拟。