OriginIR
OriginIR是基于QPanda的量子程序中间表示,对QPanda各种特性的支持有非常重要的作用。OriginIR不仅可以表示绝大部分量子逻辑门类型,表示针对量子线路的dagger操作,为量子线路添加控制比特,还可以支持QPanda独有的Qif、QWhile,可以实现量子程序内嵌经典程序。
OriginIR主要内容有量子比特、经典寄存器、量子逻辑门、转置共轭操作、添加控制比特操作、QIf、QWhile、经典表达式。
量子比特
OriginIR使用QINIT申请量子比特,其格式为QINIT后跟空格+量子比特总数。示例:QINIT 6。需要注意的是除注释外QINIT必须出现在OriginIR程序的第一行。 在使用量子比特时,OriginIR使用q[i]表示某个具体的量子比特,此处i为量子比特的编号,i可为无符号数字型常量,也可为变量,同时也可使用c[i]组成的表达式代替,示例:q[1],q[c[0]],q[c[1]+c[2]+c[3]]。
经典寄存器
OriginIR使用CREG申请经典寄存器,其格式为CREG后跟空格+经典寄存器总数。示例:CREG 6; 在使用经典寄存器时,OriginIR使用c[i]表示某个具体的经典寄存器,i为经典寄存器编号,此处i必须为无符号数字型常量;示例:c[1]。
量子逻辑门
OriginIR把量子逻辑门分为以下几个种类:单门无参数型关键字;单门一个参数型;单门两个参数;单门三个参数;单门四个参数;双门无参数;双门一个参数;双门四个参数;三门无参数。 需要注意的是所有单门操作,目标量子比特可以是整个量子比特数组或者单个量子比特。如果是整个量子比特数组时例如:
H q
当量子比特数组大小为3时则等效为:
H q[0]
H q[1]
H q[2]
1、单门无参数型关键字:H、T、S、X、Y、Z、X1、Y1、Z1、I;表示无参数类型的单量子逻辑门;格式为量子逻辑门关键字+空格+目标量子比特。示例:
H q[0]
2、单门一个参数型关键字:RX、RY、RZ、U1;表示有一个参数的单量子逻辑门;格式为量子逻辑门关键字+空格+目标量子比特+逗号+(偏转角度)。示例:
RX q[0],(1.570796)
3、 单门两个参数型关键字:U2、RPhi;表示有两个参数的单量子逻辑门;格式为量子逻辑门关键字+空格+目标量子比特+逗号+(两个偏转角度)。示例:
U2 q[0],(1.570796,-3.141593)
4、 单门三个参数型关键字:U3;表示有三个参数的单量子逻辑门;格式为量子逻辑门关键字+空格+目标量子比特+逗号+(三个偏转角度)。示例:
U3 q[0],(1.570796,4.712389,1.570796)
5、单门四个参数关键字:U4;表示有四个参数的单量子逻辑门;格式为量子逻辑门关键字+空格+目标量子比特+逗号+(四个偏转角度)。示例:
U4 q[1],(3.141593,4.712389,1.570796,-3.141593)
6、双门无参数型关键字:CNOT、CZ、ISWAP、SQISWAP、SWAP;表示无参数的双量子逻辑门;格式为量子逻辑门关键字+空格+控制比特+逗号+目标比特。示例:
CNOT q[0],q[1]
7、双门一个参数型关键字:ISWAPTHETA、CR;表示有一个参数的双量子逻辑门;格式为量子逻辑门关键字+空格+控制比特+逗号+目标比特+逗号+(偏转角度)。示例:
CR q[0],q[1],(1.570796)
8、双门四个参数型关键字:CU;表示有四个参数的双量子逻辑门;格式为量子逻辑门关键字+空格+控制比特+逗号+目标比特+逗号+(四个偏转角度)。示例:
CU q[1],q[3],(3.141593,4.712389,1.570796,-3.141593)
9、 三门无参数型关键字:TOFFOLI;表示无参数的三量子逻辑门;格式为量子逻辑门关键字+空格+控制比特1+逗号+控制比特2+逗号+目标比特。示例:
TOFFOLI q[0],q[1],q[2]
转置共轭操作
OriginIR中可以对一个或多个量子逻辑门进行转置共轭操作,OriginIR使用DAGGER和 ENDDAGGER关键字定义转置共轭操作的范围,一个DAGGER必须有一个ENDDAGGER匹配,示例:
DAGGER
H q[0]
CNOT q[0],q[1]
ENDDAGGER
添加控制比特操作
OriginIR中可以对一个或多个量子逻辑门添加控制比特,OriginIR使用CONTROL 和 ENDCONTROL关键字定义添加控制比特的范围,CONTROL后跟空格+控制比特列表;示例:
CONTROL q[2],q[3]
H q[0]
CNOT q[0],q[1]
ENDCONTROL
QIF
OriginIR中可以表示量子条件判断程序,它通过QIF、ELSE、ENDIF框定量子条件判断程序的不同分支的范围。QIF必须匹配一个ENDIF,如果QIF有两个分支则需要有ELSE,如果QIF只有一个分支则不需要有ELSE;QIF后跟空格+判断表达式。示例:
1、QIF只有一个条件分支
QIF c[0]==c[1]
H q[0]
CNOT q[0],q[1]
ENDQIF
2、QIF有两个条件分支
QIF c[0]+c[1]<5
H q[0]
CNOT q[0],q[1]
ELSE
H q[0]
X q[1]
ENDQIF
QWHILE
OriginIR中可以表示量子循环判断程序,它通过QWHILE和ENDQWHILE框定循环判断程序的范围,QWHILE必须匹配一个ENDQWHILE;QWHILE后跟空格+判断表达式。示例:
QWHILE c[0]<5
H q[c[0]]
c[0]=c[0]+1
ENDQWHILE
经典表达式
OriginIR可以在量子程序中嵌入经典表达式,如c[0]==c[1]+c[2];使用示例:
QWHILE c[0]<5
H q[c[0]]
c[0]=c[0]+1
ENDQWHILE
该示例表示对q[0]~q[4]比特做H门操作;经典表达式中必须是经典寄存器和常量组成的表达式;经典表达式的操作符有
{PLUS , "+"},
{MINUS, "-"},
{MUL, "*"},
{DIV, "/"},
{EQUAL, "==" },
{ NE, "!=" },
{ GT, ">" },
{ EGT, ">=" },
{ LT, "<" },
{ ELT, "<=" },
{AND, "&&"},
{OR, "||"},
{NOT, "!"},
{ASSIGN, "=" }
MEASURE操作
MEASURE表示对指定的量子比特进行测量操作,并把结果保存到指定的经典寄存器中。MEASURE后跟空格+目标量子比特+‘,’+目标经典寄存器。示例:
MEASURE q[0],c[0]
如果申请的量子比特和经典寄存器数量相同。可以使用q表示所有量子比特,c表示所有经典比特。示例:
MEASURE q,c
如果量子比特和经典比特数量都为3,则等效为
MEASURE q[0],c[0]
MEASURE q[1],c[1]
MEASURE q[2],c[2]
RESET操作
RESET操作是将操作的量子比特的量子态恢复到0态。格式为RESET+空格+目标量子比特。其中目标量子比特可以是整个量子比特数组或者单个量子比特。 示例:
RESET q
RESET q[1]
BARRIER操作
BARRIER操作是将操作的量子比特进行阻断,防止在线路优化和执行过程。 格式为BARRIER+空格+目标量子比特。其中目标量子比特可以是整个量子比特数组或者单个、多个量子比特。示例:
BARRIER q
BARRIER q[0]
BARRIER q[0],q[1],q[2]
QGATE操作
QGATE为自定义逻辑门操作,可以将多个逻辑门组合成一个新的逻辑门使用。 它通过QGATE和ENDQGATE框定自定义逻辑门的范围。同时需要注意的是,自定义逻辑门的形参名不能与上述相关关键字冲突。示例:
QGATE new_H a
H a
X a
ENDQGATE
new_H q[1]
QGATE new_RX a,(b)
RX a,(PI/2+b)
X a
ENDQGATE
new_RX q[1],(PI/4)
OriginIR程序示例
QPE算法
QINIT 3
CREG 2
H q[2]
H q[0]
H q[1]
CONTROL q[1]
RX q[2],(-3.141593)
ENDCONTROL
CONTROL q[0]
RX q[2],(-3.141593)
RX q[2],(-3.141593)
ENDCONTROL
DAGGER
H q[1]
CR q[0],q[1],(1.570796)
H q[0]
ENDDAGGER
MEASURE q[0],c[0]
MEASURE q[1],c[1]
QPanda2提供了OriginIR转换工具接口 convert_qprog_to_originir
该接口使用非常简单。
- convert_qprog_to_originir(qprog: QProg, machine: QuantumMachine) str
该函数用于将给定的量子程序转化为 OriginIR 格式的字符串,以便于进一步分析和处理。OriginIR 是一个中间表示(IR),用于表示量子程序的信息。
- 参数:
qprog (QProg) -- 要转化的量子程序。
machine (QuantumMachine) -- 用于转化的量子机器。
- 返回:
转化后的 OriginIR 格式的字符串。
- 返回类型:
str
该函数接受一个量子程序和一个量子机器作为参数,然后将给定的量子程序转化为 OriginIR 格式的字符串。
示例用法:
# 创建一个量子机器和一个量子程序 from pyqpanda import * machine = CPUQVM() machine.init_qvm() qprog = QProg() # 将量子程序转化为 OriginIR 格式的字符串 originir_str = convert_qprog_to_originir(qprog, machine) # 打印转化后的 OriginIR 字符串 print(originir_str)
下面的例程通过简单的接口调用演示了量子程序转化OriginIR的过程
from pyqpanda import * if __name__ == "__main__": machine = CPUQVM() machine.init_qvm() qlist = machine.qAlloc_many(4) clist = machine.cAlloc_many(4) prog = QProg() prog_cir = QCircuit() # 构建量子线路 prog_cir << Y(qlist[2]) << H(qlist[2]) << CNOT(qlist[0],qlist[1]) # 构建量子程序 prog << H(qlist[2]) << Measure(qlist[1],clist[1]) # 量子程序转换QriginIR,并打印OriginIR print(convert_qprog_to_originir(prog,machine))
具体步骤如下:
首先在主程序中用
init_quantum_machine
初始化一个量子虚拟机对象,用于管理后续一系列行为接着用
qAlloc_many
和cAlloc_many
初始化量子比特与经典寄存器数目然后调用
create_empty_qprog
构建量子程序最后调用接口
convert_qprog_to_originir
输出OriginIR字符串,并用destroy_quantum_machine
释放系统资源
运行结果如下:
QINIT 4 CREG 4 H q[2] MEASURE q[1],c[1]
备注
对于暂不支持的操作类型,OriginIR会显示UnSupported XXXNode,其中XXX为具体的节点类型。
通过该功能模块,你可以解析OriginIR文本文件,将其中的量子逻辑门操作信息提取出来,得到QPanda 2内部可操作的量子程序。
QPanda 2提供了OriginIR文件转换工具接口 convert_originir_to_qprog
该接口使用非常简单
- convert_originir_to_qprog(file_path: str, machine: QuantumMachine) list
将 OriginIR 指令集转换为量子程序的函数
该函数将 OriginIR 指令集文件转换为量子程序。
- param file_path:
OriginIR 文件的文件路径。
- type file_path:
str
- param machine:
初始化的量子机器。
- type machine:
QuantumMachine
- return:
包含转换后的 QProg、量子比特列表和经典比特列表的列表。
- rtype:
list
- raises run_fail:
转换 OriginIR 到 QProg 失败。
该函数的主要目的是读取给定的 OriginIR 指令集文件,并将其转换为一个 QProg 量子程序。要进行转换的 OriginIR 文件路径需要提供,同时需要提供一个初始化的量子机器。返回的结果列表包含了转换后的 QProg,以及用于 QProg 的量子比特列表和经典比特列表。
示例用法:
# 初始化量子机器 from pyqpanda import * qvm = CPUQVM() qvm.init_qvm() # 转换 OriginIR 文件为 QProg result = convert_originir_to_qprog("path/to/originir/file.ir", qvm) qprog, qubit_list, cbit_list = result
接下来通过简单的接口调用演示了OriginIR转化量子程序的过程
from pyqpanda import * if __name__=="__main__": machine = CPUQVM() machine.init_qvm() # 编写OriginIR文件 f = open('testfile.txt', mode='w',encoding='utf-8') f.write("""QINIT 4 CREG 4 DAGGER X q[1] X q[2] CONTROL q[1], q[2] RY q[0], (1.047198) ENDCONTROL ENDDAGGER MEASURE q[0], c[0] QIF c[0] H q[1] H q[2] RZ q[2], (2.356194) CU q[2], q[3], (3.141593, 4.712389, 1.570796, -1.570796) CNOT q[2], q[1] ENDQIF""") f.close() # OriginIR转换量子程序, 返回转换后的量子程序、量子程序使用的量子比特以及经典寄存器 prog, qv, cv = convert_originir_to_qprog("testfile.txt", machine) # 量子程序转换OriginIR,打印并对比转换结果 print(convert_qprog_to_originir(prog,machine))
具体步骤如下:
首先编写OriginIR,并将其保存到指定文件中
接着在主程序中用
init_quantum_machine
初始化一个量子虚拟机对象,用于管理后续一系列行为然后调用
convert_originir_to_qprog
接口将OriginIR转换为量子程序最后调用
convert_qprog_to_originir
接口,把量子程序转为OriginIR,通过比较输入和生成的OriginIR是否相同,判断OriginIR是否正确转换成量子程序,并且用destroy_quantum_machine
释放系统资源
运行结果如下:
QINIT 4 CREG 4 DAGGER X q[1] X q[2] CONTROL q[1],q[2] RY q[0],(1.047198) ENDCONTROL ENDDAGGER MEASURE q[0],c[0] QIF c[0] H q[1] ELSE H q[2] RZ q[2],(2.356194) CU q[2],q[3],(3.141593,4.712389,1.570796,-1.570796) CNOT q[2],q[1] ENDQIF
备注
对于暂不支持的操作类型,可能会在OriginIR转化成量子程序的过程中发生错误。
QASM(Quantum Assembly Language)是IBM公司提出的量子汇编语言,与 QRunes介绍 中的语法规则类似,一段QASM代码如下所示:
OPENQASM 2.0; include "qelib1.inc"; qreg q[10]; creg c[10]; x q[0]; h q[1]; tdg q[2]; sdg q[2]; cx q[0],q[2]; cx q[1],q[4]; u1(pi) q[0]; u2(pi,pi) q[1]; u3(pi,pi,pi) q[2]; cz q[2],q[5]; ccx q[3],q[4],q[6]; cu3(pi,pi,pi) q[0],q[1]; measure q[2] -> c[2]; measure q[0] -> c[0];
需要注意的是,QASM的语法格式与QRunes形相似而神不同,主要区别有以下几点:
QRunes对于需要进行转置共轭操作的量子逻辑门与量子线路,需要将目标置于DAGGER与ENDAGGER语句之间,而QASM会直接进行转化。
QRunes支持对量子逻辑门与量子线路施加控制操作,而QASM不支持,在对量子程序转化QASM指令集之前,会对其中包含的控制操作进行分解。
QPanda2提供了QASM转换工具接口 convert_qprog_to_qasm
该接口使用非常简单。
- convert_qprog_to_qasm(qprog: QProg, machine: QuantumMachine) str
该函数将给定的量子程序转换为 QASM 指令字符串。QASM 是一种用于描述量子程序的文本格式,可以用于与其他量子计算平台进行交互和兼容。
- 参数:
qprog (QProg) -- 要转换的量子程序。
machine (QuantumMachine) -- 用于转换的量子机器。
- 返回:
存储转换后 QASM 指令的字符串。
- 返回类型:
str
- 抛出:
run_fail -- 转换量子程序为 QASM 失败。
示例用法:
# 创建一个量子机器 from pyqpanda import * qvm = CPUQVM() qvm.init_qvm() # 创建一个量子程序 prog = QProg() # 将量子程序转换为 QASM 指令字符串 qasm_string = convert_qprog_to_qasm(prog, qvm)
下面的例程通过简单的接口调用演示了量子程序转化QASM指令集的过程
from pyqpanda import * if __name__ == "__main__": qvm = CPUQVM() qvm.init_qvm() q = qvm.qAlloc_many(6) c = qvm.cAlloc_many(6) prog = QProg() cir = QCircuit() cir << T(q[0]) << S(q[1]) << CNOT(q[1], q[0]) prog << cir prog << X(q[0]) << Y(q[1]) << CU(1.2345, 3, 4, 5, q[5], q[2])\ << H(q[2]) << RX(q[3], 3.14)\ << Measure(q[0], c[0]) qasm = convert_qprog_to_qasm(prog, qvm) print(qasm) qvm.finalize()
具体步骤如下:
首先在主程序中用
init_quantum_machine
初始化一个量子虚拟机对象,用于管理后续一系列行为。接着用
qAlloc_many
和cAlloc_many
初始化量子比特与经典寄存器数目。然后调用
QProg
构建量子程序。最后调用接口
convert_qprog_to_qasm
输出QASM指令集。finalize()
用于释放系统资源。
运行结果如下:
OPENQASM 2.0; include "qelib1.inc"; qreg q[6]; creg c[6]; u3(0,0.78539816339744828,0) q[0]; u3(0,1.5707963267948966,0) q[1]; cx q[1],q[0]; u3(3.1415926535897931,0,3.1415926535897931) q[0]; u3(3.1415926535897931,0,0) q[1]; u3(0,-0.33629632679489674,0) q[5]; u3(1.5707963267948968,0,2.4689999999999994) q[2]; cz q[5],q[2]; u3(0.33629632679489924,-1.5707963267948966,1.5707963267948966) q[2]; cz q[5],q[2]; u3(1.1586360625022274,0.30011082466761058,-0.12333631564044467) q[2]; u3(0,1.5707963267948963,0) q[5]; cz q[5],q[2]; u3(1.4173486819813736,2.7391542832240892,-1.915529794610245) q[2]; cz q[5],q[2]; u3(1.8052963267948967,-1.5707963267948966,1.5707963267948966) q[2]; u3(3.1400000000000001,-1.5707963267948966,1.5707963267948966) q[3]; measure q[0] -> c[0];
Quil
简介
X 0
Y 1
CNOT 0 1
H 0
RX(-3.141593) 0
MEASURE 1 [0]
X
的作用是对目标量子比特进行Pauli-X
门操作。与之类似的关键词有Y
、Z
、H
等等。Y
的作用是对目标量子比特进行Pauli-Y
门操作。CNOT
的作用是对两个量子比特执行CNOT
操作。输入参数为控制量子比特序号和目标量子比特序号。H
的作用是对目标量子比特进行Hadamard
门操作。MEASURE
的作用对目标量子比特进行测量并将测量结果保存在对应的经典寄存器里面,输入参数为目标量子比特序号和保存测量结果的经典寄存器序号。
上述仅为Quil指令集语法的一小部分, 详细介绍请参考 pyQuil 。
接口介绍
- convert_qprog_to_quil(qprog: QProg, machine: QuantumMachine) str
将 QProg 转换为 Quil 指令字符串
该函数用于将QProg转化为 Quil(Quantum Instruction Language)指令字符串。Quil 是一种量子程序语言,用于描述量子线路的操作和演化。
- param qprog:
要转换的 Quantum Program(QProg)。
- type qprog:
QProg
- param machine:
量子计算机实例,用于提供上下文环境。
- type machine:
QuantumMachine
- return:
Quil 指令字符串。
- rtype:
str
示例用法:
quil_code = convert_qprog_to_quil(qprog, machine) # 将 QProg 转化为 Quil 指令字符串
我们先用pyqpanda构建一个量子程序:
prog = QProg() prog << X(qubits[0]) << Y(qubits[1])\ << H(qubits[2]) << RX(qubits[3], 3.14)\ << Measure(qubits[0], cbits[0])
然后调用 convert_qprog_to_quil
接口实现转化
quil = convert_qprog_to_quil(prog, qvm)
实例
from pyqpanda import * if __name__ == "__main__": qvm = CPUQVM() qvm.init_qvm() qubits = qvm.qAlloc_many(4) cbits = qvm.cAlloc_many(4) prog = QProg() # 构建量子程序 prog << X(qubits[0]) << Y(qubits[1])\ << H(qubits[2]) << RX(qubits[3], 3.14)\ << Measure(qubits[0], cbits[0]) # 量子程序转换Quil, 并打印Quil quil = convert_qprog_to_quil(prog, qvm) print(quil)
运行结果:
DECLARE ro BIT[1] X 0 Y 1 H 2 RX(3.140000) 3 MEASURE 0 ro[0]
QASMToQProg
简介
通过该功能模块,可以解析QASM文本文件(或者字符串),将其中的量子逻辑门操作信息提取出来,得到QPanda 2内部可操作的量子程序。
接口介绍
QPanda 2提供了QASM文件转换工具接口 convert_qasm_to_qprog
。
- convert_qasm_to_qprog(file_path: str, machine: QuantumMachine) list:
该函数的作用是从给定的 QASM 文件中读取指令集并将其转换为量子程序,同时需要提供一个已初始化的量子机器实例。
- 参数:
file_path (str) -- QASM 文件路径。
machine (QuantumMachine) -- 已初始化的量子机器实例。
- 返回:
包含转换后的 QProg、量子比特列表和经典比特列表的列表。
- 返回类型:
list
- 抛出:
run_fail -- QASM 转换为 QProg 失败。
返回的列表包含了转换后的 QProg 以及与之关联的量子比特列表和经典比特列表。您可以根据需要进一步操作这些信息,例如执行量子程序、获取测量结果等。
示例用法:
from pyqpanda.pyQPanda import QMachineType,destroy_quantum_machine, init_quantum_machine from pyqpanda.pyQPanda import convert_qasm_to_qprog #########################准备包含QASM指令字符串的文件 qasm_file = "testfile.txt" f = open(qasm_file, mode='w', encoding='utf-8') f.write("""OPENQASM 3.0; include "stdgates.inc"; qubit[4] q; bit[2] c; rx(3.14) q[0]; phase(3.18) q[0]; c[0] = measure q[0]; c[1] = measure q[1]; """) f.close() #######################准备计算资源 machine = init_quantum_machine(QMachineType.CPU) #######################根据包含QASM指令字符串的文件生成QProg实例 qprog, qbits, cbits = convert_qasm_to_qprog(qasm_file,machine) # 打印转换结果 print("qprog:",end='\n') print(qprog,end='\n') print("qbits:",end='\n') print(qbits) print("cbits:",end='\n') print(cbits) #######################释放计算资源 destroy_quantum_machine(machine)
示例代码输出结果:
### opened qasm file:testfile.txt qprog: ┌────────────┐ ┌───────────┐ ┌─┐ q_0: |0>─┤RX(3.140000)├ ┤P(3.180000)├ ─┤M├ └┬─┬─────────┘ └───────────┘ └╥┘ q_1: |0>──┤M├────────── ───────────── ──╫─ └╥┘ ║ c : / ═══╩════════════════════════════╩═ 1 0 qbits: [<pyqpanda.pyQPanda.Qubit object at 0x000001553FF218B0>, <pyqpanda.pyQPanda.Qubit object at 0x000001553FF21870>, <pyqpanda.pyQPanda.Qubit object at 0x000001553FF21D30>, <pyqpanda.pyQPanda.Qubit object at 0x000001553FF4FAB0>] cbits: [<pyqpanda.pyQPanda.ClassicalCondition object at 0x0000015571C8E4B0>, <pyqpanda.pyQPanda.ClassicalCondition object at 0x0000015571C5BCB0>]
QPanda 2提供了QASM指令字符串转换工具接口 convert_qasm_string_to_qprog
。
- convert_qasm_string_to_qprog(qasm_str: str, machine: QuantumMachine) list:
该函数的作用是从给定的 QASM 文件中读取指令集并将其转换为量子程序,同时需要提供一个已初始化的量子机器实例。
- 参数:
qasm_str (str) -- QASM指令字符串
machine (QuantumMachine) -- 已初始化的量子机器实例。
- 返回:
包含转换后的 QProg、量子比特列表和经典比特列表的列表。
- 返回类型:
list
- 抛出:
run_fail -- QASM 转换为 QProg 失败。
返回的列表包含了转换后的 QProg 以及与之关联的量子比特列表和经典比特列表。您可以根据需要进一步操作这些信息,例如执行量子程序、获取测量结果等。
示例用法:
from pyqpanda.pyQPanda import QMachineType,destroy_quantum_machine, init_quantum_machine from pyqpanda.pyQPanda import convert_qasm_string_to_qprog #########################准备包含QASM指令字符串 qasm_str = """OPENQASM 3.0; include "stdgates.inc"; qubit[4] q; bit[2] c; rx(3.14) q[0]; phase(3.18) q[0]; c[0] = measure q[0]; c[1] = measure q[1]; """ #######################准备计算资源 machine = init_quantum_machine(QMachineType.CPU) #######################根据包含QASM指令字符串的文件生成QProg实例 qprog, qbits, cbits = convert_qasm_string_to_qprog(qasm_str,machine) # 打印转换结果 print("qprog:",end='\n') print(qprog,end='\n') print("qbits:",end='\n') print(qbits) print("cbits:",end='\n') print(cbits) #######################释放计算资源 destroy_quantum_machine(machine)
示例代码输出结果:
qprog: ┌────────────┐ ┌───────────┐ ┌─┐ q_0: |0>─┤RX(3.140000)├ ┤P(3.180000)├ ─┤M├ └┬─┬─────────┘ └───────────┘ └╥┘ q_1: |0>──┤M├────────── ───────────── ──╫─ └╥┘ ║ c : / ═══╩════════════════════════════╩═ 1 0 qbits: [<pyqpanda.pyQPanda.Qubit object at 0x000001A3AF6614B0>, <pyqpanda.pyQPanda.Qubit object at 0x000001A3AF661570>, <pyqpanda.pyQPanda.Qubit object at 0x000001A3AF6615F0>, <pyqpanda.pyQPanda.Qubit object at 0x000001A3AF6615B0>] cbits: [<pyqpanda.pyQPanda.ClassicalCondition object at 0x000001A3E0F068B0>, <pyqpanda.pyQPanda.ClassicalCondition object at 0x000001A3C8E72D70>]
QASMToOriginIR
简介
通过该功能模块,可以解析QASM文本文件(或者字符串),将其中的量子逻辑门操作信息提取出来,得到OriginIR的指令字符串。
接口介绍
QPanda 2提供了QASM字符串转换工具接口 convert_qasm_string_to_originir
。
- convert_qasm_string_to_originir(qasm_str: str) str:
该函数的作用是根据给定的QASM指令字符串生成对应的OriginIR指令字符串
- 参数:
qasm_str (str) -- QASM指令字符串
- 返回:
转换得到的OriginIR指令字符串
- 返回类型:
str
示例用法:
from pyqpanda.pyQPanda import convert_qasm_string_to_originir #准备qasm指令字符串 qasm_str = """OPENQASM 3.0; include "stdgates.inc"; qubit[4] q; bit[2] c; rx(3.14) q[0]; phase(3.18) q[0]; c[0] = measure q[0]; c[1] = measure q[1]; """ #根据qasm指令字符串生成OriginIR指令字符串 originir_str = convert_qasm_string_to_originir(qasm_str=qasm_str) #打印生成的OriginIR指令字符串 print(originir_str)
示例代码输出结果:
QINIT 4 CREG 2 RX q[0],(3.14) P q[0],(3.18) MEASURE q[0],c[0] MEASURE q[1],c[1]
QPanda 2提供了QASM文件转换工具接口 convert_qasm_to_originir
。
- convert_qasm_to_originir(file_path: str) str:
该函数的作用是根据给定的QASM指令字符串生成对应的OriginIR指令字符串
- 参数:
file_path (str) -- 存储QASM指令字符串的文件
- 返回:
转换得到的OriginIR指令字符串
- 返回类型:
str
示例用法:
from pyqpanda.pyQPanda import QMachineType, convert_qasm_to_originir, init_quantum_machine #########################准备包含QASM指令字符串的文件 qasm_file = "test.qasm" f = open(qasm_file, mode='w', encoding='utf-8') f.write("""OPENQASM 3.0; include "stdgates.inc"; qubit[4] q; bit[2] c; rx(3.14) q[0]; phase(3.18) q[0]; c[0] = measure q[0]; c[1] = measure q[1]; """) f.close() #######################根据包含QASM指令字符串的文件生成OriginIR指令字符串 originir_str = convert_qasm_to_originir(qasm_file) #######################打印结果 print( originir_str)
示例代码输出结果:
### opened qasm file:test.qasm QINIT 4 CREG 2 RX q[0],(3.14) P q[0],(3.18) MEASURE q[0],c[0] MEASURE q[1],c[1]
PyquilToOriginIR
简介
通过该功能模块,可以解析Pyquil文本文件(或者字符串),将其中的量子逻辑门操作信息提取出来,得到OriginIR的指令字符串。
接口介绍
QPanda 2提供了Pyquil字符串转换工具接口 convert_pyquil_string_to_originir
。
- convert_pyquil_string_to_originir(pyquil_str: str) str:
该函数的作用是根据给定的pyquil指令字符串生成对应的OriginIR指令字符串
- 参数:
pyquil_str (str) -- pyquil指令字符串
- 返回:
转换得到的OriginIR指令字符串
- 返回类型:
str
示例用法:
from pyqpanda.pyQPanda import init_quantum_machine,QMachineType,destroy_quantum_machine,convert_pyquil_string_to_originir # 定义Pyquil指令字符串 pyquil_str = """DECLARE ro BIT[2] SWAP 0 1 H 0 """ #########################将包含Pyquil指令字符串的文件转换为OriginIR指令字符串 # 将 Pyquil 文件转换为 OriginIR指令字符串 originir_str =convert_pyquil_string_to_originir(pyquil_str) # 打印转换结果 print(originir_str)
示例代码运行结果:
QINIT 2 CREG 3 SWAP q[0],q[1] H q[0]
QPanda 2提供了pyquil文件转换工具接口 convert_pyquil_file_to_originir
。
- convert_pyquil_file_to_originir(file_path: str) str:
该函数的作用是根据给定的Pyquil指令字符串生成对应的OriginIR指令字符串
- 参数:
file_path (str) -- 存储Pyquil指令字符串的文件
- 返回:
转换得到的OriginIR指令字符串
- 返回类型:
str
示例用法:
from pyqpanda.pyQPanda import init_quantum_machine,QMachineType,destroy_quantum_machine,convert_pyquil_file_to_originir #########################准备包含Pyquil指令字符串的文件 # 定义Pyquil指令字符串 pyquil_str = """DECLARE ro BIT[2] SWAP 0 1 H 0 """ # 创建包含Pyquil指令字符串的文件 pyquil_file = "example.pyquil" with open(pyquil_file, "w") as file: # 将字符串写入文件 file.write(pyquil_str) #########################将包含Pyquil指令字符串的文件转换为OriginIR指令字符串 # 将 Pyquil 文件转换为 OriginIR指令字符串 originir_str = convert_pyquil_file_to_originir(pyquil_file) # 打印转换结果 print(originir_str)
示例代码运行结果:
QINIT 2 CREG 3 SWAP q[0],q[1] H q[0]
PyquilToQProg
简介
通过该功能模块,可以解析Pyquil文本文件(或者字符串),将其中的量子逻辑门操作信息提取出来,得到QPanda 2内部可操作的量子程序。
接口介绍
QPanda 2提供了Pyquil文件转换工具接口 convert_pyquil_file_to_qprog
。
- convert_pyquil_file_to_qprog(file_path: str, machine: QuantumMachine) list:
该函数的作用是从给定的 Pyquil 文件中读取指令集并将其转换为量子程序,同时需要提供一个已初始化的量子机器实例。
- 参数:
file_path (str) -- Pyquil 文件路径。
machine (QuantumMachine) -- 已初始化的量子机器实例。
- 返回:
包含转换后的 QProg、量子比特列表和经典比特列表的列表。
- 返回类型:
list
- 抛出:
run_fail -- Pyquil转换为 QProg 失败。
返回的列表包含了转换后的 QProg 以及与之关联的量子比特列表和经典比特列表。您可以根据需要进一步操作这些信息,例如执行量子程序、获取测量结果等。
示例用法:
from pyqpanda.pyQPanda import init_quantum_machine,QMachineType,destroy_quantum_machine,convert_pyquil_file_to_qprog #########################准备包含Pyquil指令字符串的文件 # 定义Pyquil指令字符串 pyquil_str = """DECLARE ro BIT[1] DECLARE theta REAL[2] SWAP 0 1 H 0 """ # 创建包含Pyquil指令字符串的文件 pyquil_file = "example.pyquil" with open(pyquil_file, "w") as file: # 将字符串写入文件 file.write(pyquil_str) #########################将包含Pyquil指令字符串的文件转换为QProg # 初始化 QuantumMachine 实例 machine = init_quantum_machine(QMachineType.CPU) # 将 Pyquil 文件转换为 QProg qprog, qbits, cbits = convert_pyquil_file_to_qprog(pyquil_file,machine) # 打印转换结果 print("qprog:",end='\n') print(qprog,end='\n') print("qbits:",end='\n') print(qbits) print("cbits:",end='\n') print(cbits) # 销毁 QuantumMachine 实例 destroy_quantum_machine(machine)
示例代码运行结果:
qprog: ┌─┐ q_0: |0>─X ┤H├ │ └─┘ q_1: |0>─X ─── c : / ═ qbits: [<pyqpanda.pyQPanda.Qubit object at 0x00000229BB8915B0>, <pyqpanda.pyQPanda.Qubit object at 0x00000229BB891570>] cbits: [<pyqpanda.pyQPanda.ClassicalCondition object at 0x00000229ED0E42F0>, <pyqpanda.pyQPanda.ClassicalCondition object at 0x00000229ED1BE270>, <pyqpanda.pyQPanda.ClassicalCondition object at 0x00000229ED1DA230>, <pyqpanda.pyQPanda.ClassicalCondition object at 0x00000229ED0D32F0>]
QPanda 2提供了Pyquil字符串转换工具接口 convert_pyquil_string_to_qprog
。
- convert_pyquil_string_to_qprog(pyquil_str: str, machine: QuantumMachine) list:
该函数的作用是从给定的 Pyquil 文件中读取指令集并将其转换为量子程序,同时需要提供一个已初始化的量子机器实例。
- 参数:
pyquil_str (str) -- Pyquil 文件路径。
machine (QuantumMachine) -- 已初始化的量子机器实例。
- 返回:
包含转换后的 QProg、量子比特列表和经典比特列表的列表。
- 返回类型:
list
- 抛出:
run_fail -- Pyquil转换为 QProg 失败。
返回的列表包含了转换后的 QProg 以及与之关联的量子比特列表和经典比特列表。您可以根据需要进一步操作这些信息,例如执行量子程序、获取测量结果等。
示例用法:
from pyqpanda.pyQPanda import init_quantum_machine,convert_pyquil_string_to_qprog,QMachineType,destroy_quantum_machine # 定义pyquil指令字符串 pyquil_str = """DECLARE ro BIT[1] DECLARE theta REAL[2] SWAP 0 1 H 0 """ # 初始化 QuantumMachine 实例 machine = init_quantum_machine(QMachineType.CPU) # 将 Pyquil 文件转换为 QProg qprog, qbits, cbits = convert_pyquil_string_to_qprog(pyquil_str,machine) # 打印转换结果 print("qprog:",end='\n') print(qprog,end='\n') print("qbits:",end='\n') print(qbits) print("cbits:",end='\n') print(cbits) # 销毁 QuantumMachine 实例 destroy_quantum_machine(machine)
示例代码运行结果:
qprog: ┌─┐ q_0: |0>─X ┤H├ │ └─┘ q_1: |0>─X ─── c : / ═ qbits: [<pyqpanda.pyQPanda.Qubit object at 0x0000025B871313F0>, <pyqpanda.pyQPanda.Qubit object at 0x0000025B871314B0>] cbits: [<pyqpanda.pyQPanda.ClassicalCondition object at 0x0000025B87131830>, <pyqpanda.pyQPanda.ClassicalCondition object at 0x0000025BB8C89EF0>, <pyqpanda.pyQPanda.ClassicalCondition object at 0x0000025BB898BFB0>, <pyqpanda.pyQPanda.ClassicalCondition object at 0x0000025BB897EBF0>]