qml.single_tape_transform

class single_tape_transform(transform_fn)[source]

Bases: object

For registering a tape transform that takes a tape and outputs a single new tape.

Examples of such transforms include circuit compilation.

Parameters

transform_fn (function) – The function to register as the single tape transform. It can have an arbitrary number of arguments, but the first argument must be the input tape.

Example

A valid single tape transform is a quantum function that satisfies the following:

  • The first argument must be an input tape

  • Depending on the structure of this input tape, various quantum operations, functions, and templates may be called.

  • Any internal classical processing should use the qml.math module to ensure the transform is differentiable.

  • There is no return statement.

For example:

@qml.single_tape_transform
def my_transform(tape, x, y):
    # loop through all operations on the input tape
    for op in tape.operations + tape.measurements:
        if op.name == "CRX":
            wires = op.wires
            param = op.parameters[0]

            qml.RX(x * qml.math.abs(param), wires=wires[1])
            qml.RY(y * qml.math.abs(param), wires=wires[1])
            qml.CZ(wires=[wires[1], wires[0]])
        else:
            op.queue()

This transform iterates through the input tape, and replaces any CRX operation with two single qubit rotations and a CZ operation. These newly queued operations will form the output transformed tape.

We can apply this transform to a quantum tape:

>>> with qml.tape.JacobianTape() as tape:
...     qml.Hadamard(wires=0)
...     qml.CRX(-0.5, wires=[0, 1])
>>> new_tape = my_transform(tape, 1., 2.)
>>> print(new_tape.draw())
 0: ──H───────────────╭Z──┤
 1: ──RX(0.5)──RY(1)──╰C──┤