qml.simplify¶
- simplify(input)[source]¶
Simplifies an operator, tape, qnode or quantum function by reducing its arithmetic depth or number of rotation parameters.
- Parameters:
input (.Operator, .MeasurementProcess, pennylane.QNode, .QuantumTape, or Callable) – an operator, quantum node, tape or function that applies quantum operations
- Returns:
(Operator or MeasurementProcess or qnode (QNode) or quantum function (Callable) or tuple[List[QuantumTape], function]): Simplified input. If an operator or measurement process is provided as input, the simplified input is returned directly. Otherwise, the transformed circuit is returned as described in
qml.transform.
Example
Given an instantiated operator,
qml.simplifyreduces the operator’s arithmetic depth:>>> op = qml.adjoint(qml.RX(0.54, wires=0) + qml.X(0) + qml.Z(1)) >>> op.arithmetic_depth 2 >>> sim_op = qml.simplify(op) >>> sim_op.arithmetic_depth 1 >>> type(sim_op) <class 'pennylane.ops.op_math.sum.Sum'> >>> sim_op.operands (RX(12.026370614359173, wires=[0]), X(0), Z(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.X(0)) >>> op Adjoint(U2(-1.5707963267948966, 1.5707963267948966, wires=[0]) + X(0)) >>> qml.simplify(op) RX(10.995574287564276, wires=[0]) + X(0)
Moreover,
qml.simplifycan be used to simplify QNodes or quantum functions:>>> dev = qml.device("default.qubit", wires=2) >>> @qml.qnode(dev) ... @qml.simplify ... 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() array([0.64596329, 0.35403671]) >>> tape = qml.workflow.construct_tape(circuit)() >>> list(tape) [RZ(11.566370614359172, wires=[0]) @ RY(11.566370614359172, wires=[0]) @ RX(11.566370614359172, wires=[0]), probs(wires=[0])]