如何获得默认的 EquivalenceLibrary?

How to get a default EquivalenceLibrary?

我想使用 Qiskit 中的 BasisTranslator 将我的电路处理到基门。

BasisTranslator is EquivalenceLibrary 的构造函数参数之一。我尝试创建一个无参数 EquivalenceLibrary() 并将其传递给 BasisTranslator,但代码失败,表示它无法将 MCT 或 CCX 等门转换为默认基础。

TranspilerError: "Unable to map source basis {('mcx', 4), ('ccx', 3), ('x', 1), ('measure', 1), ('h', 1)} to target basis {'u2', 'snapshot', 'barrier', 'cx', 'u3', 'reset', 'u1', 'measure', 'delay'}

我希望当我尝试 运行 电路时 Transpiler 使用一些默认的 EquivalenceLibrary,因为它 运行 用于模拟器和实际硬件。我怎样才能得到这样的默认 EquivalenceLibrary?

最简单的方法是利用 qiskit(在 qiskit.circuit.equivalence_library.SessionEquivalenceLibrary)中包含的会话等价库,这是一个包含所有标准库门的预构建等价库。您可以将它与类似的东西一起使用:

from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
from qiskit.transpiler.passes import BasisTranslator
from qiskit.circuit import QuantumCircuit
from qiskit.converters import circuit_to_dag, dag_to_circuit

basis_gates = ['u2', 'snapshot', 'barrier', 'cx', 'u3', 'reset', 'u1', 'measure', 'delay']
bt_pass = BasisTranslator(sel, basis_gates)

circuit = QuantumCircuit(3)
circuit.ccx(0, 1, 2)


dag_out = bt_pass.run(circuit_to_dag(circuit))
circuit_out = dag_to_circuit(dag_out)

(作为qiskit-terra >=0.17.0的后续说明,即将发布,你将不再需要在这里转换为dag并直接调用bt_pass(circuit)

如果您对如何从头构建等价库感兴趣,可以在此处查看会话等价库的构建方式: https://github.com/Qiskit/qiskit-terra/blob/0.16.4/qiskit/circuit/library/standard_gates/equivalence_library.py