导入工作流¶
PennyLane 支持导入使用其他框架构建的量子电路和操作。这包括使用 Qiskit、OpenQASM 和 Quil 定义的电路。
注意
要导入使用特定框架定义的量子电路,您需要安装该框架对应的PennyLane插件。有关PennyLane插件的更多信息,请访问plugins页面。
导入量子电路¶
导入量子电路可以帮助您利用PennyLane的各种优化、可视化和与现有电路的互操作性特性。例如,您可以从QuantumCircuit中导入Qiskit,将其导入PennyLane,然后应用circuit-cutting transform来减少实现电路所需的量子位数量。您还可以使用compile电路,或者使用quantum-specific optimizers对电路进行求导和优化。
通过使用PennyLane-Rigetti插件中的转换器加载pyQuil程序对象。 |
|
使用PennyLane-Qiskit插件中的转换器从QASM字符串加载量子电路。 |
|
将Qiskit QuantumCircuit 转换为PennyLane 量子函数。 |
|
使用PennyLane-Rigetti插件中的转换器,从Quil字符串加载量子电路。 |
|
使用PennyLane-Rigetti插件中的转换器从Quil文件加载量子电路。 |
Qiskit¶
假设我们定义一个 Qiskit QuantumCircuit 如下:
from qiskit import QuantumCircuit
qk_circuit = QuantumCircuit(2, 1)
qk_circuit.h(0)
qk_circuit.cx(0, 1)
我们可以将 QuantumCircuit 转换为一个 PennyLane 量子函数 使用:
import pennylane as qml
pl_qfunc_from_qk = qml.from_qiskit(qk_circuit)
注意
必须安装PennyLane-Qiskit插件才能使用from_qiskit()函数。
这个量子函数可以在QNode内部被调用以生成一个PennyLane电路:
@qml.qnode(qml.device("default.qubit"))
def pl_circuit_from_qk():
pl_qfunc_from_qk(wires=[0, 1])
return qml.expval(qml.Y(0)), qml.var(qml.Z(1))
注意
或者,QNode可以直接从Qiskit电路实例化:
measurements = [qml.expval(qml.Y(0)), qml.var(qml.Z(1))]
pl_qfunc_from_qk = qml.from_qiskit(qk_circuit, measurements=measurements)
pl_circuit_from_qk = qml.QNode(pl_qfunc_from_qk, qml.device("default.qubit"))
在这里,measurements 参数覆盖 Qiskit 电路中的任何终端测量。有关更多细节,请参见from_qiskit() 文档。
生成的PennyLane电路可以直接执行:
>>> pl_circuit_from_qk()
[tensor(0., requires_grad=True), tensor(1., requires_grad=True)]
它也可以使用 PennyLane 的 draw() 工具进行可视化:
>>> print(qml.draw(pl_circuit_from_qk)())
0: ──H─╭●─┤ <Y>
1: ────╰X─┤ Var[Z]
OpenQASM¶
等效的量子电路可以用OpenQASM 2.0表示如下:
oq_circuit = (
"""
OPENQASM 2.0;
include "qelib1.inc";
qreg q[2];
creg c[2];
h q[0];
cx q[0], q[1];
"""
)
我们可以再次使用PennyLane-Qiskit插件将这个电路导入到Pennylane中:
import pennylane as qml
pl_qfunc_from_oq = qml.from_qasm(oq_circuit)
@qml.qnode(qml.device("default.qubit"))
def pl_circuit_from_oq():
pl_qfunc_from_oq(wires=[0, 1])
return qml.expval(qml.Y(0)), qml.var(qml.Z(1))
结果如下:
>>> print(qml.draw(pl_circuit_from_oq)())
0: ──H─╭●─┤ <Y>
1: ────╰X─┤ Var[Z]
量子指令语言¶
PennyLane还提供了从pyQuil或Quil表示导入电路的便利函数。这两者都需要PennyLane-Rigetti插件。
我们从一个熟悉的 pyQuil Program 开始:
import pyquil
pq_program = pyquil.Program()
pq_program += pyquil.gates.H(0)
pq_program += pyquil.gates.CNOT(0, 1)
该 Program 可通过 from_pyquil() 函数转换为一个PennyLane量子函数:
import pennylane as qml
pl_qfunc_from_pq = qml.from_pyquil(pq_program)
@qml.qnode(qml.device("default.qubit"))
def pl_circuit_from_pq():
pl_qfunc_from_pq(wires=[0, 1])
return qml.expval(qml.Y(0)), qml.var(qml.Z(1))
生成的PennyLane电路是:
>>> print(qml.draw(pl_circuit_from_pq)())
0: ──H─╭●─┤ <Y>
1: ────╰X─┤ Var[Z]
注意
以Quil表示的量子电路可以通过类似的方式导入,使用
from_quil()。
导入量子算子¶
除了电路,它还可以将其他框架中定义的算子导入到PennyLane。这对于涉及计算可观察量期望值的工作流程非常有用。通过映射到PennyLane,我们可以保持工作流程的可微性,同时保留硬件高效执行的分组等特性。
将Qiskit SparsePauliOp转换为PennyLane |
目前,只有 Qiskit SparsePauliOp 操作符可以被导入到 PennyLane。为了演示这一点,我们首先定义一个 SparsePauliOp:
from qiskit.quantum_info import SparsePauliOp
qk_op = SparsePauliOp(["II", "XY"])
然后,我们应用 from_qiskit_op() 函数将 SparsePauliOp 转换为一个 PennyLane Operator:
import pennylane as qml
pl_op = qml.from_qiskit_op(qk_op)
我们可以检查这两个算子以确保它们匹配:
>>> qk_op
SparsePauliOp(['II', 'XY'],
coeffs=[1.+0.j, 1.+0.j])
>>> pl_op
I(0) + X(1) @ Y(0)