导入工作流

PennyLane 支持导入使用其他框架构建的量子电路和操作。这包括使用 QiskitOpenQASMQuil 定义的电路。

注意

要导入使用特定框架定义的量子电路,您需要安装该框架对应的PennyLane插件。有关PennyLane插件的更多信息,请访问plugins页面。

导入量子电路

导入量子电路可以帮助您利用PennyLane的各种优化、可视化和与现有电路的互操作性特性。例如,您可以从QuantumCircuit中导入Qiskit,将其导入PennyLane,然后应用circuit-cutting transform来减少实现电路所需的量子位数量。您还可以使用compile电路,或者使用quantum-specific optimizers对电路进行求导和优化。

from_pyquil

通过使用PennyLane-Rigetti插件中的转换器加载pyQuil程序对象。

from_qasm

使用PennyLane-Qiskit插件中的转换器从QASM字符串加载量子电路。

from_qiskit

将Qiskit QuantumCircuit 转换为PennyLane 量子函数

from_quil

使用PennyLane-Rigetti插件中的转换器,从Quil字符串加载量子电路。

from_quil_file

使用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,我们可以保持工作流程的可微性,同时保留硬件高效执行的分组等特性。

from_qiskit_op

将Qiskit SparsePauliOp转换为PennyLane Operator

目前,只有 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)