首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qiskit量子电路转发器

Qiskit量子电路转发器
EN

Stack Overflow用户
提问于 2020-05-14 14:47:03
回答 2查看 2.3K关注 0票数 3

好的,在Qiskit中有一个transpile()函数(参见documentation)。我对转译器的理解最好被描述为一种将一组门操作转换为另一组门操作的方法,目的是在不同的后端上运行算法(因为量子比特连接,即体系结构的几何形状,从一个量子计算机到另一个量子计算机)。有一些方法可以通过减少冗余和根据等效门重写内容来优化电路,例如将由Hadamard门共轭的CNOT更改为CZ以减少门数。如果硬件后端上没有本机CZ,人们可能还想做相反的事情,从CZ转到由Hadamard共轭的CNOT。一般而言,这种为了优化某个固定硬件后端的任意电路而进行的代码转换是一个QMA完全问题(请参阅example...perhaps的here,有人使用过LEAN来做类似的事情?)。有时变分方法也被用来近似最优电路,但我离题了。

一个略有不同但相关的问题:使用Nielsen & Chuang附录3中的Kitaev-Solovay定理和4.5中的材料,我们知道我们总是可以“有效”地用通用门集近似任意么正门(这在书中做得很精确,在这里不一定很重要)。我认为效率到底有多高是一个悬而未决的问题,但至少有一些上限和下限。

鉴于此,人们会期望Qiskit transpile()函数近似么正门,并将门集重构为最优(最小化)门集,以优化电路,但对于具有许多非标准门的大型电路,可能会出现问题。然而,即使是简单的例子,我也遇到了让它工作的问题。例如,三个量子比特上的置换矩阵似乎是一个合理的逼近么正矩阵(有些甚至可以很容易地手动转换为交换门和X门)。但是Qiskit似乎不喜欢这样做,我需要一些帮助来理解其中的原因。例如,我们可以在Qiskit中定义么正(置换)运算符,并将其转换为量子电路中的门,如下所示:

代码语言:javascript
复制
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()函数,如下所示:

代码语言:javascript
复制
result = transpile(qc, basis_gates=['u1', 'u2', 'u3', 'cx'], optimization_level=3)
result.draw(output='mpl')

我得到了一些巨大的长而可怕的错误,

代码语言:javascript
复制
NotImplementedError: Not able to generate a subcircuit for a 3-qubit unitary

所以,我想我的问题是is...WHY。不,但说真的,我是不是用错了方式?我的期望是不是太高了?有没有合理的方法来做我想做的事情?一组不同的基础门可以工作吗?如果是这样的话,如何确定基础门呢?我还尝试了decompose()函数(请参阅documentation),在查看每个函数的源代码时,它的功能似乎比transpile()函数更有限。实现了函数decompose() (可以在this videothis one中看到)。还实现了transpile()函数(参见this video在大约10:35 cell In18处,并在他的讨论中)。您也可以尝试使用his命令运行这些命令

代码语言:javascript
复制
from qiskit import transpile

而且它也不适用于该导入。如果有人理解为什么transpile()函数(或decompose()函数)不能以我期望的方式工作,我希望能有一个解释。谢谢!

-更新

我发现了另一个问题。如果我们使用

代码语言:javascript
复制
from qiskit.circuit.random import random_circuit
rcirc2 = random_circuit(3, 4)
rcirc2.draw(output='mpl')

生成随机电路,然后运行

代码语言:javascript
复制
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个量子位门的电路,因为这些电路是“随机的”。例如,下面的电路不能转换,

代码语言:javascript
复制
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')

当我们运行时

代码语言:javascript
复制
result3 = transpile(circ, basis_gates=['u1', 'u2', 'u3', 'cx'], optimization_level=3)
result3.draw(output='mpl')

添加障碍来将所有独立的门分成不同的步骤似乎也没有帮助。因此,这不是并行运行的问题,而是独立的门操作。

-更新2

如果我们使用Qiskit生成随机的3量子比特单位,这些也不起作用。

代码语言:javascript
复制
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量子比特单位。这些例子都不会起作用。

EN

回答 2

Stack Overflow用户

发布于 2020-05-14 15:45:23

也许我对量子计算的了解还不够,但我会试着提供一些帮助。

看起来transpile()还没有办法解开3个或更多量子位的么正运算符。不过,对于一个2量子比特的么正粒子,它似乎确实工作得很好。

代码语言:javascript
复制
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')

或者,您可以选择不通过从代码中删除basis_gates=['u1', 'u2', 'u3', 'cx']来展开3量子位统一性。这也运行得很好。

票数 1
EN

Stack Overflow用户

发布于 2020-05-15 06:02:54

在Qiskit 0.19中解决了关于分解多量子比特单位的第一个问题。请尝试更新您的安装。

第二个问题是Qiskit中的identity门并不完全相同。它类似于延迟指令,用于将空闲时间插入电路。转译器不会尝试删除它们,因此将电路展开到basis_gates=['u1', 'u2', 'u3', 'cx']将不起作用。您应该使用id来增强基础门。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61790974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档