catalyst.passes.decompose_arbitrary_ppr

decompose_arbitrary_ppr(qnode)[source]

Specify that the MLIR compiler pass for decomposing arbitrary Pauli product rotations (PPR) operations will be applied. This will decompose into a collection of PPRs, PPMs and a single-qubit arbitrary PPR in the Z basis. For more details, see Figure 13(d) in arXiv:2211.15465.

Note

For improved integration with the PennyLane frontend, including inspectability with pennylane.specs(), please use pennylane.transforms.decompose_arbitrary_ppr().

The decompose_arbitrary_ppr compilation pass requires that to_ppr() be applied first.

Parameters:

qnode (QNode) – QNode to apply the pass to.

Returns:

~.QNode

Example

import pennylane as qml


@qml.qjit(pipelines=[("pipe", ["quantum-compilation-stage"])], target="mlir")
@qml.transforms.decompose_arbitrary_ppr
@qml.transforms.to_ppr
@qml.qnode(qml.device("null.qubit", wires=3))
def circuit():
    qml.PauliRot(0.123, pauli_word="XXY", wires=[0, 1, 2])
    return
>>> print(circuit.mlir_opt)
...
%5 = qec.prepare  plus %4 : !quantum.bit
%mres, %out_qubits:4 = qec.ppm ["X", "X", "Y", "Z"] %1, %2, %3, %5 : !quantum.bit, !quantum.bit, !quantum.bit, !quantum.bit
%6 = qec.ppr ["X"](2) %out_qubits#3 cond(%mres) : !quantum.bit
%7 = qec.ppr.arbitrary ["Z"](%cst) %6 : !quantum.bit
%mres_0, %out_qubits_1 = qec.ppm ["X"] %7 : !quantum.bit
%8:3 = qec.ppr ["X", "X", "Y"](2) %out_qubits#0, %out_qubits#1, %out_qubits#2 cond(%mres_0) : !quantum.bit, !quantum.bit, !quantum.bit
...