可变量子逻辑门
要在VQNet中使用量子操作 qop
或 qop_pmeasure
,就必须要包含可变量子线路(VQC
),而可变量子逻辑门则是构成 VQC
的基本单位。 可变量子逻辑门(VariationalQuantumGate
,别名: VQG
),内部维护着一组变量参数以及一组常量参数。
在构造 VQG
的时候只能对其中一组参数进行赋值。若含有一组常量参数,则可以通过 VQG
生成含确定参数的普通量子逻辑门, 若含有变量参数,则可以动态修改参数值,并生成对应的参数的普通量子逻辑门。
目前在QPanda::Variational中定义了如下可变量子逻辑门,它们都继承自 VQG
。
VQG |
别名 |
---|---|
VariationalQuantumGate_I |
VQG_I |
VariationalQuantumGate_H |
VQG_H |
VariationalQuantumGate_X |
VQG_X |
VariationalQuantumGate_X1 |
VQG_X1 |
VariationalQuantumGate_RX |
VQG_RX |
VariationalQuantumGate_Y |
VQG_Y |
VariationalQuantumGate_Y1 |
VQG_Y1 |
VariationalQuantumGate_RY |
VQG_RY |
VariationalQuantumGate_Z |
VQG_Z |
VariationalQuantumGate_Z1 |
VQG_Z1 |
VariationalQuantumGate_RZ |
VQG_RZ |
VariationalQuantumGate_S |
VQG_S |
VariationalQuantumGate_T |
VQG_T |
VariationalQuantumGate_U1 |
VQG_U1 |
VariationalQuantumGate_U2 |
VQG_U2 |
VariationalQuantumGate_RPhi |
VQG_RPhi |
VariationalQuantumGate_U3 |
VQG_U3 |
VariationalQuantumGate_U4 |
VQG_U4 |
VariationalQuantumGate_CZ |
VQG_CZ |
VariationalQuantumGate_CNOT |
VQG_CNOT |
VariationalQuantumGate_SWAP |
VQG_SWAP |
VariationalQuantumGate_iSWAP |
VQG_iSWAP |
VariationalQuantumGate_SqiSWAP |
VQG_SqiSWAP |
VariationalQuantumGate_CR |
VQG_CR |
VariationalQuantumGate_CU |
VQG_CU |
VariationalQuantumGate_CRX |
VQG_CRX |
VariationalQuantumGate_CRY |
VQG_CRY |
VariationalQuantumGate_CRZ |
VQG_CRZ |
VariationalQuantumGate_SpecialA |
VQG_A |
接口介绍
我们可以通过可变量子逻辑门的别名,来使用可变量子逻辑门。我们可以向需要传入参数的可变量子逻辑门中传入变量参数, 例如我们对可变量子逻辑门RX和RY传入变量参数x和y。也可以对可变量子逻辑门传入常量参数,例如RZ我们传入了一个常量参数0.12。 我们可以通过修改变量的参数,从而来改变可变量子逻辑门中的参数。
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));
vqc.insert(VQG_RZ(q[0], 0.12));
vqc.insert(VQG_CZ(q[0], q[1]));
vqc.insert(VQG_CNOT(q[0], q[1]));
QCircuit circuit1 = vqc.feed();
m1(0, 0) = 3;
m2(0, 0) = 4;
x.setValue(m1);
y.setValue(m2);
QCircuit circuit2 = vqc.feed();
实例
#include "QPanda.h"
#include "Variational/var.h"
int main()
{
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));
vqc.insert(VQG_RZ(q[0], 0.123));
vqc.insert(VQG_CZ(q[0], q[1]));
vqc.insert(VQG_CNOT(q[0], q[1]));
QCircuit circuit = vqc.feed();
QProg prog;
prog << circuit;
std::cout << convert_qprog_to_originir(prog, machine) << std::endl << std::endl;
m1(0, 0) = 3;
m2(0, 0) = 4;
x.setValue(m1);
y.setValue(m2);
QCircuit circuit2 = vqc.feed();
QProg prog2;
prog2 << circuit2;
std::cout << convert_qprog_to_originir(prog2,machine) << std::endl;
return 0;
}