可变量子逻辑门(VQG)¶
要在VQNet中使用量子操作 qop
或 qop_pmeasure
,就必须要包含可变量子线路(VQC
),而可变量子逻辑门则是构成 VQC
的基本单位。 可变量子逻辑门(VariationalQuantumGate
,别名: VQG
),内部维护着一组变量参数以及一组常量参数。
在构造 VQG
的时候只能对其中一组参数进行赋值。若含有一组常量参数,则可以通过 VQG
生成含确定参数的普通量子逻辑门, 若含有变量参数,则可以动态修改参数值,并生成对应的参数的普通量子逻辑门。
目前在QPanda::Variational中定义了如下可变量子逻辑门,它们都继承自 VQG
。
VQG | 别名 |
VariationalQuantumGate_H | VQG_H |
VariationalQuantumGate_RX | VQG_RX |
VariationalQuantumGate_RY | VQG_RY |
VariationalQuantumGate_RZ | VQG_RZ |
VariationalQuantumGate_CNOT | VQG_CNOT |
VariationalQuantumGate_CZ | VQG_CZ |
接口介绍¶
-
class
VariationalQuantumGate
¶ -
VariationalQuantumGate
()¶ - 功能
- 构造函数。
- 参数
- 无
-
size_t
n_var
()¶ - 功能
- 该可变量子逻辑门内部变量个数。
- 参数
- 无
- 返回值
- 变量个数。
-
std::vector<double> &
get_constants
()¶ - 功能
- 获取该可变量子逻辑门内部常量。
- 参数
- 无
- 返回值
- 该可变量子逻辑门内部常量。
-
virtual QGate
feed
() const = 0¶ - 功能
- 实例化
QGate
。 - 参数
- 无
- 返回值
- 普通量子逻辑门。
-
virtual QGate
feed
(std::map<size_t, double> offset) const¶ - 功能
- 通过指定偏移来实例化
QGate
。 - 参数
- offset 变量对应的偏移映射
- 返回值
- 普通量子逻辑门。
-
下面将简要介绍各个可变量子逻辑门的构造方式
-
class
VariationalQuantumGate_RX
¶ -
-
VariationalQuantumGate_RX
(Qubit *q, double angle)¶ - 功能
- RX门构造函数。
- 参数
- q 目标比特
- angle 参数
-
-
class
VariationalQuantumGate_RY
¶ -
-
VariationalQuantumGate_RY
(Qubit *q, double angle)¶ - 功能
- RY门构造函数。
- 参数
- q 目标比特
- angle 参数
-
-
class
VariationalQuantumGate_RZ
¶ -
-
VariationalQuantumGate_RZ
(Qubit *q, double angle)¶ - 功能
- RZ门构造函数。
- 参数
- q 目标比特
- angle 参数
-
实例¶
#include "QPanda.h"
#include "Variational/var.h"
int main()
{
using namespace QPanda;
using namespace QPanda::Variational;
constexpr int qnum = 2;
QuantumMachine *machine = initQuantumMachine(QuantumMachine_type::CPU_SINGLE_THREAD);
std::vector<Qubit*> q;
for (int i = 0; i < qnum; ++i)
{
q.push_back(machine->Allocate_Qubit());
}
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;
}