查看原文
其他

QPanda 2教程资源 | 量子程序序列化以及解析量子程序的二进制文件

OriginQ 本源量子 2021-02-13

hi~

继上篇推送的

逻辑门及量子程序时钟周期统计

小编再次为大家带来

QPanda 2的后续工具组件

想要了解的小伙伴们

请戳这里吧!



在上一篇文章中,小编为大家介绍了QPanda 2的逻辑门及量子程序时钟周期统计。

逻辑门的统计是指统计量子程序、量子线路、量子循环控制或量子条件控制中所有的量子逻辑门(这里也会将测量门统计进去)个数方法。量子程序时钟周期统计是指已知每个量子逻辑门在运行时所需时间的条件下,估算一个量子程序运行所需要的时间。

除此之外,QPanda 2的工具组件还包括量子程序序列化以及解析序列化的量子程序。

量子程序序列化


简介

定义一种协议将量子程序序列化为二进制数据,方便量子程序的存储与传输。

接口介绍

QProgStored 类是QPanda2提供的一个将量子程序序列化的工具类,我们先用QPanda2构建一个量子程序:

auto qubits = qvm_store->allocateQubits(4);

auto cbits = qvm_store->allocateCBits(4);


QProg prog;

prog << H(qubits[0]) << CNOT(qubits[0], qubits[1]) 

               << CNOT(qubits[1], qubits[2]) 

               << CNOT(qubits[2], qubits[3]) 

               ;

然后调用QProgStored类实现序列化

QProgStored t(qvm);

t.transform(prog);

auto instructions = t.getInsturctions();

QPanda 2还提供了封装好的接口来实现量子程序序列化,上述的转化代码也可以修改为:

auto instructions = transformQProgToBinary(prog, qvm);

此外,QPanda2还提供了将序列化后的量子程序存储到文件中的方法, 现在讲上述量子程序以二进制的方式存储到 QProg.dat 文件中, 可以调用 QProgStored 类中的方法

QProgStored storeProg(qm);

storeProg.transform(prog);

storeProg.store("QProg.dat");

我们还可以使用QPanda2封装的一个接口:

storeQProgInBinary(prog, qvm,"QProg.dat");

实例

1、初始化量子虚拟机环境:使用initQuantumMachine初始化一个量子虚拟机,返回量子虚拟机指针,向量子虚拟机申请4个量子比特和4个经典寄存器;

2、构建一个量子程序:通过 << 运算符将量子逻辑门插入到量子程序中;

3、序列化量子程序:调用transformQProgToBinary接口,实现量子程序序列化;

4、输出序列化之后的量子程序:调用Base64::encode接口将序列化之后的量子程序(序列化后的量子程序为二进制数据)以base64的编码方式输出。

#include <QPanda.h>

#include <Core/Utilities/base64.hpp>

USING_QPANDA


int main(void)

{

    auto qvm_store = initQuantumMachine(); 

     auto qubits = qvm_store->allocateQubits(4); 

     auto cbits = qvm_store->allocateCBits(4); 

     cbits[0].setValue(0); 


     QProg prog; 

     prog << H(qubits[0]) << CNOT(qubits[0], qubits[1]) 

                    << CNOT(qubits[1], qubits[2]) 

                    << CNOT(qubits[2], qubits[3]) 

                    ; 

      auto data = transformQProgToBinary(prog, qvm_store); 

      auto base64_data = Base64::encode(data.data(), data.size()); // 将得到的二进制数据以base64的方式编码 

      std::string data_str(base64_data.begin(), base64_data.end());                      

std::cout << data_str << std::endl; 


      qvm_store->finalize();

      delete qvm_store;

      return 0;

}

运行结果:


AAAAAAQAAAAEAAAABAAAAA4AAQAAAAAAJAACAAAAAQAkAAMAAQACACQABAACAAMA

注解

二进制数据不能直接输出,以base64的编码格式编码,得到相应的字符串


解析量子程序二进制文件


简介

解析序列化的量子程序。

接口介绍

QProgDataParse类是对量子程序序列化类序列化的量子程序反序列化, 例如下面的量子程序:

prog << H(qubits[0]) << CNOT(qubits[0], qubits[1]) 

               << CNOT(qubits[1], qubits[2]) 

               << CNOT(qubits[2], qubits[3]);

序列化之后经过base64编码之后得到的结果是(具体序列化的方法参照量子程序序列化)

AAAAAAQAAAAEAAAABAAAAA4AAQAAAAAAJAACAAAAAQAkAAMAAQACACQABAACAAMA

现在就对这个结果反序列化,先讲base64的结果解码成二进制数据:

std::string = "AAAAAAQAAAAEAAAABAAAAA4AAQAAAAAAJAACAAAAAQAkAAMAAQACACQABAACAAMA";

auto data = Base64::decode(data_str.data(), data_str.size());

然后调用QProgDataParse类中的函数, 得到反序列化之后的量子程序

QProgDataParse parse(qvm);

parse.load(data);

parse.parse(parseProg);

auto qubits_parse = parse.getQubits();

auto cbits_parse = parse.getCbits();

我们还可以使用QPanda2封装的一个接口:

QVec qubits_parse;

std::vector<ClassicalCondition> cbits_parse;

binaryQProgDataParse(qvm, data, qubits_parse, cbits_parse, parseProg);


实例

1、初始化量子虚拟机环境:使用initQuantumMachine初始化一个量子虚拟机,返回量子虚拟机指针,向量子虚拟机申请4个量子比特和4个经典寄存器;

2、定义量子比特容器和经典寄存器容器:接收解析出的量子比特和经典寄存器;

3、解码量子程序字符串:调用Base64::decode接口,将量子序列化的量子程序解码;

4、量子程序反序列化:调用binaryQProgDataParse接口,从量子程序序列化的二进制数据中解析出量子程序;

5、运行量子程序:调用probRunTupleList接口,运行解析的量子程序,检验量子程序是否可以正常运行。


#include <QPanda.h>

#include <Core/Utilities/base64.hpp>


USING_QPANDA


int main(void)

{

    auto qvm = initQuantumMachine(); 

     QProg parseProg; 

     QVec qubits_parse; 

     std::vector<ClassicalCondition> cbits_parse;


     std::string data_str = "AAAAAAQAAAAEAAAABAAAAA4AAQAAAAAAJAACAAAAAQAkAAMAAQACACQABAACAAMA"

     auto data = Base64::decode(data_str.data(), data_str.size());                         

binaryQProgDataParse(qvm, data, qubits_parse, cbits_parse, parseProg); 


     auto result_parse = probRunTupleList(parseProg, qubits_parse); 

     for (auto &val : result_parse) 

  { 

            std::cout << val.first << ", " << val.second << std::endl; 

     } 


     qvm->finalize(); 

     delete qvm; 

     return 0;

}

运行结果:

0, 0.5

15, 0.5

1, 0

2, 0

3, 0

4, 0

5, 0

6, 0

7, 0

8, 0

9, 0

10, 0

11, 0

12, 0

13, 0

14, 0

注解

可以运行出正确的结果说明可以将序列化的量子程序正确的解析出来

★以上即为QPanda 2量子程序序列化以及解析序列化的量子程序部分的详细内容介绍。

★感兴趣的欢迎加入"QPanda 2开发交流群"。(关注“本源量子”公众号,回复“加群”,联系小编即可)

★PC端学习量子计算请登录learn-quantum.com 

★掌上学习请下载"本源溯知APP"

★如有疑问可上量子互动论坛,与我们的大神进行交流讨论。


往期精彩回顾

QPanda 2教程资源 | 量子门的有效性及判断方法

QPanda 2教程资源 | 量子比特的测量方法:量子测量和概率测量

模拟量子虚拟机的解决方案(下):单振幅和含噪声量子虚拟机

模拟量子虚拟机的解决方案(上):全振幅和部分振幅量子虚拟机

QPanda 2教程资源 | 构建量子程序、QWhile与QIf的方法

QPanda 2最常用的量子计算模型——量子线路

嗨玩本源QPanda 2,从量子逻辑门实例开始学起!


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存