量子比特池

简介

QPanda之前版本中量子比特和经典寄存器都是通过虚拟机进行申请,管理,控制。 现在提供独立于虚拟机的方法,即量子比特、经典寄存器不通过虚拟机管理,可以由提供的比特池直接申请、释放。 为了更好的使用量子比特和经典寄存器,我们进一步支持以物理地址代表相应比特使用。

接口说明

量子比特池:

OriginQubitPool::get_instance() 获取单例的量子比特池, 通过该池对象申请释放量子比特

get_capacity 获取最大容量

set_capacity 设置容量

get_qubit_by_addr 通过物理地址获取量子比特

经典寄存器池:

OriginCMem::get_instance() 获取单例的经典寄存器池,通过该池对象申请释放经典寄存器

get_capacity 获取最大容量

set_capacity 设置容量

get_cbit_by_addr 通过物理地址获取量子比特

由于申请释放方法均和虚拟机提供的方法相同。 在 量子虚拟机 中有详细介绍。 同时对于量子比特和经典寄存器的使用,现在也可以直接通过对应比特的地址传参。

例如 : H(1) 可以理解在物理地址为1的量子比特上作用H门。 Measure(1, 1) 可以理解在物理地址为1的量子比特施加Meausre测量,并将结果保存在地址为1的经典寄存器上。

实例

#include "QPanda.h"
USING_QPANDA
using namespace std;
int main()
{
    // 量子比特可以和虚拟机 脱离关系,获取对应池的单例
    auto qpool = OriginQubitPool::get_instance();
    auto cmem = OriginCMem::get_instance();

    //获取容器大小
    cout << "set qubit pool capacity  before: "<< qpool->get_capacity() << endl;
    // 设置最大容器
    qpool->set_capacity(20);
    cout << "set qubit pool capacity  after: " << qpool->get_capacity() << endl;

    // 通过比特池申请比特,由于是单例模式,要保证申请的比特数量不超过最大容量
    auto qv = qpool->qAllocMany(6);
    auto cv = cmem->cAllocMany(6);

    // 获取被申请的量子比特
    QVec used_qv;
    auto used_qv_size = qpool->get_allocate_qubits(used_qv);
    cout << "allocate qubits number: " << used_qv_size << endl;

    // 构建虚拟机
    auto qvm = new CPUQVM();
    qvm->init();
    auto prog = QProg();
    // 直接使用物理地址作为量子比特信息入参
    prog << H(0) << H(1)
        << H(2)
        << H(4)
        << X(5)
        << X1(2)
        << CZ(2, 3)
        << RX(3, PI / 4)
        << CR(4, 5, PI / 2)
        << SWAP(3, 5)
        << CU(1, 3, PI / 2, PI / 3, PI / 4, PI / 5)
        << U4(4, 2.1, 2.2, 2.3, 2.4)
        << BARRIER({0, 1,2,3,4,5})
        ;

    // 测量方法也可以使用比特物理地址
    auto res_0 = qvm->probRunDict(prog, { 0,1,2,3,4,5 });
    // auto res_1 = qvm->probRunDict(prog, qv);  //同等上述方法


    // 同样经典比特地址也可以作为经典比特信息入参
    prog << Measure(0, 0)
        << Measure(1, 1)
        << Measure(2, 2)
        << Measure(3, 3)
        << Measure(4, 4)
        << Measure(5, 5)
        ;

    // 使用经典比特地址入参
    vector<int> cbit_addrs = { 0,1,2,3,4,5 };
    auto res_2 = qvm->runWithConfiguration(prog, cbit_addrs, 5000);
    // auto res_3 = qvm->runWithConfiguration(prog, cv, 5000); //同等上述方法
    qvm->finalize();
    delete(qvm);


    // 同时我们还可以再次利用这里申请的qv,避免多次使用虚拟机多次申请比特的问题发生
    auto qvm_noise = new NoiseQVM();
    qvm_noise->init();
    auto res_4 = qvm_noise->runWithConfiguration(prog, cbit_addrs, 5000);
    qvm_noise->finalize();
    delete(qvm_noise);

    return 0;
}

运行结果:

set qubit pool capacity  before: 29
set qubit pool capacity  after: 20
allocate qubits number: 6