用于量子电路的 Qiskit 转译器

Ame*_*ber 6 python quantum-computing transpiler qiskit

Qiskit 中有该transpile()功能(请参阅文档)。我对转译器的最好理解是一种将一组门操作转换为另一组门操作的方法,其目的是在不同的后端运行算法(因为量子位连接性,即架构的几何形状,从一台量子计算机到另一台)。有多种方法可以通过减少冗余和根据等效门重写事物来优化电路,例如将哈达玛门共轭的 CNOT 更改为 CZ 以减少门数。如果硬件后端没有本机 CZ,人们可能还想做完全相反的事情,从 CZ 转到由 Hadamards 共轭的 CNOT。一般来说,这种为了优化某些固定硬件后端的任意电路而进行的转译是一个 QMA 完全问题(例如,参见此处......也许有人使用LEAN来完成类似的事情?)。有时也使用变分方法来近似最佳电路,但我离题了。

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

鉴于此,人们期望 Qiskittranspile()函数能够近似单一门并将门集重构为最佳(最小化)门集以优化电路,但可能会在具有许多非标准门的大型电路中出现问题。但是,即使对于简单的示例,我也无法使其正常工作。例如,三个量子位上的置换矩阵似乎是一个合理的酉近似(有些甚至可以轻松地手动转换为交换门和 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')
Run Code Online (Sandbox Code Playgroud)

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

result = transpile(qc, basis_gates=['u1', 'u2', 'u3', 'cx'], optimization_level=3)
result.draw(output='mpl')
Run Code Online (Sandbox Code Playgroud)

我收到一些巨大的、漫长的、可怕的错误,结果是,

NotImplementedError: Not able to generate a subcircuit for a 3-qubit unitary
Run Code Online (Sandbox Code Playgroud)

所以,我想我的问题是……为什么。哈哈。不,但说真的,我只是以错误的方式使用它吗?我的期望太高了吗?有没有合理的方法来做我想做的事?一组不同的基础门会起作用吗?如果是这样,如何决定基础门?我还尝试过该decompose()函数(请参阅文档transpile()) ,在查看每个函数的源代码时,该函数似乎具有更有限的功能。该功能已实现(如本视频本视频decompose()所示)。该功能也已实现(请参阅此视频,大约 10:35 单元格 In[18] 以及他的讨论)。您还可以尝试使用他的命令运行命令transpile()

NotImplementedError: Not able to generate a subcircuit for a 3-qubit unitary
Run Code Online (Sandbox Code Playgroud)

它也不适用于该导入。如果有人理解为什么该transpile()函数(或与decompose()此相关的函数)没有按照我期望的方式工作,我希望得到一个解释。谢谢!!!

- - - - -更新 - - - - -

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

from qiskit import transpile
Run Code Online (Sandbox Code Playgroud)

生成随机电路,然后运行

from qiskit.circuit.random import random_circuit
rcirc2 = random_circuit(3, 4)
rcirc2.draw(output='mpl')
Run Code Online (Sandbox Code Playgroud)

有些结果(没有 3 量子位门)不会转译,有些则可以。因此,这似乎超出了没有实现 3 量子位或更多门的范围transpile()。注意:您可能需要多次尝试此代码才能获得没有 3 量子位门的电路,因为电路是“随机”的。例如,以下电路将不会转换,

from qiskit.compiler import transpile
result2 = transpile(rcirc2, basis_gates=['u1', 'u2', 'u3', 'cx'], optimization_level=3)
result2.draw(output='mpl')
Run Code Online (Sandbox Code Playgroud)

当我们跑步时

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')
Run Code Online (Sandbox Code Playgroud)

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

----------更新2----------

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

result3 = transpile(circ, basis_gates=['u1', 'u2', 'u3', 'cx'], optimization_level=3)
result3.draw(output='mpl')
Run Code Online (Sandbox Code Playgroud)

您可以重新定义酉运算对哪些量子位进行操作,或者将电路减少为 3 量子位电路,或者以这种方式生成更大的 n 量子位酉。这些例子都不起作用。

And*_*rdo 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')
Run Code Online (Sandbox Code Playgroud)

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