可变量子线路

VQNet 中量子操作 qopqop_pmeasure 都需要使用可变量子线路作为参数。 可变量子线路(VariationalQuantumCircuit,别名 VQC)是用来存储含有可变参数的量子线路信息, VQC 主要由可变量子逻辑门(VQG)组成。使用时可以向 VQC 插入普通量子逻辑门,或者普通量子线路、以及 VQG 或另外一个 VQC, 在插入普通量子逻辑门或普通量子线路时,其在内部将普通量子逻辑门转换成一组含有固定参数的 VQG。 变量可以和 VQC 中的不同 VQG 相关,VQC 对象会保存变量和 VQG 之间的映射。

接口介绍

量子程序 QProg 无法直接加载可变量子线路,但是我们可以通过调用可变量子线路的 feed 接口来生成一个普通量子线路。

MatrixXd m1(1, 1);
MatrixXd m2(1, 1);
m1(0, 0) = 1;
m2(0, 0) = 2;

var x(m1);
var y(m2);

VQC vqc;
vqc.insert(VQG_H(q[0]));
vqc.insert(VQG_RX(q[0], x));
vqc.insert(VQG_RY(q[1], y));

QCircuit circuit = vqc.feed();
QProg prog;
prog << circuit;

我们可以调用 get_var_in_which_gate 接口来获取到指定变量在可变量子线路中对应的可变量子逻辑门。 我们可以通过向feed接口传入变量对应的可变量子逻辑门,变量在可变量子逻辑门中的索引位置,以及偏移值,来改变指定可变量子逻辑门中变量参数的偏移值。

auto gates = vqc.get_var_in_which_gate(x);

int pos = shared_ptr<VariationalQuantumGate>(gates[0])->var_pos(x);

vector<tuple<weak_ptr<VariationalQuantumGate>, size_t, double>> plus;
plus.push_back(make_tuple(gates[0], pos, 3));

QCircuit circuit2 = vqc.feed(plus);

实例

#include "QPanda.h"
#include "Variational/var.h"

int main()
{
    using namespace std;
    using namespace QPanda;
    using namespace QPanda::Variational;

    constexpr int qnum = 2;

    QuantumMachine *machine = initQuantumMachine(CPU);
    auto q = machine->qAllocMany(qnum);

    MatrixXd m1(1, 1);
    MatrixXd m2(1, 1);
    m1(0, 0) = 1;
    m2(0, 0) = 2;

    var x(m1);
    var y(m2);

    VQC vqc;
    vqc.insert(VQG_H(q[0]));
    vqc.insert(VQG_RX(q[0], x));
    vqc.insert(VQG_RY(q[1], y));

    QCircuit circuit = vqc.feed();
    QProg prog;
    prog << circuit;

    std::cout << convert_qprog_to_originir(prog, machine) << std::endl << std::endl;

    auto gates = vqc.get_var_in_which_gate(x);

    int pos = shared_ptr<VariationalQuantumGate>(gates[0])->var_pos(x);

    vector<tuple<weak_ptr<VariationalQuantumGate>, size_t, double>> plus;
    plus.push_back(make_tuple(gates[0], pos, 3));

    QCircuit circuit2 = vqc.feed(plus);
    QProg prog2;
    prog2 << circuit2;

    std::cout << convert_qprog_to_originir(prog2,machine) << std::endl;

    return 0;
}
_images/VQC_Example.png