好的,所以,在 Qiskit 中有这个transpile()
功能(参见文档)。我对转译器的理解最好被描述为一种将一组门操作转换为另一组门操作的方法,目的是在不同的后端运行算法(因为量子位连接,即架构的几何形状,从一台量子计算机到另一台)。有一些方法可以通过减少冗余和重写等效门来优化电路,例如将由 Hadamard 门共轭的 CNOT 更改为 CZ 以减少门数。如果硬件后端没有本机 CZ,则可能还想完全相反,从 CZ 转到 Hadamards 共轭的 CNOT。一般来说,这种为了优化某些固定硬件后端的任意电路而进行的转译是一个 QMA 完全问题(见这里例如...也许有人将LEAN用于类似的事情?)。有时也使用变分方法来近似最佳电路,但我离题了。
一个稍微不同但相关的问题:使用Nielsen & Chuang附录 3 中的 Kitaev-Solovay 定理和 4.5 中的材料,我们知道我们总是可以“有效”地用通用门集逼近任意单一门(这在书,在这里不一定重要)。我认为效率如何是一个悬而未决的问题,但至少有一些上限和下限。
鉴于此,人们会期望 Qiskittranspile()
函数近似单一门并将门集重构为最佳(最小化)门集以优化电路,但可能会遇到具有许多非标准门的大型电路的问题。但是,即使对于简单的示例,我也无法使其正常工作。例如,三个量子比特上的置换矩阵似乎是一个合理的近似单位(有些甚至可以很容易地手动转换为 SWAP 门和 X 门)。但是 Qiskit 似乎不喜欢这样做,我可以使用一些帮助来理解为什么。例如,我们可以在 Qiskit 中定义一个酉(置换)算子,并将其转换为量子电路中的门,如下所示:
from qiskit import *
from qiskit.quantum_info import Operator
from qiskit.compiler import transpile
%matplotlib inline
permute = Operator([[0, 0, 1, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 1, 0, 0, 0]])
qc = QuantumCircuit(3)
qc.unitary(permute, [0,1,2], label='P')
qc.draw(output='mpl')
现在,如果我尝试使用transpile()
Qiskit 中的函数,如下所示:
result = transpile(qc, basis_gates=['u1', 'u2', 'u3', 'cx'], optimization_level=3)
result.draw(output='mpl')
我得到了一些巨大的可怕的错误,结果是,
NotImplementedError: Not able to generate a subcircuit for a 3-qubit unitary
所以,我想我的问题是......为什么。哈哈。不,但说真的,我只是以错误的方式使用它吗?我的期望太高了吗?有没有合理的方法来做我想做的事?一组不同的基础门会起作用吗?如果是这样,如何决定基础门?我还尝试了该decompose()
函数(请参阅文档transpile()
),在查看每个函数的源代码时,该函数似乎具有更有限的功能。该功能decompose()
已实现(如本视频和本视频所示)。该功能也已实现(请参阅大约 10:35 单元格 In[18] 和他的讨论中的此视频)。您也可以尝试使用他的命令运行命令transpile()
from qiskit import transpile
它也不适用于该导入。如果有人理解为什么该transpile()
功能(或与此相关的decompose()
功能)没有按照我期望的方式工作,我希望得到一个解释。谢谢!!!
- - - - -更新 - - - - -
我发现了另一个问题。如果我们使用
from qiskit.circuit.random import random_circuit
rcirc2 = random_circuit(3, 4)
rcirc2.draw(output='mpl')
生成随机电路,然后运行
from qiskit.compiler import transpile
result2 = transpile(rcirc2, basis_gates=['u1', 'u2', 'u3', 'cx'], optimization_level=3)
result2.draw(output='mpl')
一些结果(没有 3-qubit 门)不会转换,有些会。所以这似乎不仅仅是没有实现 3-qubit 或更多的门transpile()
。注意:您可能需要多次尝试此代码才能获得没有 3 量子位门的电路,因为这些电路是“随机的”。例如,下面的电路不会转译,
circ = QuantumCircuit(3)
circ.i(0)
circ.ch(2,1)
circ.cx(0,1)
circ.t(2)
circ.cx(2,0)
circ.x(0)
circ.u1(3.41, 1)
circ.ch(2,1)
circ.draw(output='mpl')
当我们跑步时
result3 = transpile(circ, basis_gates=['u1', 'u2', 'u3', 'cx'], optimization_level=3)
result3.draw(output='mpl')
添加障碍将所有独立的门分成不同的步骤似乎也无济于事。所以这不是运行并行但独立的门操作的问题。
----------更新2----------
如果我们使用 Qiskit 生成随机的 3 量子比特单位,这些也不起作用。
from qiskit.quantum_info import Operator, random_unitary
U = random_unitary(8, seed=None)
qc = QuantumCircuit(4, 4)
qc.unitary(U, [0,1,3], label='P')
qc.draw(output='mpl')
您可以重新定义酉元运算的量子比特,或将电路简化为 3 量子比特电路,或以这种方式生成更大的 n 量子比特酉元。这些例子都不起作用。