Repository: PennyLaneAI/pennylane
Pull request #1907 (2021-11-17 06:31:30)

[OpRefactor] Remove par_domain attribute
The `par_domain` attribute of the operator class is an anachronism that is removed everywhere.

Luckily, this only affected tests. The only exception is a sanity check at the creation of operations, comparing the parameter domain to the grad method. However, one could argue that such a check is an unnecessary slowdown anyways, and should rather be covered by tests.

codecov[bot]: # [Codecov](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI) Report
> Merging [#1907](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI) (86191b7) into [set_num_params_dynamically](https://codecov.io/gh/PennyLaneAI/pennylane/commit/1c1cb9b67f34c7dd2e2a1b777aa597a29be9a079?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI) (1c1cb9b) will **decrease** coverage by `0.01%`.
> The diff coverage is `100.00%`.

[![Impacted file tree graph](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907/graphs/tree.svg?width=650&height=150&src=pr&token=9S3YzlUgGk&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI)](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI)

```diff
@@                      Coverage Diff                       @@
##           set_num_params_dynamically    #1907      +/-   ##
==============================================================
- Coverage                       98.90%   98.88%   -0.02%     
==============================================================
  Files                             219      219              
  Lines                           16790    16661     -129     
==============================================================
- Hits                            16606    16476     -130     
- Misses                            184      185       +1     
```


| [Impacted Files](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI) | Coverage Δ | |
|---|---|---|
| [pennylane/ops/\_\_init\_\_.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL29wcy9fX2luaXRfXy5weQ==) | `100.00% <ø> (ø)` | |
| [pennylane/ops/channel.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL29wcy9jaGFubmVsLnB5) | `100.00% <ø> (ø)` | |
| [pennylane/ops/cv.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL29wcy9jdi5weQ==) | `100.00% <ø> (ø)` | |
| [pennylane/ops/qubit/arithmetic\_ops.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL29wcy9xdWJpdC9hcml0aG1ldGljX29wcy5weQ==) | `100.00% <ø> (ø)` | |
| [pennylane/ops/qubit/hamiltonian.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL29wcy9xdWJpdC9oYW1pbHRvbmlhbi5weQ==) | `99.04% <ø> (-0.01%)` | :arrow_down: |
| [pennylane/ops/qubit/matrix\_ops.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL29wcy9xdWJpdC9tYXRyaXhfb3BzLnB5) | `99.16% <ø> (-0.03%)` | :arrow_down: |
| [pennylane/ops/qubit/non\_parametric\_ops.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL29wcy9xdWJpdC9ub25fcGFyYW1ldHJpY19vcHMucHk=) | `97.30% <ø> (-0.10%)` | :arrow_down: |
| [pennylane/ops/qubit/observables.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL29wcy9xdWJpdC9vYnNlcnZhYmxlcy5weQ==) | `100.00% <ø> (ø)` | |
| [pennylane/ops/qubit/parametric\_ops.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL29wcy9xdWJpdC9wYXJhbWV0cmljX29wcy5weQ==) | `99.82% <ø> (-0.01%)` | :arrow_down: |
| [pennylane/ops/qubit/qchem\_ops.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL29wcy9xdWJpdC9xY2hlbV9vcHMucHk=) | `100.00% <ø> (ø)` | |
| ... and [34 more](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907/diff?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI) | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI). Last update [1c1cb9b...86191b7](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1907?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI).

mariaschuld: codecov complains about a new untested `NotImplementedError` which we generally don't test - I'll overwrite
mariaschuld: @anthayes92 you are so right! Since this is kind of a different topic, let me open another PR for the `num_params`. I don't know how I missed them in the previous one.

Patch:
diff --git a/doc/releases/changelog-dev.md b/doc/releases/changelog-dev.md
index fba60eba1..9fd9c6c0a 100644
--- a/doc/releases/changelog-dev.md
+++ b/doc/releases/changelog-dev.md
@@ -154,6 +154,9 @@
 
 <h3>Breaking changes</h3>
 
+* The `par_domain` attribute in the operator class has been removed. 
+  [(#1907)](https://github.com/PennyLaneAI/pennylane/pull/1907)
+
 - The `mutable` keyword argument has been removed from the QNode.
   [(#1807)](https://github.com/PennyLaneAI/pennylane/pull/1807)
 
diff --git a/pennylane/operation.py b/pennylane/operation.py
index e1a8d5c0d..0dc624e8f 100644
--- a/pennylane/operation.py
+++ b/pennylane/operation.py
@@ -250,7 +250,6 @@ class Operator(abc.ABC):
     The following class attributes must be defined for all Operators:
 
     * :attr:`~.Operator.num_wires`
-    * :attr:`~.Operator.par_domain`
 
     Args:
         params (tuple[float, int, array]): operator parameters
@@ -391,18 +390,6 @@ class Operator(abc.ABC):
     def num_wires(self):
         """Number of wires the operator acts on."""
 
-    @property
-    @abc.abstractmethod
-    def par_domain(self):
-        """Domain of the gate parameters.
-
-        * ``'N'``: natural numbers (including zero).
-        * ``'R'``: floats.
-        * ``'A'``: arrays of real or complex values.
-        * ``'L'``: list of arrays of real or complex values.
-        * ``None``: if there are no parameters.
-        """
-
     @property
     def name(self):
         """String for the name of the operator."""
@@ -583,9 +570,7 @@ class Operation(Operator):
     As with :class:`~.Operator`, the following class attributes must be
     defined for all operations:
 
-    * :attr:`~.Operator.num_params`
     * :attr:`~.Operator.num_wires`
-    * :attr:`~.Operator.par_domain`
 
     The following two class attributes are optional, but in most cases
     should be clearly defined to avoid unexpected behavior during
@@ -826,17 +811,6 @@ class Operation(Operator):
         self._inverse = False
         super().__init__(*params, wires=wires, do_queue=do_queue, id=id)
 
-        # check the grad_method validity
-        if self.par_domain == "N":
-            assert (
-                self.grad_method is None
-            ), "An operation may only be differentiated with respect to real scalar parameters."
-        elif self.par_domain == "A":
-            assert self.grad_method in (
-                None,
-                "F",
-            ), "Operations that depend on arrays containing free variables may only be differentiated using the F method."
-
         # check the grad_recipe validity
         if self.grad_method == "A":
             if self.grad_recipe is None:
@@ -856,9 +830,7 @@ class Channel(Operation, abc.ABC):
     As with :class:`~.Operation`, the following class attributes must be
     defined for all channels:
 
-    * :attr:`~.Operator.num_params`
     * :attr:`~.Operator.num_wires`
-    * :attr:`~.Operator.par_domain`
 
     To define a noisy channel, the following attribute of :class:`~.Channel`
     can be used to list the corresponding Kraus matrices.
@@ -945,9 +917,7 @@ class Observable(Operator):
     As with :class:`~.Operator`, the following class attributes must be
     defined for all observables:
 
-    * :attr:`~.Operator.num_params`
     * :attr:`~.Operator.num_wires`
-    * :attr:`~.Operator.par_domain`
 
     Args:
         params (tuple[float, int, array]): observable parameters
@@ -1159,7 +1129,6 @@ class Tensor(Observable):
     # pylint: disable=abstract-method
     return_type = None
     tensor = True
-    par_domain = None
 
     def __init__(self, *args):  # pylint: disable=super-init-not-called
         self._eigvals_cache = None
@@ -1766,10 +1735,10 @@ class CVOperation(CV, Operation):
         """
         p = [qml.math.toarray(a) for a in self.parameters]
         if inverse:
-            if self.par_domain == "A":
+            try:
                 # TODO: expand this for the new par domain class, for non-unitary matrices.
                 p[0] = np.linalg.inv(p[0])
-            else:
+            except np.linalg.LinAlgError:
                 p[0] = -p[0]  # negate first parameter
         U = self._heisenberg_rep(p)  # pylint: disable=assignment-from-none
 
diff --git a/pennylane/ops/__init__.py b/pennylane/ops/__init__.py
index b66472b24..ac5bccf5c 100644
--- a/pennylane/ops/__init__.py
+++ b/pennylane/ops/__init__.py
@@ -56,7 +56,6 @@ class Identity(CVObservable, Operation):
     simulators should always be equal to 1.
     """
     num_wires = 1
-    par_domain = None
     grad_method = None
 
     ev_order = 1
diff --git a/pennylane/ops/channel.py b/pennylane/ops/channel.py
index e18d41fe9..8842dfd55 100644
--- a/pennylane/ops/channel.py
+++ b/pennylane/ops/channel.py
@@ -51,7 +51,6 @@ class AmplitudeDamping(Channel):
         wires (Sequence[int] or int): the wire the channel acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "F"
 
     @property
@@ -115,7 +114,6 @@ class GeneralizedAmplitudeDamping(Channel):
         wires (Sequence[int] or int): the wire the channel acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "F"
 
     @property
@@ -171,7 +169,6 @@ class PhaseDamping(Channel):
         wires (Sequence[int] or int): the wire the channel acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "F"
 
     @property
@@ -233,7 +230,6 @@ class DepolarizingChannel(Channel):
         wires (Sequence[int] or int): the wire the channel acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "A"
     grad_recipe = ([[1, 0, 1], [-1, 0, 0]],)
 
@@ -285,7 +281,6 @@ class BitFlip(Channel):
         wires (Sequence[int] or int): the wire the channel acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "A"
     grad_recipe = ([[1, 0, 1], [-1, 0, 0]],)
 
@@ -355,7 +350,6 @@ class ResetError(Channel):
         wires (Sequence[int] or int): the wire the channel acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "F"
 
     @property
@@ -413,7 +407,6 @@ class PhaseFlip(Channel):
         wires (Sequence[int] or int): the wire the channel acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "A"
     grad_recipe = ([[1, 0, 1], [-1, 0, 0]],)
 
@@ -451,7 +444,6 @@ class QubitChannel(Channel):
         wires (Union[Wires, Sequence[int], or int]): the wire(s) the operation acts on
     """
     num_wires = AnyWires
-    par_domain = "L"
     grad_method = None
 
     def __init__(self, *params, wires=None, do_queue=True):
@@ -569,7 +561,6 @@ class ThermalRelaxationError(Channel):
     """
     num_params = 4
     num_wires = 1
-    par_domain = "R"
     grad_method = "F"
 
     @classmethod
diff --git a/pennylane/ops/cv.py b/pennylane/ops/cv.py
index bab18e995..0823a5cd6 100644
--- a/pennylane/ops/cv.py
+++ b/pennylane/ops/cv.py
@@ -95,7 +95,6 @@ class Rotation(CVOperation):
         phi (float): the rotation angle
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "A"
 
     @property
@@ -143,7 +142,6 @@ class Squeezing(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "A"
 
     shift = 0.1
@@ -198,7 +196,6 @@ class Displacement(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "A"
 
     shift = 0.1
@@ -259,7 +256,6 @@ class Beamsplitter(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 2
-    par_domain = "R"
     grad_method = "A"
 
     @property
@@ -320,7 +316,6 @@ class TwoModeSqueezing(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 2
-    par_domain = "R"
 
     grad_method = "A"
 
@@ -382,7 +377,6 @@ class QuadraticPhase(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
 
     grad_method = "A"
 
@@ -436,8 +430,6 @@ class ControlledAddition(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 2
-    par_domain = "R"
-
     grad_method = "A"
 
     shift = 0.1
@@ -494,8 +486,6 @@ class ControlledPhase(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 2
-    par_domain = "R"
-
     grad_method = "A"
 
     shift = 0.1
@@ -539,7 +529,6 @@ class Kerr(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "F"
 
     @property
@@ -568,7 +557,6 @@ class CrossKerr(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 2
-    par_domain = "R"
     grad_method = "F"
 
     @property
@@ -597,7 +585,6 @@ class CubicPhase(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "F"
 
     @property
@@ -646,7 +633,6 @@ class InterferometerUnitary(CVOperation):
         wires (Sequence[int] or int): the wires the operation acts on
     """
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
     grad_recipe = None
 
@@ -700,7 +686,6 @@ class CoherentState(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "F"
 
     @property
@@ -724,7 +709,6 @@ class SqueezedState(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "F"
 
     @property
@@ -758,7 +742,6 @@ class DisplacedSqueezedState(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "F"
 
     @property
@@ -781,7 +764,6 @@ class ThermalState(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "F"
 
     @property
@@ -809,7 +791,6 @@ class GaussianState(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = "F"
 
     @property
@@ -835,7 +816,6 @@ class FockState(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "N"
     grad_method = None
 
     @property
@@ -922,7 +902,6 @@ class FockStateVector(CVOperation):
 
     """
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = "F"
 
     @property
@@ -967,7 +946,6 @@ class FockDensityMatrix(CVOperation):
             a multimode tensor :math:`\rho_{ij,kl,\dots,mn}`, with two indices per mode
     """
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = "F"
 
     @property
@@ -1002,7 +980,6 @@ class CatState(CVOperation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "F"
 
     @property
@@ -1042,7 +1019,6 @@ class NumberOperator(CVObservable):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = None
 
     ev_order = 2
 
@@ -1097,7 +1073,6 @@ class TensorN(CVObservable):
         2
     """
     num_wires = AnyWires
-    par_domain = None
     ev_order = None
 
     def __new__(cls, *params, wires=None, do_queue=True):
@@ -1143,7 +1118,6 @@ class X(CVObservable):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = None
 
     ev_order = 1
 
@@ -1177,7 +1151,6 @@ class P(CVObservable):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = None
 
     ev_order = 1
 
@@ -1213,7 +1186,6 @@ class QuadOperator(CVObservable):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
 
     grad_method = "A"
     ev_order = 1
@@ -1288,7 +1260,6 @@ class PolyXP(CVObservable):
 
     """
     num_wires = AnyWires
-    par_domain = "A"
 
     grad_method = "F"
     ev_order = 2
@@ -1345,7 +1316,6 @@ class FockStateProjector(CVObservable):
             total number of wires in the QNode.
     """
     num_wires = AnyWires
-    par_domain = "A"
 
     grad_method = None
     ev_order = None
diff --git a/pennylane/ops/qubit/arithmetic_ops.py b/pennylane/ops/qubit/arithmetic_ops.py
index 8d030e2d2..96e6704fa 100644
--- a/pennylane/ops/qubit/arithmetic_ops.py
+++ b/pennylane/ops/qubit/arithmetic_ops.py
@@ -88,7 +88,6 @@ class QubitCarry(Operation):
     1
     """
     num_wires = 4
-    par_domain = None
     _mat = np.array(
         [
             [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
@@ -186,7 +185,6 @@ class QubitSum(Operation):
     1
     """
     num_wires = 3
-    par_domain = None
     _mat = np.array(
         [
             [1, 0, 0, 0, 0, 0, 0, 0],
diff --git a/pennylane/ops/qubit/hamiltonian.py b/pennylane/ops/qubit/hamiltonian.py
index 0cb16d4e7..ad22aff11 100644
--- a/pennylane/ops/qubit/hamiltonian.py
+++ b/pennylane/ops/qubit/hamiltonian.py
@@ -160,7 +160,6 @@ class Hamiltonian(Observable):
     """
 
     num_wires = qml.operation.AnyWires
-    par_domain = "A"
     grad_method = "A"  # supports analytic gradients
 
     def __init__(
diff --git a/pennylane/ops/qubit/matrix_ops.py b/pennylane/ops/qubit/matrix_ops.py
index 173ec6b6c..92e9fe852 100644
--- a/pennylane/ops/qubit/matrix_ops.py
+++ b/pennylane/ops/qubit/matrix_ops.py
@@ -50,7 +50,6 @@ class QubitUnitary(Operation):
     0.0
     """
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, *params, wires, do_queue=True):
@@ -163,7 +162,6 @@ class ControlledQubitUnitary(QubitUnitary):
 
     """
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(
@@ -274,7 +272,6 @@ class DiagonalQubitUnitary(Operation):
         wires (Sequence[int] or int): the wire(s) the operation acts on
     """
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     @property
diff --git a/pennylane/ops/qubit/non_parametric_ops.py b/pennylane/ops/qubit/non_parametric_ops.py
index d4d2a7882..d380db649 100644
--- a/pennylane/ops/qubit/non_parametric_ops.py
+++ b/pennylane/ops/qubit/non_parametric_ops.py
@@ -43,7 +43,6 @@ class Hadamard(Observable, Operation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = None
     eigvals = pauli_eigs(1)
     matrix = np.array([[INV_SQRT2, INV_SQRT2], [INV_SQRT2, -INV_SQRT2]])
 
@@ -110,7 +109,6 @@ class PauliX(Observable, Operation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = None
     basis = "X"
     eigvals = pauli_eigs(1)
     matrix = np.array([[0, 1], [1, 0]])
@@ -179,7 +177,6 @@ class PauliY(Observable, Operation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = None
     basis = "Y"
     eigvals = pauli_eigs(1)
     matrix = np.array([[0, -1j], [1j, 0]])
@@ -254,7 +251,6 @@ class PauliZ(Observable, Operation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = None
     basis = "Z"
     eigvals = pauli_eigs(1)
     matrix = np.array([[1, 0], [0, -1]])
@@ -311,7 +307,6 @@ class S(Operation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = None
     basis = "Z"
     op_eigvals = np.array([1, 1j])
     op_matrix = np.array([[1, 0], [0, 1j]])
@@ -359,7 +354,6 @@ class T(Operation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = None
     basis = "Z"
     op_matrix = np.array([[1, 0], [0, cmath.exp(1j * np.pi / 4)]])
     op_eigvals = np.array([1, cmath.exp(1j * np.pi / 4)])
@@ -407,7 +401,6 @@ class SX(Operation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = None
     basis = "X"
     op_matrix = 0.5 * np.array([[1 + 1j, 1 - 1j], [1 - 1j, 1 + 1j]])
     op_eigvals = np.array([1, 1j])
@@ -464,7 +457,6 @@ class CNOT(Operation):
         wires (Sequence[int]): the wires the operation acts on
     """
     num_wires = 2
-    par_domain = None
     basis = "X"
     matrix = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]])
 
@@ -512,7 +504,6 @@ class CZ(Operation):
         wires (Sequence[int]): the wires the operation acts on
     """
     num_wires = 2
-    par_domain = None
     basis = "Z"
     eigvals = np.array([1, 1, 1, -1])
     matrix = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, -1]])
@@ -562,7 +553,6 @@ class CY(Operation):
         wires (Sequence[int]): the wires the operation acts on
     """
     num_wires = 2
-    par_domain = None
     basis = "Y"
     matrix = np.array(
         [
@@ -617,7 +607,6 @@ class SWAP(Operation):
         wires (Sequence[int]): the wires the operation acts on
     """
     num_wires = 2
-    par_domain = None
     basis = "X"
     matrix = np.array([[1, 0, 0, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, 1]])
 
@@ -665,7 +654,6 @@ class ISWAP(Operation):
         wires (Sequence[int]): the wires the operation acts on
     """
     num_wires = 2
-    par_domain = None
     op_matrix = np.array([[1, 0, 0, 0], [0, 0, 1j, 0], [0, 1j, 0, 0], [0, 0, 0, 1]])
     op_eigvals = np.array([1j, -1j, 1, 1])
 
@@ -717,7 +705,6 @@ class SISWAP(Operation):
         wires (Sequence[int]): the wires the operation acts on
     """
     num_wires = 2
-    par_domain = None
     op_matrix = np.array(
         [
             [1, 0, 0, 0],
@@ -792,7 +779,6 @@ class CSWAP(Operation):
     """
     is_self_inverse = True
     num_wires = 3
-    par_domain = None
     matrix = np.array(
         [
             [1, 0, 0, 0, 0, 0, 0, 0],
@@ -861,7 +847,6 @@ class Toffoli(Operation):
         wires (Sequence[int]): the subsystem the gate acts on
     """
     num_wires = 3
-    par_domain = None
     basis = "X"
     matrix = np.array(
         [
@@ -971,7 +956,6 @@ class MultiControlledX(Operation):
     """
     is_self_inverse = True
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     # pylint: disable=too-many-arguments
diff --git a/pennylane/ops/qubit/observables.py b/pennylane/ops/qubit/observables.py
index 93f020c29..eaa033860 100644
--- a/pennylane/ops/qubit/observables.py
+++ b/pennylane/ops/qubit/observables.py
@@ -52,7 +52,6 @@ class Hermitian(Observable):
     """
     num_wires = AnyWires
     num_params = 1
-    par_domain = "A"
     grad_method = "F"
     _eigs = {}
 
@@ -141,7 +140,6 @@ class SparseHamiltonian(Observable):
     """
     num_wires = AllWires
     num_params = 1
-    par_domain = None
     grad_method = None
 
     def label(self, decimals=None, base_label=None):
@@ -182,7 +180,6 @@ class Projector(Observable):
         wires (Iterable): wires that the projector acts on
     """
     num_wires = AnyWires
-    par_domain = "A"
 
     def __init__(self, basis_state, wires, do_queue=True):
         wires = Wires(wires)
diff --git a/pennylane/ops/qubit/parametric_ops.py b/pennylane/ops/qubit/parametric_ops.py
index eef4ddd1c..cda99da03 100644
--- a/pennylane/ops/qubit/parametric_ops.py
+++ b/pennylane/ops/qubit/parametric_ops.py
@@ -51,7 +51,6 @@ class RX(Operation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
     basis = "X"
     grad_method = "A"
     generator = [PauliX, -1 / 2]
@@ -109,7 +108,6 @@ class RY(Operation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
     basis = "Y"
     grad_method = "A"
     generator = [PauliY, -1 / 2]
@@ -161,7 +159,6 @@ class RZ(Operation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
     basis = "Z"
     grad_method = "A"
     generator = [PauliZ, -1 / 2]
@@ -224,7 +221,6 @@ class PhaseShift(Operation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
     basis = "Z"
     grad_method = "A"
     generator = [np.array([[0, 0], [0, 1]]), 1]
@@ -299,7 +295,6 @@ class ControlledPhaseShift(Operation):
         wires (Sequence[int]): the wire the operation acts on
     """
     num_wires = 2
-    par_domain = "R"
     basis = "Z"
     grad_method = "A"
     generator = [np.array([[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 1]]), 1]
@@ -386,7 +381,6 @@ class Rot(Operation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "A"
 
     @property
@@ -471,7 +465,6 @@ class MultiRZ(Operation):
         wires (Sequence[int] or int): the wires the operation acts on
     """
     num_wires = AnyWires
-    par_domain = "R"
     grad_method = "A"
 
     @property
@@ -585,7 +578,6 @@ class PauliRot(Operation):
     """
     num_wires = AnyWires
     do_check_domain = False
-    par_domain = "R"
     grad_method = "A"
 
     _ALLOWED_CHARACTERS = "IXYZ"
@@ -840,7 +832,6 @@ class CRX(Operation):
         wires (Sequence[int]): the wire the operation acts on
     """
     num_wires = 2
-    par_domain = "R"
     basis = "X"
     grad_method = "A"
     grad_recipe = four_term_grad_recipe
@@ -936,7 +927,6 @@ class CRY(Operation):
         wires (Sequence[int]): the wire the operation acts on
     """
     num_wires = 2
-    par_domain = "R"
     basis = "Y"
     grad_method = "A"
     grad_recipe = four_term_grad_recipe
@@ -1026,7 +1016,6 @@ class CRZ(Operation):
         wires (Sequence[int]): the wire the operation acts on
     """
     num_wires = 2
-    par_domain = "R"
     basis = "Z"
     grad_method = "A"
     grad_recipe = four_term_grad_recipe
@@ -1121,7 +1110,6 @@ class CRot(Operation):
         wires (Sequence[int]): the wire the operation acts on
     """
     num_wires = 2
-    par_domain = "R"
     grad_method = "A"
     grad_recipe = four_term_grad_recipe * 3
 
@@ -1217,7 +1205,6 @@ class U1(Operation):
         wires (Sequence[int] or int): the wire the operation acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "A"
     generator = [np.array([[0, 0], [0, 1]]), 1]
 
@@ -1279,7 +1266,6 @@ class U2(Operation):
         wires (Sequence[int] or int): the subsystem the gate acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "A"
 
     @property
@@ -1356,7 +1342,6 @@ class U3(Operation):
         wires (Sequence[int] or int): the subsystem the gate acts on
     """
     num_wires = 1
-    par_domain = "R"
     grad_method = "A"
 
     @property
@@ -1428,7 +1413,6 @@ class IsingXX(Operation):
         wires (int): the subsystem the gate acts on
     """
     num_wires = 2
-    par_domain = "R"
     grad_method = "A"
 
     generator = [
@@ -1493,7 +1477,6 @@ class IsingYY(Operation):
         wires (int): the subsystem the gate acts on
     """
     num_wires = 2
-    par_domain = "R"
     grad_method = "A"
     generator = [
         np.array([[0, 0, 0, -1], [0, 0, 1, 0], [0, 1, 0, 0], [-1, 0, 0, 0]]),
@@ -1555,7 +1538,6 @@ class IsingZZ(Operation):
         wires (int): the subsystem the gate acts on
     """
     num_wires = 2
-    par_domain = "R"
     grad_method = "A"
     generator = [
         np.array([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]]),
diff --git a/pennylane/ops/qubit/qchem_ops.py b/pennylane/ops/qubit/qchem_ops.py
index ef1467289..0f1c2e09d 100644
--- a/pennylane/ops/qubit/qchem_ops.py
+++ b/pennylane/ops/qubit/qchem_ops.py
@@ -78,7 +78,6 @@ class SingleExcitation(Operation):
     """
 
     num_wires = 2
-    par_domain = "R"
     grad_method = "A"
     grad_recipe = four_term_grad_recipe
     generator = [
@@ -142,7 +141,6 @@ class SingleExcitationMinus(Operation):
 
     """
     num_wires = 2
-    par_domain = "R"
     grad_method = "A"
     generator = [
         np.array([[1, 0, 0, 0], [0, 0, -1j, 0], [0, 1j, 0, 0], [0, 0, 0, 1]]),
@@ -219,7 +217,6 @@ class SingleExcitationPlus(Operation):
 
     """
     num_wires = 2
-    par_domain = "R"
     grad_method = "A"
     generator = [
         np.array([[-1, 0, 0, 0], [0, 0, -1j, 0], [0, 1j, 0, 0], [0, 0, 0, -1]]),
@@ -320,7 +317,6 @@ class DoubleExcitation(Operation):
         circuit(0.1)
     """
     num_wires = 4
-    par_domain = "R"
     grad_method = "A"
     grad_recipe = four_term_grad_recipe
 
@@ -417,7 +413,6 @@ class DoubleExcitationPlus(Operation):
         wires (Sequence[int]): the wires the operation acts on
     """
     num_wires = 4
-    par_domain = "R"
     grad_method = "A"
 
     G = -1 * np.eye(16, dtype=np.complex64)
@@ -490,7 +485,6 @@ class DoubleExcitationMinus(Operation):
         wires (Sequence[int]): the wires the operation acts on
     """
     num_wires = 4
-    par_domain = "R"
     grad_method = "A"
 
     G = np.eye(16, dtype=np.complex64)
@@ -585,7 +579,6 @@ class OrbitalRotation(Operation):
                 0.        +0.j])
     """
     num_wires = 4
-    par_domain = "R"
     grad_method = "A"
     grad_recipe = four_term_grad_recipe
     generator = [
diff --git a/pennylane/ops/qubit/state_preparation.py b/pennylane/ops/qubit/state_preparation.py
index b7cc6cc24..3a780d6f2 100644
--- a/pennylane/ops/qubit/state_preparation.py
+++ b/pennylane/ops/qubit/state_preparation.py
@@ -55,7 +55,6 @@ class BasisState(Operation):
     [0.+0.j 0.+0.j 0.+0.j 1.+0.j]
     """
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     @property
@@ -102,7 +101,6 @@ class QubitStateVector(Operation):
     [1.+0.j 0.+0.j 0.+0.j 0.+0.j]
     """
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     @property
@@ -166,7 +164,6 @@ class QubitDensityMatrix(Operation):
     """
     num_params = 1
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def adjoint(self):
diff --git a/pennylane/templates/embeddings/amplitude.py b/pennylane/templates/embeddings/amplitude.py
index f50bdd109..f32ac77f2 100644
--- a/pennylane/templates/embeddings/amplitude.py
+++ b/pennylane/templates/embeddings/amplitude.py
@@ -119,7 +119,6 @@ class AmplitudeEmbedding(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, features, wires, pad_with=None, normalize=False, do_queue=True, id=None):
diff --git a/pennylane/templates/embeddings/angle.py b/pennylane/templates/embeddings/angle.py
index dbcc7f828..92b05428c 100644
--- a/pennylane/templates/embeddings/angle.py
+++ b/pennylane/templates/embeddings/angle.py
@@ -71,7 +71,6 @@ class AngleEmbedding(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, features, wires, rotation="X", do_queue=True, id=None):
diff --git a/pennylane/templates/embeddings/basis.py b/pennylane/templates/embeddings/basis.py
index 1d0fb5c12..399175020 100644
--- a/pennylane/templates/embeddings/basis.py
+++ b/pennylane/templates/embeddings/basis.py
@@ -68,7 +68,6 @@ class BasisEmbedding(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, features, wires, do_queue=True, id=None):
diff --git a/pennylane/templates/embeddings/displacement.py b/pennylane/templates/embeddings/displacement.py
index 5c5ae58d5..95b15794b 100644
--- a/pennylane/templates/embeddings/displacement.py
+++ b/pennylane/templates/embeddings/displacement.py
@@ -46,7 +46,6 @@ class DisplacementEmbedding(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, features, wires, method="amplitude", c=0.1, do_queue=True, id=None):
diff --git a/pennylane/templates/embeddings/iqp.py b/pennylane/templates/embeddings/iqp.py
index 3a9e8dc5f..a2bca84f3 100644
--- a/pennylane/templates/embeddings/iqp.py
+++ b/pennylane/templates/embeddings/iqp.py
@@ -163,7 +163,6 @@ class IQPEmbedding(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, features, wires, n_repeats=1, pattern=None, do_queue=True, id=None):
diff --git a/pennylane/templates/embeddings/qaoaembedding.py b/pennylane/templates/embeddings/qaoaembedding.py
index 52e87b74a..0ff88513e 100644
--- a/pennylane/templates/embeddings/qaoaembedding.py
+++ b/pennylane/templates/embeddings/qaoaembedding.py
@@ -197,7 +197,6 @@ class QAOAEmbedding(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, features, weights, wires, local_field="Y", do_queue=True, id=None):
diff --git a/pennylane/templates/embeddings/squeezing.py b/pennylane/templates/embeddings/squeezing.py
index fc99c20d0..c6dc60817 100644
--- a/pennylane/templates/embeddings/squeezing.py
+++ b/pennylane/templates/embeddings/squeezing.py
@@ -47,7 +47,6 @@ class SqueezingEmbedding(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, features, wires, method="amplitude", c=0.1, do_queue=True, id=None):
diff --git a/pennylane/templates/layers/basic_entangler.py b/pennylane/templates/layers/basic_entangler.py
index 8e91b43db..1090e5c36 100644
--- a/pennylane/templates/layers/basic_entangler.py
+++ b/pennylane/templates/layers/basic_entangler.py
@@ -121,7 +121,6 @@ class BasicEntanglerLayers(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, weights, wires=None, rotation=None, do_queue=True, id=None):
diff --git a/pennylane/templates/layers/cv_neural_net.py b/pennylane/templates/layers/cv_neural_net.py
index 9da33a4a8..43f4d81dc 100644
--- a/pennylane/templates/layers/cv_neural_net.py
+++ b/pennylane/templates/layers/cv_neural_net.py
@@ -81,7 +81,6 @@ class CVNeuralNetLayers(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(
diff --git a/pennylane/templates/layers/gate_fabric.py b/pennylane/templates/layers/gate_fabric.py
index fd08581da..b5408d0b2 100644
--- a/pennylane/templates/layers/gate_fabric.py
+++ b/pennylane/templates/layers/gate_fabric.py
@@ -172,7 +172,6 @@ class GateFabric(Operation):
 
     """
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, weights, wires, init_state, include_pi=False, do_queue=True, id=None):
diff --git a/pennylane/templates/layers/particle_conserving_u1.py b/pennylane/templates/layers/particle_conserving_u1.py
index d9c8eaebd..9905e3ad4 100644
--- a/pennylane/templates/layers/particle_conserving_u1.py
+++ b/pennylane/templates/layers/particle_conserving_u1.py
@@ -228,7 +228,6 @@ class ParticleConservingU1(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, weights, wires, init_state=None, do_queue=True, id=None):
diff --git a/pennylane/templates/layers/particle_conserving_u2.py b/pennylane/templates/layers/particle_conserving_u2.py
index 763d4d8f2..89dd843ef 100644
--- a/pennylane/templates/layers/particle_conserving_u2.py
+++ b/pennylane/templates/layers/particle_conserving_u2.py
@@ -149,7 +149,6 @@ class ParticleConservingU2(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, weights, wires, init_state=None, do_queue=True, id=None):
diff --git a/pennylane/templates/layers/random.py b/pennylane/templates/layers/random.py
index 0e4a99200..991a0137f 100644
--- a/pennylane/templates/layers/random.py
+++ b/pennylane/templates/layers/random.py
@@ -175,7 +175,6 @@ class RandomLayers(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(
diff --git a/pennylane/templates/layers/simplified_two_design.py b/pennylane/templates/layers/simplified_two_design.py
index d5e9eca8f..778f5c9bc 100644
--- a/pennylane/templates/layers/simplified_two_design.py
+++ b/pennylane/templates/layers/simplified_two_design.py
@@ -98,7 +98,6 @@ class SimplifiedTwoDesign(Operation):
 
     """
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, initial_layer_weights, weights, wires, do_queue=True, id=None):
diff --git a/pennylane/templates/layers/strongly_entangling.py b/pennylane/templates/layers/strongly_entangling.py
index 508b2f624..091ce2b69 100644
--- a/pennylane/templates/layers/strongly_entangling.py
+++ b/pennylane/templates/layers/strongly_entangling.py
@@ -65,7 +65,6 @@ class StronglyEntanglingLayers(Operation):
 
     """
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, weights, wires, ranges=None, imprimitive=None, do_queue=True, id=None):
diff --git a/pennylane/templates/state_preparations/arbitrary_state_preparation.py b/pennylane/templates/state_preparations/arbitrary_state_preparation.py
index 749201cce..76fa371a6 100644
--- a/pennylane/templates/state_preparations/arbitrary_state_preparation.py
+++ b/pennylane/templates/state_preparations/arbitrary_state_preparation.py
@@ -80,7 +80,6 @@ class ArbitraryStatePreparation(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, weights, wires, do_queue=True, id=None):
diff --git a/pennylane/templates/state_preparations/basis.py b/pennylane/templates/state_preparations/basis.py
index 22cd2f57e..92a0c4a4f 100644
--- a/pennylane/templates/state_preparations/basis.py
+++ b/pennylane/templates/state_preparations/basis.py
@@ -48,7 +48,6 @@ class BasisStatePreparation(Operation):
         wires (Iterable): wires that the template acts on
     """
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, basis_state, wires, do_queue=True, id=None):
diff --git a/pennylane/templates/state_preparations/mottonen.py b/pennylane/templates/state_preparations/mottonen.py
index 816626430..68746d2f3 100644
--- a/pennylane/templates/state_preparations/mottonen.py
+++ b/pennylane/templates/state_preparations/mottonen.py
@@ -246,7 +246,6 @@ class MottonenStatePreparation(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, state_vector, wires, do_queue=True, id=None):
diff --git a/pennylane/templates/subroutines/all_singles_doubles.py b/pennylane/templates/subroutines/all_singles_doubles.py
index c62db63e9..8ff1997a3 100644
--- a/pennylane/templates/subroutines/all_singles_doubles.py
+++ b/pennylane/templates/subroutines/all_singles_doubles.py
@@ -112,7 +112,6 @@ class AllSinglesDoubles(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(
diff --git a/pennylane/templates/subroutines/approx_time_evolution.py b/pennylane/templates/subroutines/approx_time_evolution.py
index 285884e34..58d375b34 100644
--- a/pennylane/templates/subroutines/approx_time_evolution.py
+++ b/pennylane/templates/subroutines/approx_time_evolution.py
@@ -98,7 +98,6 @@ class ApproxTimeEvolution(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "R"
     grad_method = None
 
     def __init__(self, hamiltonian, time, n, do_queue=True, id=None):
diff --git a/pennylane/templates/subroutines/arbitrary_unitary.py b/pennylane/templates/subroutines/arbitrary_unitary.py
index 6eb77bd57..8c972b3ff 100644
--- a/pennylane/templates/subroutines/arbitrary_unitary.py
+++ b/pennylane/templates/subroutines/arbitrary_unitary.py
@@ -92,7 +92,6 @@ class ArbitraryUnitary(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, weights, wires, do_queue=True, id=None):
diff --git a/pennylane/templates/subroutines/fermionic_double_excitation.py b/pennylane/templates/subroutines/fermionic_double_excitation.py
index 92c4ef66b..fdbad3041 100644
--- a/pennylane/templates/subroutines/fermionic_double_excitation.py
+++ b/pennylane/templates/subroutines/fermionic_double_excitation.py
@@ -484,7 +484,6 @@ class FermionicDoubleExcitation(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "R"
     grad_method = "A"
     grad_recipe = four_term_grad_recipe
 
diff --git a/pennylane/templates/subroutines/fermionic_single_excitation.py b/pennylane/templates/subroutines/fermionic_single_excitation.py
index 7a596cae8..7837cb8ad 100644
--- a/pennylane/templates/subroutines/fermionic_single_excitation.py
+++ b/pennylane/templates/subroutines/fermionic_single_excitation.py
@@ -123,7 +123,6 @@ class FermionicSingleExcitation(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "R"
     grad_method = "A"
     grad_recipe = four_term_grad_recipe
 
diff --git a/pennylane/templates/subroutines/grover.py b/pennylane/templates/subroutines/grover.py
index c564e35cb..27daca482 100644
--- a/pennylane/templates/subroutines/grover.py
+++ b/pennylane/templates/subroutines/grover.py
@@ -100,7 +100,6 @@ class GroverOperator(Operation):
 
     """
     num_wires = AnyWires
-    par_domain = None
     grad_method = None
 
     def __init__(self, wires=None, work_wires=None, do_queue=True, id=None):
diff --git a/pennylane/templates/subroutines/kupccgsd.py b/pennylane/templates/subroutines/kupccgsd.py
index c6e7f0814..1ec16c031 100644
--- a/pennylane/templates/subroutines/kupccgsd.py
+++ b/pennylane/templates/subroutines/kupccgsd.py
@@ -201,7 +201,6 @@ class kUpCCGSD(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
 
     def __init__(self, weights, wires, k=1, delta_sz=0, init_state=None, do_queue=True, id=None):
 
diff --git a/pennylane/templates/subroutines/permute.py b/pennylane/templates/subroutines/permute.py
index 42cb82a3b..66b98ec19 100644
--- a/pennylane/templates/subroutines/permute.py
+++ b/pennylane/templates/subroutines/permute.py
@@ -138,7 +138,6 @@ class Permute(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, permutation, wires, do_queue=True, id=None):
diff --git a/pennylane/templates/subroutines/qft.py b/pennylane/templates/subroutines/qft.py
index 554cc09cb..3adc8501f 100644
--- a/pennylane/templates/subroutines/qft.py
+++ b/pennylane/templates/subroutines/qft.py
@@ -64,7 +64,6 @@ class QFT(Operation):
         circuit_qft([1.0, 0.0, 0.0])
     """
     num_wires = AnyWires
-    par_domain = None
     grad_method = None
 
     @property
diff --git a/pennylane/templates/subroutines/qmc.py b/pennylane/templates/subroutines/qmc.py
index 1f13215ed..cfe33856a 100644
--- a/pennylane/templates/subroutines/qmc.py
+++ b/pennylane/templates/subroutines/qmc.py
@@ -328,7 +328,6 @@ class QuantumMonteCarlo(Operation):
         0.4327096457464369
     """
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, probs, func, target_wires, estimation_wires, do_queue=True, id=None):
diff --git a/pennylane/templates/subroutines/qpe.py b/pennylane/templates/subroutines/qpe.py
index c8abe3c61..f60e12329 100644
--- a/pennylane/templates/subroutines/qpe.py
+++ b/pennylane/templates/subroutines/qpe.py
@@ -105,7 +105,6 @@ class QuantumPhaseEstimation(Operation):
             phase_estimated = 4 * np.pi * (1 - phase_estimated)
     """
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(self, unitary, target_wires, estimation_wires, do_queue=True, id=None):
diff --git a/pennylane/templates/subroutines/uccsd.py b/pennylane/templates/subroutines/uccsd.py
index 95c4f9bc1..e2c115527 100644
--- a/pennylane/templates/subroutines/uccsd.py
+++ b/pennylane/templates/subroutines/uccsd.py
@@ -139,7 +139,6 @@ class UCCSD(Operation):
     """
 
     num_wires = AnyWires
-    par_domain = "A"
     grad_method = None
 
     def __init__(
diff --git a/pennylane/transforms/control.py b/pennylane/transforms/control.py
index fe116ef12..fbe7578ba 100644
--- a/pennylane/transforms/control.py
+++ b/pennylane/transforms/control.py
@@ -87,7 +87,6 @@ class ControlledOperation(Operation):
         control_wires: A wire or set of wires.
     """
 
-    par_domain = "A"
     num_wires = AnyWires
     num_params = property(lambda self: self.subtape.num_params)
 


Test patch:
diff --git a/tests/beta/test_default_tensor.py b/tests/beta/test_default_tensor.py
index 7fb2bba04..08df56963 100644
--- a/tests/beta/test_default_tensor.py
+++ b/tests/beta/test_default_tensor.py
@@ -122,13 +122,6 @@ PHI = np.linspace(0.32, 1, 3)
 VARPHI = np.linspace(0.02, 1, 3)
 
 
-def prep_par(par, op):
-    "Convert par into a list of parameters that op expects."
-    if op.par_domain == "A":
-        return [np.diag([x, 1]) for x in par]
-    return par
-
-
 def nodes_and_edges_valid(dev, num_nodes, node_names, rep):
     """Asserts that nodes in a device ``dev`` are properly initialized, when there
     are ``num_nodes`` nodes expected, with names ``node_names``, using representation ``rep``."""
diff --git a/tests/devices/test_default_gaussian.py b/tests/devices/test_default_gaussian.py
index 8521d6bbf..68bea682d 100644
--- a/tests/devices/test_default_gaussian.py
+++ b/tests/devices/test_default_gaussian.py
@@ -83,13 +83,6 @@ H = np.array([[1.02789352, 1.61296440 - 0.3498192j], [1.61296440 + 0.3498192j, 1
 hbar = 2
 
 
-def prep_par(par, op):
-    "Convert par into a list of parameters that op expects."
-    if op.par_domain == "A":
-        return [np.diag([x, 1]) for x in par]
-    return par
-
-
 @pytest.fixture(scope="function")
 def gaussian_device_1_wire():
     """Fixture of a default.gaussian device with 1 wire."""
diff --git a/tests/devices/test_default_qubit.py b/tests/devices/test_default_qubit.py
index 56d1cf589..91a556281 100644
--- a/tests/devices/test_default_qubit.py
+++ b/tests/devices/test_default_qubit.py
@@ -86,13 +86,6 @@ PHI = np.linspace(0.32, 1, 3)
 VARPHI = np.linspace(0.02, 1, 3)
 
 
-def prep_par(par, op):
-    "Convert par into a list of parameters that op expects."
-    if op.par_domain == "A":
-        return [np.diag([x, 1]) for x in par]
-    return par
-
-
 def include_inverses_with_test_data(test_data):
     return test_data + [(item[0] + ".inv", item[1], item[2]) for item in test_data]
 
@@ -2283,7 +2276,6 @@ class TestApplyOperationUnit:
             matrix = np.array([[0, 1], [1, 0]])
             num_params = 0
             num_wires = 1
-            par_domain = None
 
             @classmethod
             def _matrix(cls, *params):
@@ -2323,7 +2315,6 @@ class TestApplyOperationUnit:
         class TestToffoli(qml.operation.Operation):
             num_params = 0
             num_wires = 3
-            par_domain = None
             matrix = U_toffoli
 
             @classmethod
diff --git a/tests/gradients/test_parameter_shift_cv.py b/tests/gradients/test_parameter_shift_cv.py
index e1440050b..ce277ca15 100644
--- a/tests/gradients/test_parameter_shift_cv.py
+++ b/tests/gradients/test_parameter_shift_cv.py
@@ -487,7 +487,6 @@ class TestExpectationQuantumGradients:
 
             num_wires = 1
             num_params = 1
-            par_domain = "R"
             grad_method = "A"
 
         alpha = 0.5643
@@ -848,7 +847,6 @@ class TestVarianceQuantumGradients:
         class DummyOp(qml.operation.CVOperation):
             num_wires = 1
             num_params = 1
-            par_domain = "R"
             grad_method = "A"
             grad_recipe = ([[1, 1, 1], [1, 1, 1], [1, 1, 1]],)
 
diff --git a/tests/tape/test_cv_param_shift.py b/tests/tape/test_cv_param_shift.py
index 957b43b44..b61cc0894 100644
--- a/tests/tape/test_cv_param_shift.py
+++ b/tests/tape/test_cv_param_shift.py
@@ -456,7 +456,6 @@ class TestExpectationQuantumGradients:
 
             num_wires = 1
             num_params = 1
-            par_domain = "R"
             grad_method = "A"
 
         alpha = 0.5643
@@ -802,7 +801,6 @@ class TestVarianceQuantumGradients:
         class DummyOp(qml.operation.CVOperation):
             num_wires = 1
             num_params = 1
-            par_domain = "R"
             grad_method = "A"
             grad_recipe = ([[1, 1, 1], [1, 1, 1], [1, 1, 1]],)
 
diff --git a/tests/tape/test_jacobian_tape.py b/tests/tape/test_jacobian_tape.py
index fb0a56c24..1ad8869c8 100644
--- a/tests/tape/test_jacobian_tape.py
+++ b/tests/tape/test_jacobian_tape.py
@@ -842,7 +842,6 @@ class TestObservableWithObjectReturnType:
 
             num_wires = AnyWires
             num_params = 0
-            par_domain = None
 
             def diagonalizing_gates(self):
                 """Diagonalizing gates"""
diff --git a/tests/tape/test_qnode_old.py b/tests/tape/test_qnode_old.py
index 415cce2a9..6c945b7e0 100644
--- a/tests/tape/test_qnode_old.py
+++ b/tests/tape/test_qnode_old.py
@@ -409,7 +409,6 @@ class TestValidation:
         class MyRX(qml.operation.Operation):
             num_params = 1
             num_wires = 1
-            par_domain = "R"
             is_composable_rotation = True
             basis = "X"
             grad_method = "F"
diff --git a/tests/test_operation.py b/tests/test_operation.py
index dfefc8461..72335138f 100644
--- a/tests/test_operation.py
+++ b/tests/test_operation.py
@@ -52,7 +52,6 @@ class TestOperatorConstruction:
         class DummyOp(qml.operation.Operator):
             r"""Dummy custom operator"""
             num_wires = 1
-            par_domain = "R"
 
         with pytest.raises(ValueError, match="wrong number of wires"):
             DummyOp(0.5, wires=[0, 1])
@@ -63,7 +62,6 @@ class TestOperatorConstruction:
         class DummyOp(qml.operation.Operator):
             r"""Dummy custom operator"""
             num_wires = 1
-            par_domain = "R"
 
         with pytest.raises(qml.wires.WireError, match="Wires must be unique"):
             DummyOp(0.5, wires=[1, 1], do_queue=False)
@@ -74,7 +72,6 @@ class TestOperatorConstruction:
         class DummyOp(qml.operation.Operator):
             r"""Dummy custom operator"""
             num_wires = 1
-            par_domain = "R"
             grad_method = "A"
 
             @property
@@ -90,7 +87,6 @@ class TestOperatorConstruction:
         class DummyOp(qml.operation.Operator):
             r"""Dummy custom operator"""
             num_wires = 1
-            par_domain = None
 
         op = DummyOp(wires=0)
         op.name = "MyOp"
@@ -106,7 +102,6 @@ class TestOperationConstruction:
         class DummyOp(qml.operation.CVOperation):
             r"""Dummy custom operation"""
             num_wires = 2
-            par_domain = "R"
             grad_method = "A"
             grad_recipe = [(0.5, 0.1), (0.43, 0.1)]
 
@@ -115,49 +110,6 @@ class TestOperationConstruction:
         ):
             DummyOp(0.5, wires=[0, 1])
 
-    def test_grad_method_with_integer_params(self):
-        """Test that an exception is raised if a non-None grad-method is provided for natural number params"""
-
-        class DummyOp(qml.operation.Operation):
-            r"""Dummy custom operation"""
-            num_wires = 2
-            par_domain = "N"
-            grad_method = "A"
-
-        with pytest.raises(
-            AssertionError,
-            match="An operation may only be differentiated with respect to real scalar parameters",
-        ):
-            DummyOp(5, wires=[0, 1])
-
-    def test_analytic_grad_with_array_param(self):
-        """Test that an exception is raised if an analytic gradient is requested with an array param"""
-
-        class DummyOp(qml.operation.Operation):
-            r"""Dummy custom operation"""
-            num_wires = 2
-            par_domain = "A"
-            grad_method = "A"
-
-        with pytest.raises(
-            AssertionError,
-            match="Operations that depend on arrays containing free variables may only be differentiated using the F method",
-        ):
-            DummyOp(np.array([1.0]), wires=[0, 1])
-
-    def test_numerical_grad_with_grad_recipe(self):
-        """Test that an exception is raised if a numerical gradient is requested with a grad recipe"""
-
-        class DummyOp(qml.operation.Operation):
-            r"""Dummy custom operation"""
-            num_wires = 2
-            par_domain = "R"
-            grad_method = "F"
-            grad_recipe = [(0.5, 0.1)]
-
-        with pytest.raises(AssertionError, match="Gradient recipe is only used by the A method"):
-            DummyOp(0.5, wires=[0, 1])
-
     def test_grad_recipe_parameter_dependent(self):
         """Test that an operation with a gradient recipe that depends on
         its instantiated parameter values works correctly"""
@@ -165,7 +117,6 @@ class TestOperationConstruction:
         class DummyOp(qml.operation.Operation):
             r"""Dummy custom operation"""
             num_wires = 1
-            par_domain = "R"
             grad_method = "A"
 
             @property
@@ -183,7 +134,6 @@ class TestOperationConstruction:
         class DummyOp(qml.operation.Operation):
             r"""Dummy custom operation"""
             num_wires = 1
-            par_domain = "N"
             grad_method = None
 
         with pytest.raises(ValueError, match="Must specify the wires"):
@@ -195,7 +145,6 @@ class TestOperationConstruction:
         class DummyOp(qml.operation.Operation):
             r"""Dummy custom operation"""
             num_wires = 1
-            par_domain = "N"
             grad_method = None
 
             @property
@@ -211,7 +160,6 @@ class TestOperationConstruction:
         class DummyOp(qml.operation.Operation):
             r"""Dummy custom operation"""
             num_wires = 1
-            par_domain = "N"
             grad_method = None
 
         op = DummyOp(1.0, wires=0, id="test")
@@ -223,7 +171,6 @@ class TestOperationConstruction:
         class DummyOp(qml.operation.Operation):
             r"""Dummy custom operation"""
             num_wires = 1
-            par_domain = "N"
             grad_method = None
 
         op = DummyOp(1.0, wires=0, id="test")
@@ -239,7 +186,6 @@ class TestObservableConstruction:
         class DummyObserv(qml.operation.Observable):
             r"""Dummy custom observable"""
             num_wires = 1
-            par_domain = "N"
             grad_method = None
 
         assert DummyObserv(0, wires=[1]).return_type is None
@@ -250,7 +196,6 @@ class TestObservableConstruction:
         class DummyObserv(qml.operation.Observable):
             r"""Dummy custom observable"""
             num_wires = 1
-            par_domain = "N"
             grad_method = None
 
         ob = DummyObserv([1])
@@ -268,7 +213,6 @@ class TestObservableConstruction:
         class DummyObserv(qml.operation.Observable, qml.operation.Operation):
             r"""Dummy custom observable"""
             num_wires = 1
-            par_domain = "N"
             grad_method = None
 
         assert issubclass(DummyObserv, qml.operation.Operator)
@@ -313,6 +257,10 @@ class TestObservableConstruction:
         expected = "probs(wires=['a'])"
         assert str(m) == expected
 
+        m = qml.probs(op=qml.PauliZ(wires=["a"]))
+        expected = "probs(PauliZ(wires=['a']))"
+        assert str(m) == expected
+
         m = qml.PauliZ(wires=["a"]) @ qml.PauliZ(wires=["b"])
         expected = "PauliZ(wires=['a']) @ PauliZ(wires=['b'])"
         assert str(m) == expected
@@ -327,20 +275,14 @@ class TestObservableConstruction:
         class DummyObserv(qml.operation.Observable):
             r"""Dummy custom observable"""
             num_wires = 1
-            par_domain = "N"
             grad_method = None
 
         op = DummyObserv(1.0, wires=0, id="test")
         assert op.id == "test"
 
-
-class TestObservableInstantiation:
-    """Test that wires are specified when a qml.operation.Observable is instantiated"""
-
     def test_wire_is_given_in_argument(self):
         class DummyObservable(qml.operation.Observable):
             num_wires = 1
-            par_domain = None
 
         with pytest.raises(Exception, match="Must specify the wires *"):
             DummyObservable()
@@ -358,7 +300,6 @@ class TestOperatorIntegration:
         class DummyOp(qml.operation.Operation):
             r"""Dummy custom operator"""
             num_wires = qml.operation.WiresEnum.AllWires
-            par_domain = "R"
 
         @qml.qnode(dev1)
         def circuit():
@@ -382,7 +323,6 @@ class TestInverse:
         class DummyOp(qml.operation.Operation):
             r"""Dummy custom Operation"""
             num_wires = 1
-            par_domain = "R"
 
         # Check that the name of the Operation is initialized fine
         dummy_op = DummyOp(some_param, wires=[1])
@@ -1348,7 +1288,6 @@ class TestChannel:
             r"""Dummy custom channel"""
             num_wires = 1
             num_params = 1
-            par_domain = "R"
             grad_method = "F"
 
             def _kraus_matrices(self, *params):
@@ -1440,7 +1379,6 @@ class TestCVOperation:
 
         class DummyOp(qml.operation.CVOperation):
             num_wires = 1
-            par_domain = None
 
         op = DummyOp(wires=1)
 
@@ -1452,7 +1390,6 @@ class TestCVOperation:
 
         class DummyOp(qml.operation.CVOperation):
             num_wires = 1
-            par_domain = None
 
         op = DummyOp(wires=1)
 
@@ -1465,7 +1402,6 @@ class TestCVOperation:
 
         class DummyOp(qml.operation.CVOperation):
             num_wires = 1
-            par_domain = None
 
         op = DummyOp(wires=1)
 
diff --git a/tests/test_qnode.py b/tests/test_qnode.py
index 9abd291ba..2583ee35c 100644
--- a/tests/test_qnode.py
+++ b/tests/test_qnode.py
@@ -932,7 +932,6 @@ class TestTapeExpansion:
         class UnsupportedOp(qml.operation.Operation):
             num_wires = 1
             num_params = 1
-            par_domain = "R"
 
             def expand(self):
                 with qml.tape.QuantumTape() as tape:
@@ -965,7 +964,6 @@ class TestTapeExpansion:
         class UnsupportedOp(qml.operation.Operation):
             num_wires = 1
             num_params = 1
-            par_domain = "R"
 
             grad_method = "A"
             grad_recipe = ([[3 / 2, 1, np.pi / 6], [-3 / 2, 1, -np.pi / 6]],)
diff --git a/tests/test_quantum_gradients.py b/tests/test_quantum_gradients.py
index 44286e74d..8c749e01b 100644
--- a/tests/test_quantum_gradients.py
+++ b/tests/test_quantum_gradients.py
@@ -279,48 +279,36 @@ class TestCVGradient:
         assert grad_A == pytest.approx(grad_F, abs=tol)
         assert grad_A2 == pytest.approx(grad_F, abs=tol)
 
-    @pytest.mark.parametrize("name", qml.ops._cv__ops__)
-    def test_CVOperation_with_heisenberg_and_no_params(self, name, gaussian_dev, tol):
-        """An integration test for CV gates that support analytic differentiation
+    def test_CVOperation_with_heisenberg_and_no_params(self, gaussian_dev, tol):
+        """An integration test for InterferometerUnitary, a gate that supports analytic differentiation
         if succeeding the gate to be differentiated, but cannot be differentiated
-        themselves (for example, they may be Gaussian but accept no parameters).
+        itself.
 
-        This ensures that, assuming their _heisenberg_rep is defined, the quantum
+        This ensures that, assuming the _heisenberg_rep is defined, the quantum
         gradient analytic method can still be used, and returns the correct result.
         """
 
-        cls = getattr(qml.ops, name)
-        if cls.supports_heisenberg and (not cls.supports_parameter_shift):
-            U = np.array(
-                [
-                    [0.51310276 + 0.81702166j, 0.13649626 + 0.22487759j],
-                    [0.26300233 + 0.00556194j, -0.96414101 - 0.03508489j],
-                ]
-            )
-
-            if cls.num_wires <= 0:
-                w = list(range(2))
-            else:
-                w = list(range(cls.num_wires))
-
-            def circuit(x):
-                qml.Displacement(x, 0, wires=0)
+        U = np.array(
+            [
+                [0.51310276 + 0.81702166j, 0.13649626 + 0.22487759j],
+                [0.26300233 + 0.00556194j, -0.96414101 - 0.03508489j],
+            ]
+        )
 
-                if cls.par_domain == "A":
-                    cls(U, wires=w)
-                else:
-                    cls(wires=w)
-                return qml.expval(qml.X(0))
+        def circuit(x):
+            qml.Displacement(x, 0, wires=0)
+            qml.InterferometerUnitary(U, wires=[0, 1])
+            return qml.expval(qml.X(0))
 
-            qnode = qml.QNode(circuit, gaussian_dev)
-            qnode(0.5)
-            grad_F = qml.gradients.finite_diff(qnode)(0.5)
-            grad_A = qml.gradients.param_shift_cv(qnode, dev=gaussian_dev)(0.5)
-            grad_A2 = qml.gradients.param_shift_cv(qnode, dev=gaussian_dev, force_order2=True)(0.5)
+        qnode = qml.QNode(circuit, gaussian_dev)
+        qnode(0.5)
+        grad_F = qml.gradients.finite_diff(qnode)(0.5)
+        grad_A = qml.gradients.param_shift_cv(qnode, dev=gaussian_dev)(0.5)
+        grad_A2 = qml.gradients.param_shift_cv(qnode, dev=gaussian_dev, force_order2=True)(0.5)
 
-            # the different methods agree
-            assert grad_A == pytest.approx(grad_F, abs=tol)
-            assert grad_A2 == pytest.approx(grad_F, abs=tol)
+        # the different methods agree
+        assert grad_A == pytest.approx(grad_F, abs=tol)
+        assert grad_A2 == pytest.approx(grad_F, abs=tol)
 
 
 class TestQubitGradient:
diff --git a/tests/test_qubit_device.py b/tests/test_qubit_device.py
index 1c0dc21b9..cf4ac2cfd 100644
--- a/tests/test_qubit_device.py
+++ b/tests/test_qubit_device.py
@@ -304,7 +304,6 @@ class TestExtractStatistics:
         class SomeObservable(qml.operation.Observable):
             num_params = 0
             num_wires = 1
-            par_domain = "F"
             return_type = returntype
 
         obs = SomeObservable(wires=0)
@@ -333,7 +332,6 @@ class TestExtractStatistics:
         class SomeObservable(qml.operation.Observable):
             num_params = 0
             num_wires = 1
-            par_domain = "F"
             return_type = returntype
 
         obs = SomeObservable(wires=0)
@@ -353,7 +351,6 @@ class TestExtractStatistics:
         class SomeObservable(qml.operation.Observable):
             num_params = 0
             num_wires = 1
-            par_domain = "F"
             return_type = returntype
 
         obs = SomeObservable(wires=0)