【问题标题】:Qiskit Transpiler for quantum circuits用于量子电路的 Qiskit Transpiler
【发布时间】:2020-08-30 14:39:35
【问题描述】:

好的,所以在 Qiskit 中有 transpile() 函数(参见 documentation)。我对转译器的理解最好被描述为一种将一组门操作转换为另一组门操作的方法,目的是在不同的后端运行算法(因为量子位连接,即架构的几何形状,从一台量子计算机到另一台)。有一些方法可以通过减少冗余和重写等效门来优化电路,例如将由 Hadamard 门共轭的 CNOT 更改为 CZ 以减少门数。如果硬件后端没有本机 CZ,则可能还想完全相反,从 CZ 转到 Hadamards 共轭的 CNOT。一般来说,这种为了优化某些固定硬件后端的任意电路而进行的转译是一个 QMA 完全问题(例如,参见 here...也许有人使用过 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() 函数(请参阅documentation),在查看每个函数的源代码时,它似乎对transpile() 函数的功能更有限。实现了函数decompose()(可以在this videothis one 中看到)。 transpile() 函数也实现了(见this video 在大约 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-qubit 门)不会转译,有些则可以。因此,这似乎不仅仅是没有为transpile() 实现 3-qubit 或更多门。注意:您可能需要多次尝试此代码才能获得没有 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 量子比特酉元。这些例子都不起作用。

【问题讨论】:

    标签: python transpiler quantum-computing qiskit


    【解决方案1】:

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

    看来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')
    

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

    【讨论】:

    • 你能在另一个后端(实际的量子计算机)上运行它吗?这似乎也是一个问题。我能够让它工作而不给它像 basic_gates=['u1', 'u2', 'u3', 'cx'] 这样的一组受限的基础门,但是对于特定的硬件,基础门是强加给你的由硬件决定。
    • 我也刚刚在 Qiskit (youtube.com/watch?v=2T3163VjvWQ) 中发现了这个关于转译的视频,它可能对未来的人们有所帮助。
    • 似乎这不仅仅是没有实现 3-qubit 或更多门转译(见上面的更新)。
    【解决方案2】:

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

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

    【讨论】:

    • 看起来它仍然不适用于任意 3-qubit 门,尽管更新确实使其适用于 一些 3-qubit 门。作为反例,在我的问题中尝试 3-qubits 上的置换矩阵。
    • 我还添加了一个示例,其中包含由 Qiskit 中的 random_unitary() 函数生成的“random”酉矩阵。这些都不起作用。
    • 看起来 Nielsen & Chuang 在 4.5.1 中所做的在某种程度上适用于 2 量子比特门,但没有更大的。使用 4.5.2 我认为您可以从那里建立更大的大门。我不确定近似 2-qubit 门的过程是否正常工作,所以我想在尝试弄清楚如何使用格雷码构建更大的电路之前验证这一点。我现在正在查看源代码以验证这实际上是 Qiskit 正在做的事情,但如果您有更多的见解或想法,它可能会更快。
    • 对于 2-qubit 门也绝对不能正常工作。我已经用不同的基础门测试了它(例如使用 Hadamard、相位、π/8 和 CNOT,这在 Nielsen & Chuang 中被证明是通用的),它不适用于随机生成的 2 量子比特单位或自定义单一的,但是源代码中建议的 ['u1', 'u2', 'u3', 'cx'] 的基组会产生结果,但结果并不总是正确的。
    • 排列和随机酉例子都对我有用。确保您拥有正确的版本号。您可以使用qiskit.__qiskit_version__ 进行检查。你应该有 'qiskit-terra': '0.14.0'` 或更高版本
    猜你喜欢
    • 1970-01-01
    • 2020-04-20
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    相关资源
    最近更新 更多