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
import catalyst

p = [("my_pipe", ["quantum-compilation-stage"])]

@qml.qjit(pipelines=p, target="mlir")
@catalyst.passes.decompose_arbitrary_ppr
@catalyst.passes.to_ppr
@qml.qnode(qml.device("null.qubit", wires=3))
def circuit():
    qml.PauliRot(0.123, pauli_word="XXY", wires=[0, 1, 2])
    return catalyst.measure(0), catalyst.measure(1), catalyst.measure(2)

Because Catalyst does not currently support execution of Pauli-based computation operations, we must halt the pipeline after quantum-compilation-stage. This ensures that only the quantum passes will be applied to the initial MLIR, without attempting to further compile for execution.

>>> print(circuit.mlir_opt)
...
%out_qubits = quantum.custom "Hadamard"() %1 : !quantum.bit
%2 = quantum.extract %0[ 1] : !quantum.reg -> !quantum.bit
%out_qubits_2 = quantum.custom "Hadamard"() %2 : !quantum.bit
%3 = quantum.extract %0[ 2] : !quantum.reg -> !quantum.bit
%out_qubits_3 = quantum.custom "RX"(%cst_1) %3 : !quantum.bit
%out_qubits_4:3 = quantum.multirz(%cst_0) %out_qubits, %out_qubits_2, %out_qubits_3 : !quantum.bit, !quantum.bit, !quantum.bit
%out_qubits_5 = quantum.custom "Hadamard"() %out_qubits_4#0 : !quantum.bit
%mres, %out_qubit = quantum.measure %out_qubits_5 : i1, !quantum.bit
%from_elements = tensor.from_elements %mres : tensor<i1>
%out_qubits_6 = quantum.custom "Hadamard"() %out_qubits_4#1 : !quantum.bit