量子程序¶
量子程序设计用于量子程序的编写与构造,一般地, 可以理解为一个操作序列。由于量子算法中也会包含经典计算,因而业界设想,最近将来出现的量子计算机是混合结构的,它包含两大部分一部分是经典计算机,负责执行经典计算与控制;另一部分是量子设备,负责执行量子计算。QPanda-2将量子程序的编程过程视作经典程序运行的一部分,在整个外围的宿主机程序中,一定包含创建量子程序的部分。
接口介绍¶
在QPanda2中,QProg是量子编程的一个容器类,是一个量子程序的最高单位,初始化一个空的QProg对象有以下两种
C++风格
QProg prog = QProg();
QProg的构造函数还有以下几种:
通过量子线路构造量子程序:
auto qubit = qAlloc(); QCircuit circuit; circuit << H(qubit); QProg prog(circuit);
通过QIf构造量子程序:
auto qubit = qAlloc(); auto cbit = cAlloc(); cbit.set_val(3); QCircuit circuit; circuit << H(qubit); QIfProg qif(cbit > 3, circuit); QProg prog(qif);
通过QWhile构造量子程序:
auto qubit = qAlloc(); auto cbit = cAlloc(); cbit.set_val(3); QCircuit circuit; circuit << H(qubit); QWhileProg qwhile(cbit > 3, circuit); QProg prog(qwhile);
通过QGate构造量子程序:
auto qubit = qAlloc(); auto gate = H(qubit); QProg prog(gate);
通过QMeasure构建量子程序:
auto qubit = qAlloc(); auto cbit = cAlloc(); auto measure = Measure(qubit, cbit); QProg prog(measure);
通过ClassicalCondition构建量子程序:
auto cbit = cAlloc(); QProg prog(cbit);
实现QProg的这么多构造函数主要是为了实现各种节点类型向QProg的隐式转换,如:
auto qubit = qAlloc(); auto cbit = cAlloc(); cbit.set_val(1); auto gate = H(qubit); auto qif = QIfProg(cbit > 1, gate);
构建QIf的第二个参数本来是要传入QProg的, 但由于QGate可以构造QProg, 在使用时传入参数QGate就会隐式转换为QProg,方便使用。
你可以通过如下方式向QProg尾部填充节点
QProg << QNode;
或者
QProg.pushBackNode(QNode *);
QNode的类型有QGate,QPorg,QIf,Measure等等,QProg支持插入所有类型的QNode
通常一个QProg类型内部结构复杂,需要对其进行拆分遍历等过程,QPanda2提供了相关接口
获取QProg内部第一个节点与最后一个节点
QProg prog = QProg(); NodeIter first_node = prog.getFirstNodeIter(); NodeIter last_node = prog.getLastNodeIter();
在QProg内部插入与删除节点操作
QProg prog = QProg(); NodeIter insert_node_iter = prog.insertQNode(NodeIter&, QNode*); NodeIter delete_node_iter = prog.deleteQNode(NodeIter&);备注
NodeIter是一个关于QNode的代理类,类似于STL容器的迭代器类型,支持自增与自减等操作
QProg节点插入删除操作会返回指向原位置的NodeIter
实例¶
#include "QPanda.h" USING_QPANDA int main(void) { auto qvm = CPUQVM(); qvm.init(); auto qvec = qvm.qAllocMany(4); auto cvec = qvm.cAllocMany(4); QProg prog; // 构建量子程序 prog << H(qvec[0]) << X(qvec[1]) << iSWAP(qvec[0], qvec[1]) << CNOT(qvec[1], qvec[2]) << H(qvec[3]) << MeasureAll(qvec ,cvec); // 量子程序运行1000次,并返回多次测量的结果 auto result = qvm.runWithConfiguration(prog, cvec, 1000); // 打印量子态在量子程序多次运行结果中出现的次数 for (auto &val : result) { std::cout << val.first << ", " << val.second << std::endl; } return 0; }
运行结果:
0001, 254 0111, 261 1001, 257 1111, 228