qml.simplify

simplify(input: Union[pennylane.operation.Operator, pennylane.measurements.MeasurementProcess, pennylane.tape.tape.QuantumTape, pennylane.qnode.QNode, Callable])[source]

Simplifies an operator, tape, qnode or quantum function by reducing its arithmetic depth or number of rotation parameters.

Parameters

input (Operator, pennylane.QNode, QuantumTape, or Callable) – an operator, quantum node, tape or function that applies quantum operations

Returns

Simplified input.

Return type

(Operator, pennylane.QNode, QuantumTape, or Callable)

Example

Given an instantiated operator, qml.simplify reduces the operator’s arithmetic depth:

>>> op = qml.adjoint(qml.RX(0.54, wires=0) + qml.PauliX(0) + qml.PauliZ(1))
>>> op.arithmetic_depth
3
>>> sim_op = qml.simplify(op)
>>> sim_op.arithmetic_depth
2
>>> type(sim_op)
pennylane.ops.op_math.sum.Sum
>>> sim_op.operands
(Adjoint(RX)(0.54, wires=[0]),
Adjoint(PauliX)(wires=[0]),
Adjoint(PauliZ)(wires=[1]))

This function can also simplify the number of rotation gate parameters:

>>> qml.simplify(qml.Rot(np.pi / 2, 0.1, -np.pi / 2, wires=0))
RX(0.1, wires=[0])

Both types of simplification occur together:

>>> op = qml.adjoint(qml.U2(-np.pi/2, np.pi/2, wires=0) + qml.PauliX(0))
>>> op
Adjoint(Sum)([-1.5707963267948966, 1.5707963267948966], [], wires=[0])
>>> qml.simplify(op)
Adjoint(RX)(1.5707963267948966, wires=[0]) + Adjoint(PauliX)(wires=[0])

Moreover, qml.simplify can be used to simplify QNodes or quantum functions:

>>> dev = qml.device("default.qubit", wires=2)
>>> @qml.simplify
    @qml.qnode(dev)
    def circuit():
        qml.adjoint(qml.prod(qml.RX(1, 0) ** 1, qml.RY(1, 0), qml.RZ(1, 0)))
        return qml.probs(wires=0)
>>> circuit()
tensor([0.64596329, 0.35403671], requires_grad=True)
>>> list(circuit.tape)
[RZ(11.566370614359172, wires=[0]) @ RY(11.566370614359172, wires=[0]) @ RX(11.566370614359172, wires=[0]),
 probs(wires=[0])]

Contents

Using PennyLane

Development

API