Qiskit量子电路转译器

6
好的,在Qiskit中有一个 transpile() 函数(请参见文档)。我对转换器的理解是,将一组门操作转换为另一组门操作,旨在在不同的后端上运行算法(因为量子计算机的量子比特连接性,即架构的几何形状从一个量子计算机到另一个量子计算机是不同的)。通过减少冗余和重写等效门电路来优化电路,例如将由Hadamard门共轭的CNOT更改为CZ以减少门数。如果硬件后端上没有本地CZ,则可能需要做完全相反的事情,并从CZ到由Hadamards共轭的CNOT。通常,为了针对某个固定的硬件后端优化任意电路,这种转换是一个QMA完全问题(例如,请参阅此处...也许有人已经用LEAN 来进行类似的转换?)。有时候,还会使用变分方法来近似得到最佳电路,但是我离题了。

稍微不同但相关的问题:使用Nielsen & Chuang的附录3中介绍的Kitaev-Solovay定理以及4.5中的材料,我们知道我们可以使用“高效”的通用门集合(书中有详细说明,这里不一定重要)来近似表示任意幺正门。我认为“高效”有多快是一个未解之谜,但至少有一些上下界。

鉴于此,人们会期望Qiskit的transpile() 函数近似幺正门,并将门集重构为最优(最小化)的门集以优化电路,但也许在具有许多非标准门的大电路上存在问题。然而,即使对于简单示例,我也遇到了一些问题。例如,三个量子比特上的置换矩阵似乎是一个合理的幺正门进行近似(甚至有些可以通过手工转换为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')

现在,如果我尝试在Qiskit中使用 transpile()函数,如下所示:

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()已经实现了(可以在此视频以及此视频中看到)。transpile()函数也已经实现了(请参见他讨论中的此视频,大约在第10:35个单元格In[18]处)。您还可以尝试使用他的命令来运行。

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量子位门)无法转译,而另一些可以。因此,问题似乎不仅在于没有实现transpile()的3量子位或更多门。注意:您可能需要尝试几次此代码才能获得没有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生成随机的三量子位幺正矩阵,它们也无法起作用。

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-量子比特单元。但是,这些示例都不起作用。
2个回答

2

我可能对量子计算了解不够,但我会尽力提供一些帮助。

似乎transpile()还没有一种方法来展开3个或更多量子位的幺正算子。但对于2个量子位的幺正算子,它似乎运行良好。

from qiskit import *
from qiskit.quantum_info import Operator

# a subsection of your original permute operator
#   with input dimensions (2,2), and output dimensions (2,2)
#   instead of the original (2,2,2) -> (2,2,2)
perm2 = Operator(
    [[0, 0, 1, 0],
    [1, 0, 0, 0],
    [0, 1, 0, 0],
    [0, 0, 0, 1]
    ])

# a quantum circuit containing a 2-qubit unitary
q = QuantumCircuit(3,3)
q.unitary(perm2, [0,1], label='P')
q.h([0,1,2])
q.h([0])
q.barrier()
q.cx(1,0)
q.z(2)
q.barrier()
q.h([0])
q.barrier()
q.h([0,1,2])

# select a backend
backend = BasicAer.get_backend('qasm_simulator')

result = transpile(q, backend=backend, basis_gates=['u1', 'u2', 'u3', 'cx'], optimization_level=3)

result.draw(output='mpl')

或者,您可以选择不展开3量子比特幺正,方法是从代码中删除basis_gates=['u1', 'u2', 'u3', 'cx']。这样也可以运行良好。


你能在另一个后端(实际的量子计算机)上运行吗?这似乎也是个问题。我成功地让它工作了,而不需要给它一个受限制的基础门集合,如basis_gates = ['u1','u2','u3','cx'],但对于特定的硬件,基础门被硬件强制执行。 - Amelie Schreiber
我刚刚发现了这个关于在 Qiskit 中转译的视频(https://www.youtube.com/watch?v=2T3163VjvWQ),它可能对未来的人们有所帮助。 - Amelie Schreiber
似乎这不仅仅是没有实现3量子位或更多门传输的问题(请参见上面的更新)。 - Amelie Schreiber

1

Qiskit 0.19已经解决了有关分解多量子比特酉矩阵的第一个问题。请尝试更新您的安装程序。

第二个问题是,Qiskit中的identity门并不完全等同于单位矩阵。它类似于延迟指令,用于在电路中插入空闲时间。转换器不会尝试将其移除,因此将电路展开到basis_gates=['u1', 'u2', 'u3', 'cx']将无法正常工作。您应该使用id增加基本门。


看起来对于任意的三比特门它仍然不起作用,尽管更新确实使得它对于一些三比特门起作用。作为反例,请尝试在我的问题中对三比特上的置换矩阵进行操作。 - Amelie Schreiber
谢谢您的回复并对此进行了调查。我很喜欢研究功能并学习有关实现方式的知识。我真的很想了解 Nielsen&Chuang 中第4.5节和附录3中的方法是如何实现的。您能否在这方面提供一些指导或告诉我仍需实现哪些内容。我希望为 Qiskit 做出有意义的贡献,并在此过程中学到一些东西。 - Amelie Schreiber
使用 basis_gates=['u1', 'u2', 'u3', 'cx'] 目前可以正常工作,但是 basis_gates=['h', 'z', 'cx', 't'] 仍然无法正常工作。 - Amelie Schreiber
我认为,如果您使用的硬件始终具有本地的 'u3'(以及 'cx'),那就足够了。我认为可以安全地假设未来硬件将有一个标准的 'u3',但我相信目前可以找到许多没有本地 'u3' 的示例。您同意吗?当前的量子硬件可能比任意的 'u3' 更准确地实现其他门,这也是在转换时考虑的好处。 - Amelie Schreiber
1
对于其他有兴趣参与此项目的人,这个视频可能会有所帮助:https://www.youtube.com/watch?v=d_428En3an8 - Amelie Schreiber
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接