其他
教你如何使用QPanda解决量子位映射问题
人类即将进入一个量子技术发展的关键新时代「NISQ(Noisy Intermediate-Scale Quantum,含噪声的中型量子)」,使用 NISQ 技术的设备将成为探索多体量子物理学的有用工具,我们应该将其看作是向未来更强大的量子技术迈出的重要一步。
近十年,量子计算因其能以指数速度加速一些重要算法而受到广泛关注。但NISQ设备与量子计算算法的硬件要求(例如尺寸和可靠性)之间存在着差距。
为了弥合差距,质量控制需要抽象层和工具链来翻译和优化量子程序。量子计算编译器通常会在多个阶段将高级量子计算代码转换为(优化的)电路级汇编代码。
通过采用量子程序分层以及A*搜索算法,使用当前层映射关系对本层其他量子位产生的插入SWAP消耗和当前层映射关系对下一层产生的插入SWAP消耗作为启发式函数,在每层中找到一个插入SWAP消耗近似最少的映射关系,从而使得算法的整体消耗上近似达到最少。
中国科学技术大学张昱老师团队提出解决映射问题的全新思路,并与和本源量子团队合作,在QPanda2上成功实现。成果论文《CODAR: A Contextual Duration-Aware Qubit Mapping for Various NISQ Devices》已于预印本平台arXiv.发布。
研究团队通过采用一种上下文敏感和持续时间感知的重映射算法,该算法能够感知门持续时间差和程序上下文,使得它能够从程序中提取更多的并行性。从而极大的减少量子程序的执行时间。
#include"Core/Core.h"
using namespacestd;
using namespaceQPanda;
int main()
{
auto qvm = new CPUQVM();
qvm->init();
auto q = qvm->allocateQubits(4);
auto c = qvm->allocateCBits(4);
QProg srcprog;
QCircuit qft = createEmptyCircuit();
for (auto i = 0; i < q.size(); i++)
{
qft << H(q[q.size() - 1 - i]);
for (auto j = i + 1; j < q.size();j++)
{
qft << CR(q[q.size() - 1 - j],
q[q.size() - 1 - i], 2 * PI / (1<< (j - i + 1)));
}
}
srcprog << qft << U2(q[1], PI/2,-PI/4) << U3(q[2], PI/2, -PI/3, PI/4);
qvm->directlyRun(srcprog);
auto r1 = qvm->PMeasure_no_index(q);
QProg outprog = qcodar_match(srcprog, q,qvm, SIMPLE_TYPE, 2, 3, 5);
qvm->directlyRun(outprog);
auto r2 = qvm->PMeasure_no_index(q);
std::cout <<"映射前的概率测量结果:"<< std::endl;
for (int i = 0; i < r1.size(); i++)
std::cout << r1[i] <<std::endl;
std::cout <<"映射后的概率测量结果:"<< std::endl;
for (int i = 0; i < r2.size(); i++)
std::cout << r2[i] <<std::endl;
qvm->finalize();
delete qvm;
return 0;
}
1.创建量子虚拟机、量子寄存器、经典寄存器 2.编写量子程序 srcprog ,对该量子程序进行概率测量得到结果 r1 3.接着调用 qcodar_match() 对 srcprog 进行符合特定物理结构的线路映射,得到适配特定物理结构的量子程序 outprog 4.对量子程序 outprog 进行概率测量得到结果 r2 5.由于量子程序映射只是对原线路增加额外的 SWAP 操作,以适配物理拓扑结构,并不影响线路的结构。打印映射前后的r1和r2,对比概率测量结果 ;如果结果一致,则线路映射正确。
点击“阅读原文”,即可获取量子程序匹配拓扑结构详细案例~