可变量子逻辑门(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 变量对应的偏移映射
- 返回值
普通量子逻辑门。
-
VariationalQuantumGate()¶
下面将简要介绍各个可变量子逻辑门的构造方式
-
class VariationalQuantumGate_RX¶
-
-
VariationalQuantumGate_RX(Qubit *q, double angle)¶
- 功能
RX门构造函数。
- 参数
q 目标比特
angle 参数
-
VariationalQuantumGate_RX(Qubit *q, double angle)¶
-
class VariationalQuantumGate_RY¶
-
-
VariationalQuantumGate_RY(Qubit *q, double angle)¶
- 功能
RY门构造函数。
- 参数
q 目标比特
angle 参数
-
VariationalQuantumGate_RY(Qubit *q, double angle)¶
-
class VariationalQuantumGate_RZ¶
-
-
VariationalQuantumGate_RZ(Qubit *q, double angle)¶
- 功能
RZ门构造函数。
- 参数
q 目标比特
angle 参数
-
VariationalQuantumGate_RZ(Qubit *q, double 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;
}
