基于搜索的量子合成/编译
qsearch的Python项目详细描述
Q搜索
基于a*和数值优化的量子门综合算法的实现。它依赖于NumPy和{a2}。它可以导出Qiskit和OpenQASM的代码。在
这是本文Heuristics for Quantum Compiling with a Continuous Gate Set中描述的算法的实现。在
这些结果显示了qsearch如何提供最佳或接近最优的结果。我们将结果与UniversalQ Compiler进行比较。在
Circuit | # of Qubits | Ref # | CNOT Linear | CNOT Ring | UQ (CNOT Ring) | CNOT Linear Unitary Distance | CNOT Ring Unitary Distance |
---|---|---|---|---|---|---|---|
QFT | 3 | 6 | 7* | 6* | 15 | 1.33 * 10-14 | 2.22 * 10-16 |
Fredkin | 3 | 8 | 8 | 7 | 9 | 1.76 * 10-14 | 0.0 |
Toffoli | 3 | 6 | 8 | 6 | 9 | 1.14 * 10-14 | 0.0 |
Peres | 3 | 5 | 7 | 6 | 19 | 1.13 * 10-14 | 0.0 |
HHL | 3 | N/A | 3* | 3* | 16 | 1.25 * 10-14 | 0.0 |
Or | 3 | 6 | 8 | 6 | 10 | 1.72 * 10-14 | 0.0 |
EntangledX | 3 | 4 | 2,3,4 | 2,3,4 | 9 | 1.26 * 10-14 | 0.0 |
TFIM_3_3 | 3 | 4 | 4 | 4 | 17 | 0.0 | 0.0 |
TFIM_6_3 | 3 | 8 | 6 | 6 | 17 | 4.44 * 10-16 | 0.0 |
TFIM_42_3 | 3 | 56 | 6 | 6 | 17 | 8.88 * 10-16 | 0.0 |
TFIM_60_3 | 3 | 80 | 6 | 6 | 17 | 6.66 * 10-16 | 0.0 |
QFT | 4 | N/A | 13* | 89 | 6.66 * 10-16 | ||
TFIM_30_4 | 4 | 60 | 11 | 87 | 9.08 * 10-11 | ||
IBM Challenge | 4 | N/A | 4 | DNR | 0.0 |
由于一些局部优化程序偶尔会因一些最小计数而导致CNOT*卡在局部电路中。在这些情况下,列出了10个最佳运行时间。这些电路的CNOT计数偶尔比列出的多1个。“纠缠门”是一个参数化的门,对于某些参数的组合,我们能够用比手工优化的一般解更少的CNOTs得到解。在
安装
这是一个python包,可以使用pip安装。您需要至少3.6版本的Python。qsearch编译器目前运行在macOS、Linux(包括the Windows Subsystem for Linux)和Windows(在Windows上性能要差得多)。您可以使用以下方法从PyPi安装它:
pip3 install qsearch
您也可以从git存储库安装:
^{pr2}$或者下载并安装:
git clone https://github.com/BQSKit/qsearch
pip3 install --upgrade ./qsearch
如果对本地副本进行更改,则可以重新安装程序包:
pip3 install --upgrade ./qsearch
安装后,您可以像导入任何其他python包一样导入库:
import qsearch
快速入门:qsearch项目
使用qsearch库的最简单方法是使用项目。创建项目时,提供一个将在其中创建目录以包含项目文件的路径。在
import qsearch
myproject = qsearch.Project("desired/path/to/project/directory")
然后可以添加单元进行编译,并设置编译器属性。酉矩阵应使用dtype="complex128"
作为numpy
n数组提供。在
myproject.add_compilation("gate_name", gate_unitary)
myproject["compiler_option"] = value
配置好项目后,可以通过调用run()
来启动项目。编译器使用自动检查点系统,因此,如果在运行过程中被终止,可以通过再次调用run()
来恢复。在
myproject.run()
项目完成后,您可以获得OpenQASM输出:
myproject.assemble("gate_name") # This will return a string of OpenQASM
myproject.assemble("gate_name", write_location="path/to/output/file") # This will write the qasm to the specified path.
无项目编译
如果不想使用项目,可以直接使用SearchCompiler
类。在
import qsearch
compiler = qsearch.SearchCompiler()
result = compiler.compile(target=target_unitary)
SearchCompiler
类和compile
函数可以使用额外的参数来进一步配置编译器。返回值是一个字典,它包含表示已实现电路的酉、电路结构的qsearch.gates.Gate
表示和电路结构的参数向量。在
关于终结性的注记
在命名量子位时,我们使用了使用big-endian的物理约定。一些量子程序,包括IBM的Qiskit,使用little endian。这意味着您需要颠倒为Qiskit设计的一元货币的尾数,以便使用我们的代码,反之亦然。我们提供了一个对numpy矩阵执行endian反转的函数:
little_endian = qsearch.utils.endian_reverse(big_endian) # you can use the same function to convert in the other direction as well
文档和示例
文档和API参考可以找到on readthedocs。在
还可以看看examples!在
法律/版权信息
请阅读我们的LICENSE
- 项目
标签: