上一章: 量子线路
下一章: 量子线路与量子程序
QProg
量子编程用于编写和构建量子程序,通常被理解为一系列操作的序列。由于量子算法中也包含经典计算,业界普遍认为,在不久的将来出现的量子计算机将是混合结构,由两个主要部分组成,其中一部分是负责执行经典计算和控制的经典计算机;另一部分是负责执行量子计算的量子设备。QPanda3 将量子程序的编程过程视为经典程序执行的一部分,整个外围主机程序必须包含创建量子程序的部分。
构造函数
可以使用多个构造函数创建 QProg 实例:
默认构造函数
Python
带量子比特数量的构造函数
Python
拷贝构造函数
Python
基于量子线路的构造函数
Python
circuit = QCircuit()
prog = QProg(circuit)
成员函数
以下函数可用于操作和查询 QProg
实例:
追加操作
你可以追加量子门、量子线路或测量操作:
Python
prog.append(H(0))
prog.append(QCircuit())
prog.append(measure(0,0))
运算符重载
你可以使用 <<
运算符追加节点:
Python
prog << H(0) << QCircuit() << measure(0,0)
查询属性
使用 qubits_num 和 cbits_num 函数获取量子比特和经典比特的数量:
Python
num_qubits = prog.qubits_num()
num_cbits = prog.cbits_num()
获取量子比特和经典比特
使用 qubits 和 cbits 函数检索量子比特和经典比特的列表:
Python
qubits = prog.qubits()
cbits = prog.cbits()
获取操作
使用 operations 函数检索程序中的所有操作:
Python
operations = prog.operations()
量子门操作
使用 gate_operations 函数获取量子门操作列表,参数的含义是是否仅获取双量子比特门:
Python
gates = prog.gate_operations(only_q2=False)
统计操作数
使用 count_ops 函数统计程序中的操作数,参数的含义是是否仅统计双量子比特门:
Python
count = prog.count_ops(only_q2=False)
计算程序深度
使用 depth 函数获取程序的深度,参数的含义是是否仅计算双量子比特门:
Python
depth = prog.depth(only_q2=False)
扁平化与转换为量子线路
使用 flatten 和 to_circuit 函数将程序扁平化或转换为量子线路:
Python
flat_prog = prog.flatten()
circuit = prog.to_circuit()
清空程序
使用 clear 函数清除程序中的所有操作:
Python
转指令文件
使用 to_instruction 函数将程序转成本源量子云芯片支持的指令文件。 使用该接口需要保证量子程序中已经全部是芯片的基础指令(RPhi、CZ、Measure和ECHO)。 to_instruction有三个参数,第一个参数是指定的芯片后端,第二个参数是转指令过程中qubit的偏移量,第三个参数是是否使用pattern对指令进行分层。
Python
all_qbits = list(range(10))
circuit = random_qcircuit(all_qbits, 10, ["RPHI", "CZ"])
prog_1 = QProg()
prog_1 << circuit
for i in all_qbits:
prog_1 << measure(i, i)
json = prog_1.to_instruction(backend,0,False)
print(json)
示例用法
以下是一个创建量子程序、运行量子程序并测量结果的简单示例:
Python
prog = QProg()
prog << H(0)
for i in range(1, 5):
prog << CNOT(i - 1, i)
for i in range(5):
prog << measure(i, i)
print(draw_qprog(prog))
qvm = CPUQVM()
qvm.run(prog, 1024)
print(qvm.result().get_prob_dict())
运行结果:
┌─┐ ┌─┐
q_0: |0>─┤H├ ───*── ───────┤M├ ────────── ────────── ───────
└─┘ ┌──┴─┐ └╥┘ ┌─┐
q_1: |0>──── ┤CNOT├ ───*────╫─ ───────┤M├ ────────── ───────
└────┘ ┌──┴─┐ ║ └╥┘ ┌─┐
q_2: |0>──── ────── ┤CNOT├──╫─ ───*────╫─ ───────┤M├ ───────
└────┘ ║ ┌──┴─┐ ║ └╥┘ ┌─┐
q_3: |0>──── ────── ────────╫─ ┤CNOT├──╫─ ───*────╫─ ─┤M├───
║ └────┘ ║ ┌──┴─┐ ║ └╥┘┌─┐
q_4: |0>──── ────── ────────╫─ ────────╫─ ┤CNOT├──╫─ ──╫─┤M├
║ ║ └────┘ ║ ║ └╥┘
c : / ════════════════════╩══════════╩══════════╩════╩══╩═
0 1 2 3 4
{'00000': 0.478515625, '11111': 0.521484375}