diff --git a/doc/development/deprecations.rst b/doc/development/deprecations.rst index 1f267b73629..9b8b68f04d2 100644 --- a/doc/development/deprecations.rst +++ b/doc/development/deprecations.rst @@ -9,6 +9,13 @@ deprecations are listed below. Pending deprecations -------------------- +* Specifying gradient keyword arguments as any additional keyword argument to the qnode is deprecated + and will be removed in v0.42. The gradient keyword arguments should be passed to the new + keyword argument ``gradient_kwargs`` via an explicit dictionary, like ``gradient_kwargs={"h": 1e-4}``. + + - Deprecated in v0.41 + - Will be removed in v0.42 + * The `qml.gradients.hamiltonian_grad` function has been deprecated. This gradient recipe is not required with the new operator arithmetic system. diff --git a/doc/releases/changelog-dev.md b/doc/releases/changelog-dev.md index 8a22e87822a..9d7e3a50427 100644 --- a/doc/releases/changelog-dev.md +++ b/doc/releases/changelog-dev.md @@ -84,6 +84,12 @@

Deprecations 👋

+* Specifying gradient keyword arguments as any additional keyword argument to the qnode is deprecated + and will be removed in v0.42. The gradient keyword arguments should be passed to the new + keyword argument `gradient_kwargs` via an explicit dictionary. This change will improve qnode argument + validation. + [(#6828)](https://github.com/PennyLaneAI/pennylane/pull/6828) + * The `qml.gradients.hamiltonian_grad` function has been deprecated. This gradient recipe is not required with the new operator arithmetic system. [(#6849)](https://github.com/PennyLaneAI/pennylane/pull/6849) diff --git a/pennylane/workflow/qnode.py b/pennylane/workflow/qnode.py index 29430c9a645..39659dbc95e 100644 --- a/pennylane/workflow/qnode.py +++ b/pennylane/workflow/qnode.py @@ -133,7 +133,8 @@ def _validate_gradient_kwargs(gradient_kwargs: dict) -> None: elif kwarg not in qml.gradients.SUPPORTED_GRADIENT_KWARGS: warnings.warn( f"Received gradient_kwarg {kwarg}, which is not included in the list of " - "standard qnode gradient kwargs." + "standard qnode gradient kwargs. Please specify all gradient kwargs through " + "the gradient_kwargs argument as a dictionary." ) @@ -284,9 +285,7 @@ class QNode: as the name suggests. If not provided, the device will determine the best choice automatically. For usage details, please refer to the :doc:`dynamic quantum circuits page `. - - Keyword Args: - **kwargs: Any additional keyword arguments provided are passed to the differentiation + gradient_kwargs (dict): A dictionary of keyword arguments that are passed to the differentiation method. Please refer to the :mod:`qml.gradients <.gradients>` module for details on supported options for your chosen gradient transform. @@ -505,10 +504,12 @@ def __init__( device_vjp: Union[None, bool] = False, postselect_mode: Literal[None, "hw-like", "fill-shots"] = None, mcm_method: Literal[None, "deferred", "one-shot", "tree-traversal"] = None, - **gradient_kwargs, + gradient_kwargs: Optional[dict] = None, + **kwargs, ): self._init_args = locals() del self._init_args["self"] + del self._init_args["kwargs"] if logger.isEnabledFor(logging.DEBUG): logger.debug( @@ -536,7 +537,16 @@ def __init__( if not isinstance(device, qml.devices.Device): device = qml.devices.LegacyDeviceFacade(device) + gradient_kwargs = gradient_kwargs or {} + if kwargs: + if any(k in qml.gradients.SUPPORTED_GRADIENT_KWARGS for k in list(kwargs.keys())): + warnings.warn( + f"Specifying gradient keyword arguments {list(kwargs.keys())} is deprecated and will be removed in v0.42. Instead, please specify all arguments in the gradient_kwargs argument.", + qml.PennyLaneDeprecationWarning, + ) + gradient_kwargs |= kwargs _validate_gradient_kwargs(gradient_kwargs) + if "shots" in inspect.signature(func).parameters: warnings.warn( "Detected 'shots' as an argument to the given quantum function. " @@ -676,16 +686,19 @@ def circuit(x): tensor(0.5403, dtype=torch.float64) """ if not kwargs: - valid_params = ( - set(self._init_args.copy().pop("gradient_kwargs")) - | qml.gradients.SUPPORTED_GRADIENT_KWARGS - ) + valid_params = set(self._init_args.copy()) | qml.gradients.SUPPORTED_GRADIENT_KWARGS raise ValueError( f"Must specify at least one configuration property to update. Valid properties are: {valid_params}." ) original_init_args = self._init_args.copy() - gradient_kwargs = original_init_args.pop("gradient_kwargs") - original_init_args.update(gradient_kwargs) + # gradient_kwargs defaults to None + original_init_args["gradient_kwargs"] = original_init_args["gradient_kwargs"] or {} + # nested dictionary update + new_gradient_kwargs = kwargs.pop("gradient_kwargs", {}) + old_gradient_kwargs = original_init_args.get("gradient_kwargs").copy() + old_gradient_kwargs.update(new_gradient_kwargs) + kwargs["gradient_kwargs"] = old_gradient_kwargs + original_init_args.update(kwargs) updated_qn = QNode(**original_init_args) # pylint: disable=protected-access diff --git a/tests/gradients/core/test_pulse_gradient.py b/tests/gradients/core/test_pulse_gradient.py index a5a44998156..b06b7c711d0 100644 --- a/tests/gradients/core/test_pulse_gradient.py +++ b/tests/gradients/core/test_pulse_gradient.py @@ -1385,7 +1385,10 @@ def test_simple_qnode_expval(self, num_split_times, shots, tol, seed): ham_single_q_const = qml.pulse.constant * qml.PauliY(0) @qml.qnode( - dev, interface="jax", diff_method=stoch_pulse_grad, num_split_times=num_split_times + dev, + interface="jax", + diff_method=stoch_pulse_grad, + gradient_kwargs={"num_split_times": num_split_times}, ) def circuit(params): qml.evolve(ham_single_q_const)(params, T) @@ -1415,7 +1418,10 @@ def test_simple_qnode_expval_two_evolves(self, num_split_times, shots, tol, seed ham_y = qml.pulse.constant * qml.PauliX(0) @qml.qnode( - dev, interface="jax", diff_method=stoch_pulse_grad, num_split_times=num_split_times + dev, + interface="jax", + diff_method=stoch_pulse_grad, + gradient_kwargs={"num_split_times": num_split_times}, ) def circuit(params): qml.evolve(ham_x)(params[0], T_x) @@ -1444,7 +1450,10 @@ def test_simple_qnode_probs(self, num_split_times, shots, tol, seed): ham_single_q_const = qml.pulse.constant * qml.PauliY(0) @qml.qnode( - dev, interface="jax", diff_method=stoch_pulse_grad, num_split_times=num_split_times + dev, + interface="jax", + diff_method=stoch_pulse_grad, + gradient_kwargs={"num_split_times": num_split_times}, ) def circuit(params): qml.evolve(ham_single_q_const)(params, T) @@ -1471,7 +1480,10 @@ def test_simple_qnode_probs_expval(self, num_split_times, shots, tol, seed): ham_single_q_const = qml.pulse.constant * qml.PauliY(0) @qml.qnode( - dev, interface="jax", diff_method=stoch_pulse_grad, num_split_times=num_split_times + dev, + interface="jax", + diff_method=stoch_pulse_grad, + gradient_kwargs={"num_split_times": num_split_times}, ) def circuit(params): qml.evolve(ham_single_q_const)(params, T) @@ -1504,7 +1516,10 @@ def test_simple_qnode_jit(self, num_split_times, time_interface): ham_single_q_const = qml.pulse.constant * qml.PauliY(0) @qml.qnode( - dev, interface="jax", diff_method=stoch_pulse_grad, num_split_times=num_split_times + dev, + interface="jax", + diff_method=stoch_pulse_grad, + gradient_kwargs={"num_split_times": num_split_times}, ) def circuit(params, T=None): qml.evolve(ham_single_q_const)(params, T) @@ -1543,8 +1558,7 @@ def ansatz(params): dev, interface="jax", diff_method=stoch_pulse_grad, - num_split_times=num_split_times, - sampler_seed=seed, + gradient_kwargs={"num_split_times": num_split_times, "sampler_seed": seed}, ) qnode_backprop = qml.QNode(ansatz, dev, interface="jax") @@ -1575,8 +1589,7 @@ def test_qnode_probs_expval_broadcasting(self, num_split_times, shots, tol, seed dev, interface="jax", diff_method=stoch_pulse_grad, - num_split_times=num_split_times, - use_broadcasting=True, + gradient_kwargs={"num_split_times": num_split_times, "use_broadcasting": True}, ) def circuit(params): qml.evolve(ham_single_q_const)(params, T) @@ -1620,18 +1633,22 @@ def ansatz(params): dev, interface="jax", diff_method=stoch_pulse_grad, - num_split_times=num_split_times, - use_broadcasting=True, - sampler_seed=seed, + gradient_kwargs={ + "num_split_times": num_split_times, + "use_broadcasting": True, + "sampler_seed": seed, + }, ) circuit_no_bc = qml.QNode( ansatz, dev, interface="jax", diff_method=stoch_pulse_grad, - num_split_times=num_split_times, - use_broadcasting=False, - sampler_seed=seed, + gradient_kwargs={ + "num_split_times": num_split_times, + "use_broadcasting": False, + "sampler_seed": seed, + }, ) params = [jnp.array(0.4)] jac_bc = jax.jacobian(circuit_bc)(params) @@ -1685,9 +1702,7 @@ def ansatz(params): dev, interface="jax", diff_method=qml.gradients.stoch_pulse_grad, - num_split_times=7, - use_broadcasting=True, - sampler_seed=seed, + gradient_kwargs={"num_split_times": 7, "sampler_seed": seed, "use_broadcasting": True}, ) cost_jax = qml.QNode(ansatz, dev, interface="jax") params = (0.42,) @@ -1730,9 +1745,7 @@ def ansatz(params): dev, interface="jax", diff_method=qml.gradients.stoch_pulse_grad, - num_split_times=7, - use_broadcasting=True, - sampler_seed=seed, + gradient_kwargs={"num_split_times": 7, "sampler_seed": seed, "use_broadcasting": True}, ) cost_jax = qml.QNode(ansatz, dev, interface="jax") diff --git a/tests/gradients/finite_diff/test_spsa_gradient.py b/tests/gradients/finite_diff/test_spsa_gradient.py index 1bd2a198bca..413bc8ff6ec 100644 --- a/tests/gradients/finite_diff/test_spsa_gradient.py +++ b/tests/gradients/finite_diff/test_spsa_gradient.py @@ -161,7 +161,7 @@ def test_invalid_sampler_rng(self): """Tests that if sampler_rng has an unexpected type, an error is raised.""" dev = qml.device("default.qubit", wires=1) - @qml.qnode(dev, diff_method="spsa", sampler_rng="foo") + @qml.qnode(dev, diff_method="spsa", gradient_kwargs={"sampler_rng": "foo"}) def circuit(param): qml.RX(param, wires=0) return qml.expval(qml.PauliZ(0)) diff --git a/tests/gradients/parameter_shift/test_cv_gradients.py b/tests/gradients/parameter_shift/test_cv_gradients.py index c9709753283..55955396ab7 100644 --- a/tests/gradients/parameter_shift/test_cv_gradients.py +++ b/tests/gradients/parameter_shift/test_cv_gradients.py @@ -268,7 +268,11 @@ def qf(x, y): grad_F = jax.grad(qf)(*par) - @qml.qnode(device=gaussian_dev, diff_method="parameter-shift", force_order2=True) + @qml.qnode( + device=gaussian_dev, + diff_method="parameter-shift", + gradient_kwargs={"force_order2": True}, + ) def qf2(x, y): qml.Displacement(0.5, 0, wires=[0]) qml.Squeezing(x, 0, wires=[0]) diff --git a/tests/gradients/parameter_shift/test_parameter_shift_shot_vec.py b/tests/gradients/parameter_shift/test_parameter_shift_shot_vec.py index 72e00eac0b0..e3151735e98 100644 --- a/tests/gradients/parameter_shift/test_parameter_shift_shot_vec.py +++ b/tests/gradients/parameter_shift/test_parameter_shift_shot_vec.py @@ -1970,12 +1970,12 @@ def expval(self, observable, **kwargs): dev = DeviceSupporingSpecialObservable(wires=1, shots=None) - @qml.qnode(dev, diff_method="parameter-shift", broadcast=broadcast) + @qml.qnode(dev, diff_method="parameter-shift", gradient_kwargs={"broadcast": broadcast}) def qnode(x): qml.RY(x, wires=0) return qml.expval(SpecialObservable(wires=0)) - @qml.qnode(dev, diff_method="parameter-shift", broadcast=broadcast) + @qml.qnode(dev, diff_method="parameter-shift", gradient_kwargs={"broadcast": broadcast}) def reference_qnode(x): qml.RY(x, wires=0) return qml.expval(qml.PauliZ(wires=0)) diff --git a/tests/resource/test_specs.py b/tests/resource/test_specs.py index a02b35ef97b..5a5764e7153 100644 --- a/tests/resource/test_specs.py +++ b/tests/resource/test_specs.py @@ -33,10 +33,15 @@ class TestSpecsTransform: """Tests for the transform specs using the QNode""" def sample_circuit(self): + @qml.transforms.merge_rotations @qml.transforms.undo_swaps @qml.transforms.cancel_inverses - @qml.qnode(qml.device("default.qubit"), diff_method="parameter-shift", shifts=pnp.pi / 4) + @qml.qnode( + qml.device("default.qubit"), + diff_method="parameter-shift", + gradient_kwargs={"shifts": pnp.pi / 4}, + ) def circuit(x): qml.RandomLayers(qml.numpy.array([[1.0, 2.0]]), wires=(0, 1)) qml.RX(x, wires=0) @@ -222,7 +227,11 @@ def test_splitting_transforms(self): @qml.transforms.split_non_commuting @qml.transforms.merge_rotations - @qml.qnode(qml.device("default.qubit"), diff_method="parameter-shift", shifts=pnp.pi / 4) + @qml.qnode( + qml.device("default.qubit"), + diff_method="parameter-shift", + gradient_kwargs={"shifts": pnp.pi / 4}, + ) def circuit(x): qml.RandomLayers(qml.numpy.array([[1.0, 2.0]]), wires=(0, 1)) qml.RX(x, wires=0) diff --git a/tests/templates/test_state_preparations/test_mottonen_state_prep.py b/tests/templates/test_state_preparations/test_mottonen_state_prep.py index 885def86e60..a63a2d20129 100644 --- a/tests/templates/test_state_preparations/test_mottonen_state_prep.py +++ b/tests/templates/test_state_preparations/test_mottonen_state_prep.py @@ -431,7 +431,7 @@ def circuit(coeffs): qml.MottonenStatePreparation(coeffs, wires=[0, 1]) return qml.probs(wires=[0, 1]) - circuit_fd = qml.QNode(circuit, dev, diff_method="finite-diff", h=0.05) + circuit_fd = qml.QNode(circuit, dev, diff_method="finite-diff", gradient_kwargs={"h": 0.05}) circuit_ps = qml.QNode(circuit, dev, diff_method="parameter-shift") circuit_exact = qml.QNode(circuit, dev_no_shots) diff --git a/tests/test_qnode.py b/tests/test_qnode.py index c60ae352e4b..ec141af64e7 100644 --- a/tests/test_qnode.py +++ b/tests/test_qnode.py @@ -36,6 +36,17 @@ def dummyfunc(): return None +def test_additional_kwargs_is_deprecated(): + """Test that passing gradient_kwargs as additional kwargs raises a deprecation warning.""" + dev = qml.device("default.qubit", wires=1) + + with pytest.warns( + qml.PennyLaneDeprecationWarning, + match=r"Specifying gradient keyword arguments \[\'atol\'\] is deprecated", + ): + QNode(dummyfunc, dev, atol=1) + + # pylint: disable=unused-argument class CustomDevice(qml.devices.Device): """A null device that just returns 0.""" @@ -145,24 +156,21 @@ def test_update_gradient_kwargs(self): """Test that gradient kwargs are updated correctly""" dev = qml.device("default.qubit") - @qml.qnode(dev, atol=1) + @qml.qnode(dev, gradient_kwargs={"atol": 1}) def circuit(x): qml.RZ(x, wires=0) qml.CNOT(wires=[0, 1]) qml.RY(x, wires=1) return qml.expval(qml.PauliZ(1)) - assert len(circuit.gradient_kwargs) == 1 - assert list(circuit.gradient_kwargs.keys()) == ["atol"] + assert set(circuit.gradient_kwargs.keys()) == {"atol"} - new_atol_circuit = circuit.update(atol=2) - assert len(new_atol_circuit.gradient_kwargs) == 1 - assert list(new_atol_circuit.gradient_kwargs.keys()) == ["atol"] + new_atol_circuit = circuit.update(gradient_kwargs={"atol": 2}) + assert set(new_atol_circuit.gradient_kwargs.keys()) == {"atol"} assert new_atol_circuit.gradient_kwargs["atol"] == 2 - new_kwarg_circuit = circuit.update(h=1) - assert len(new_kwarg_circuit.gradient_kwargs) == 2 - assert list(new_kwarg_circuit.gradient_kwargs.keys()) == ["atol", "h"] + new_kwarg_circuit = circuit.update(gradient_kwargs={"h": 1}) + assert set(new_kwarg_circuit.gradient_kwargs.keys()) == {"atol", "h"} assert new_kwarg_circuit.gradient_kwargs["atol"] == 1 assert new_kwarg_circuit.gradient_kwargs["h"] == 1 @@ -170,7 +178,7 @@ def circuit(x): UserWarning, match="Received gradient_kwarg blah, which is not included in the list of standard qnode gradient kwargs.", ): - circuit.update(blah=1) + circuit.update(gradient_kwargs={"blah": 1}) def test_update_multiple_arguments(self): """Test that multiple parameters can be updated at once.""" @@ -194,7 +202,7 @@ def test_update_transform_program(self): dev = qml.device("default.qubit", wires=2) @qml.transforms.combine_global_phases - @qml.qnode(dev, atol=1) + @qml.qnode(dev) def circuit(x): qml.RZ(x, wires=0) qml.GlobalPhase(phi=1) @@ -248,7 +256,7 @@ def circuit(return_type): def test_expansion_strategy_error(self): """Test that an error is raised if expansion_strategy is passed to the qnode.""" - with pytest.raises(ValueError, match=r"'expansion_strategy' is no longer"): + with pytest.raises(ValueError, match="'expansion_strategy' is no longer"): @qml.qnode(qml.device("default.qubit"), expansion_strategy="device") def _(): @@ -453,7 +461,7 @@ def test_unrecognized_kwargs_raise_warning(self): with warnings.catch_warnings(record=True) as w: - @qml.qnode(dev, random_kwarg=qml.gradients.finite_diff) + @qml.qnode(dev, gradient_kwargs={"random_kwarg": qml.gradients.finite_diff}) def circuit(params): qml.RX(params[0], wires=0) return qml.expval(qml.PauliZ(0)), qml.var(qml.PauliZ(0)) @@ -846,7 +854,7 @@ def test_single_expectation_value_with_argnum_one(self, diff_method, tol): y = pnp.array(-0.654, requires_grad=True) @qnode( - dev, diff_method=diff_method, argnum=[1] + dev, diff_method=diff_method, gradient_kwargs={"argnum": [1]} ) # <--- we only choose one trainable parameter def circuit(x, y): qml.RX(x, wires=[0]) @@ -1320,11 +1328,11 @@ def ansatz0(): return qml.expval(qml.X(0)) with pytest.raises(ValueError, match="'shots' is not a valid gradient_kwarg."): - qml.QNode(ansatz0, dev, shots=100) + qml.QNode(ansatz0, dev, gradient_kwargs={"shots": 100}) with pytest.raises(ValueError, match="'shots' is not a valid gradient_kwarg."): - @qml.qnode(dev, shots=100) + @qml.qnode(dev, gradient_kwargs={"shots": 100}) def _(): return qml.expval(qml.X(0)) diff --git a/tests/test_qnode_legacy.py b/tests/test_qnode_legacy.py index 26c46687934..5a8c63c7d22 100644 --- a/tests/test_qnode_legacy.py +++ b/tests/test_qnode_legacy.py @@ -201,7 +201,7 @@ def test_unrecognized_kwargs_raise_warning(self): with warnings.catch_warnings(record=True) as w: - @qml.qnode(dev, random_kwarg=qml.gradients.finite_diff) + @qml.qnode(dev, gradient_kwargs={"random_kwarg": qml.gradients.finite_diff}) def circuit(params): qml.RX(params[0], wires=0) return qml.expval(qml.PauliZ(0)), qml.var(qml.PauliZ(0)) @@ -627,7 +627,7 @@ def test_single_expectation_value_with_argnum_one(self, diff_method, tol): y = pnp.array(-0.654, requires_grad=True) @qnode( - dev, diff_method=diff_method, argnum=[1] + dev, diff_method=diff_method, gradient_kwargs={"argnum": [1]} ) # <--- we only choose one trainable parameter def circuit(x, y): qml.RX(x, wires=[0]) diff --git a/tests/transforms/test_add_noise.py b/tests/transforms/test_add_noise.py index 779dcf91e36..3beab611105 100644 --- a/tests/transforms/test_add_noise.py +++ b/tests/transforms/test_add_noise.py @@ -414,7 +414,7 @@ def test_add_noise_level(self, level1, level2): @qml.transforms.undo_swaps @qml.transforms.merge_rotations @qml.transforms.cancel_inverses - @qml.qnode(dev, diff_method="parameter-shift", shifts=np.pi / 4) + @qml.qnode(dev, diff_method="parameter-shift", gradient_kwargs={"shifts": np.pi / 4}) def f(w, x, y, z): qml.RX(w, wires=0) qml.RY(x, wires=1) @@ -447,7 +447,7 @@ def test_add_noise_level_with_final(self): @qml.transforms.undo_swaps @qml.transforms.merge_rotations @qml.transforms.cancel_inverses - @qml.qnode(dev, diff_method="parameter-shift", shifts=np.pi / 4) + @qml.qnode(dev, diff_method="parameter-shift", gradient_kwargs={"shifts": np.pi / 4}) def f(w, x, y, z): qml.RX(w, wires=0) qml.RY(x, wires=1) diff --git a/tests/workflow/interfaces/qnode/test_autograd_qnode.py b/tests/workflow/interfaces/qnode/test_autograd_qnode.py index ac30592926b..18e5f70cb83 100644 --- a/tests/workflow/interfaces/qnode/test_autograd_qnode.py +++ b/tests/workflow/interfaces/qnode/test_autograd_qnode.py @@ -137,14 +137,15 @@ def test_jacobian(self, interface, dev, diff_method, grad_on_execution, tol, dev device_vjp=device_vjp, ) + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA a = np.array(0.1, requires_grad=True) b = np.array(0.2, requires_grad=True) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(a, b): qml.RY(a, wires=0) qml.RX(b, wires=1) @@ -183,14 +184,15 @@ def test_jacobian_no_evaluate( grad_on_execution=grad_on_execution, device_vjp=device_vjp, ) + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA a = np.array(0.1, requires_grad=True) b = np.array(0.2, requires_grad=True) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(a, b): qml.RY(a, wires=0) qml.RX(b, wires=1) @@ -222,13 +224,14 @@ def test_jacobian_options(self, interface, dev, diff_method, grad_on_execution, a = np.array([0.1, 0.2], requires_grad=True) + gradient_kwargs = {"h": 1e-8, "approx_order": 2} + @qnode( dev, interface=interface, - h=1e-8, - order=2, grad_on_execution=grad_on_execution, device_vjp=device_vjp, + gradient_kwargs=gradient_kwargs, ) def circuit(a): qml.RY(a[0], wires=0) @@ -408,10 +411,10 @@ def test_differentiable_expand( grad_on_execution=grad_on_execution, device_vjp=device_vjp, ) - + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) - kwargs["num_directions"] = 10 + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["num_directions"] = 10 tol = TOL_FOR_SPSA # pylint: disable=too-few-public-methods @@ -429,7 +432,7 @@ def decomposition(self): a = np.array(0.1, requires_grad=False) p = np.array([0.1, 0.2, 0.3], requires_grad=True) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(a, p): qml.RX(a, wires=0) U3(p[0], p[1], p[2], wires=0) @@ -555,15 +558,15 @@ def test_probability_differentiation( grad_on_execution=grad_on_execution, device_vjp=device_vjp, ) - + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA x = np.array(0.543, requires_grad=True) y = np.array(-0.654, requires_grad=True) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -593,14 +596,15 @@ def test_multiple_probability_differentiation( device_vjp=device_vjp, ) + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA x = np.array(0.543, requires_grad=True) y = np.array(-0.654, requires_grad=True) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -660,14 +664,15 @@ def test_ragged_differentiation( device_vjp=device_vjp, ) + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA x = np.array(0.543, requires_grad=True) y = np.array(-0.654, requires_grad=True) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -711,8 +716,9 @@ def test_ragged_differentiation_variance( device_vjp=device_vjp, ) + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA elif diff_method == "hadamard": pytest.skip("Hadamard gradient does not support variances.") @@ -720,7 +726,7 @@ def test_ragged_differentiation_variance( x = np.array(0.543, requires_grad=True) y = np.array(-0.654, requires_grad=True) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -826,12 +832,13 @@ def test_chained_gradient_value( device_vjp=device_vjp, ) + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA dev1 = qml.device("default.qubit") - @qnode(dev1, **kwargs) + @qnode(dev1, **kwargs, gradient_kwargs=gradient_kwargs) def circuit1(a, b, c): qml.RX(a, wires=0) qml.RX(b, wires=1) @@ -1350,8 +1357,9 @@ def test_projector( device_vjp=device_vjp, ) + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA elif diff_method == "hadamard": pytest.skip("Hadamard gradient does not support variances.") @@ -1359,7 +1367,7 @@ def test_projector( P = np.array(state, requires_grad=False) x, y = np.array([0.765, -0.654], requires_grad=True) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=0) qml.RY(y, wires=1) @@ -1498,16 +1506,17 @@ def test_hamiltonian_expansion_analytic( device_vjp=device_vjp, ) + gradient_kwargs = {} if diff_method in ["adjoint", "hadamard"]: pytest.skip("The diff method requested does not yet support Hamiltonians") elif diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) - kwargs["num_directions"] = 10 + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["num_directions"] = 10 tol = TOL_FOR_SPSA obs = [qml.PauliX(0), qml.PauliX(0) @ qml.PauliZ(1), qml.PauliZ(0) @ qml.PauliZ(1)] - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(data, weights, coeffs): weights = weights.reshape(1, -1) qml.templates.AngleEmbedding(data, wires=[0, 1]) @@ -1584,7 +1593,7 @@ def test_hamiltonian_finite_shots( grad_on_execution=grad_on_execution, max_diff=max_diff, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(data, weights, coeffs): weights = weights.reshape(1, -1) diff --git a/tests/workflow/interfaces/qnode/test_autograd_qnode_shot_vector.py b/tests/workflow/interfaces/qnode/test_autograd_qnode_shot_vector.py index 87e534fdb52..54072ae442e 100644 --- a/tests/workflow/interfaces/qnode/test_autograd_qnode_shot_vector.py +++ b/tests/workflow/interfaces/qnode/test_autograd_qnode_shot_vector.py @@ -52,7 +52,7 @@ def test_jac_single_measurement_param( """For one measurement and one param, the gradient is a float.""" dev = qml.device(dev_name, wires=1, shots=shots) - @qnode(dev, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a, wires=0) qml.RX(0.2, wires=0) @@ -74,7 +74,7 @@ def test_jac_single_measurement_multiple_param( """For one measurement and multiple param, the gradient is a tuple of arrays.""" dev = qml.device(dev_name, wires=1, shots=shots) - @qnode(dev, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a, b): qml.RY(a, wires=0) qml.RX(b, wires=0) @@ -100,7 +100,7 @@ def test_jacobian_single_measurement_multiple_param_array( """For one measurement and multiple param as a single array params, the gradient is an array.""" dev = qml.device(dev_name, wires=1, shots=shots) - @qnode(dev, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a[0], wires=0) qml.RX(a[1], wires=0) @@ -123,7 +123,7 @@ def test_jacobian_single_measurement_param_probs( dimension""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a, wires=0) qml.RX(0.2, wires=0) @@ -146,7 +146,7 @@ def test_jacobian_single_measurement_probs_multiple_param( the correct dimension""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a, b): qml.RY(a, wires=0) qml.RX(b, wires=0) @@ -173,7 +173,7 @@ def test_jacobian_single_measurement_probs_multiple_param_single_array( the correct dimension""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a[0], wires=0) qml.RX(a[1], wires=0) @@ -198,7 +198,7 @@ def test_jacobian_expval_expval_multiple_params( par_0 = np.array(0.1) par_1 = np.array(0.2) - @qnode(dev, diff_method=diff_method, max_diff=1, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, max_diff=1, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -223,7 +223,7 @@ def test_jacobian_expval_expval_multiple_params_array( """The jacobian of multiple measurements with a multiple params array return a single array.""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a[0], wires=0) qml.RX(a[1], wires=0) @@ -250,7 +250,7 @@ def test_jacobian_var_var_multiple_params( par_0 = np.array(0.1) par_1 = np.array(0.2) - @qnode(dev, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -275,7 +275,7 @@ def test_jacobian_var_var_multiple_params_array( """The jacobian of multiple measurements with a multiple params array return a single array.""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a[0], wires=0) qml.RX(a[1], wires=0) @@ -299,7 +299,7 @@ def test_jacobian_multiple_measurement_single_param( """The jacobian of multiple measurements with a single params return an array.""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a, wires=0) qml.RX(0.2, wires=0) @@ -322,7 +322,7 @@ def test_jacobian_multiple_measurement_multiple_param( """The jacobian of multiple measurements with a multiple params return a tuple of arrays.""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a, b): qml.RY(a, wires=0) qml.RX(b, wires=0) @@ -349,7 +349,7 @@ def test_jacobian_multiple_measurement_multiple_param_array( """The jacobian of multiple measurements with a multiple params array return a single array.""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a[0], wires=0) qml.RX(a[1], wires=0) @@ -382,7 +382,7 @@ def test_hessian_expval_multiple_params( par_0 = np.array(0.1) par_1 = np.array(0.2) - @qnode(dev, diff_method=diff_method, max_diff=2, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, max_diff=2, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -412,7 +412,7 @@ def test_hessian_expval_multiple_param_array( params = np.array([0.1, 0.2]) - @qnode(dev, diff_method=diff_method, max_diff=2, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, max_diff=2, gradient_kwargs=gradient_kwargs) def circuit(x): qml.RX(x[0], wires=[0]) qml.RY(x[1], wires=[1]) @@ -440,7 +440,7 @@ def test_hessian_var_multiple_params( par_0 = np.array(0.1) par_1 = np.array(0.2) - @qnode(dev, diff_method=diff_method, max_diff=2, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, max_diff=2, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -470,7 +470,7 @@ def test_hessian_var_multiple_param_array( params = np.array([0.1, 0.2]) - @qnode(dev, diff_method=diff_method, max_diff=2, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, max_diff=2, gradient_kwargs=gradient_kwargs) def circuit(x): qml.RX(x[0], wires=[0]) qml.RY(x[1], wires=[1]) @@ -500,7 +500,7 @@ def test_hessian_probs_expval_multiple_params( par_0 = np.array(0.1) par_1 = np.array(0.2) - @qnode(dev, diff_method=diff_method, max_diff=2, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, max_diff=2, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -533,7 +533,7 @@ def test_hessian_expval_probs_multiple_param_array( params = np.array([0.1, 0.2]) - @qnode(dev, diff_method=diff_method, max_diff=2, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, max_diff=2, gradient_kwargs=gradient_kwargs) def circuit(x): qml.RX(x[0], wires=[0]) qml.RY(x[1], wires=[1]) @@ -571,7 +571,7 @@ def test_single_expectation_value( x = np.array(0.543) y = np.array(-0.654) - @qnode(dev, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -604,7 +604,7 @@ def test_prob_expectation_values( x = np.array(0.543) y = np.array(-0.654) - @qnode(dev, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) diff --git a/tests/workflow/interfaces/qnode/test_jax_jit_qnode.py b/tests/workflow/interfaces/qnode/test_jax_jit_qnode.py index 862806999c6..02a586be118 100644 --- a/tests/workflow/interfaces/qnode/test_jax_jit_qnode.py +++ b/tests/workflow/interfaces/qnode/test_jax_jit_qnode.py @@ -230,7 +230,7 @@ def decomposition(self): interface=interface, grad_on_execution=grad_on_execution, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(a, p): qml.RX(a, wires=0) @@ -266,14 +266,15 @@ def test_jacobian_options( a = np.array([0.1, 0.2], requires_grad=True) + gradient_kwargs = {"h": 1e-8, "approx_order": 2} + @qnode( get_device(dev_name, wires=1, seed=seed), interface=interface, diff_method="finite-diff", - h=1e-8, - approx_order=2, grad_on_execution=grad_on_execution, device_vjp=device_vjp, + gradient_kwargs=gradient_kwargs, ) def circuit(a): qml.RY(a[0], wires=0) @@ -323,7 +324,7 @@ def test_diff_expval_expval( interface=interface, grad_on_execution=grad_on_execution, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(a, b): qml.RY(a, wires=0) @@ -389,7 +390,7 @@ def test_jacobian_no_evaluate( interface=interface, grad_on_execution=grad_on_execution, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(a, b): qml.RY(a, wires=0) @@ -456,7 +457,7 @@ def test_diff_single_probs( interface=interface, grad_on_execution=grad_on_execution, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x, y): qml.RX(x, wires=[0]) @@ -512,7 +513,7 @@ def test_diff_multi_probs( interface=interface, grad_on_execution=grad_on_execution, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x, y): qml.RX(x, wires=[0]) @@ -601,7 +602,7 @@ def test_diff_expval_probs( interface=interface, grad_on_execution=grad_on_execution, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x, y): qml.RX(x, wires=[0]) @@ -679,7 +680,7 @@ def test_diff_expval_probs_sub_argnums( interface=interface, grad_on_execution=grad_on_execution, device_vjp=device_vjp, - **kwargs, + gradient_kwargs=kwargs, ) def circuit(x, y): qml.RX(x, wires=[0]) @@ -740,7 +741,7 @@ def test_diff_var_probs( interface=interface, grad_on_execution=grad_on_execution, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x, y): qml.RX(x, wires=[0]) @@ -1130,7 +1131,7 @@ def test_second_derivative( grad_on_execution=grad_on_execution, device_vjp=device_vjp, max_diff=2, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x): qml.RY(x[0], wires=0) @@ -1183,7 +1184,7 @@ def test_hessian( grad_on_execution=grad_on_execution, device_vjp=device_vjp, max_diff=2, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x): qml.RY(x[0], wires=0) @@ -1237,7 +1238,7 @@ def test_hessian_vector_valued( grad_on_execution=grad_on_execution, device_vjp=device_vjp, max_diff=2, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x): qml.RY(x[0], wires=0) @@ -1300,7 +1301,7 @@ def test_hessian_vector_valued_postprocessing( grad_on_execution=grad_on_execution, device_vjp=device_vjp, max_diff=2, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x): qml.RX(x[0], wires=0) @@ -1366,7 +1367,7 @@ def test_hessian_vector_valued_separate_args( grad_on_execution=grad_on_execution, max_diff=2, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(a, b): qml.RY(a, wires=0) @@ -1478,7 +1479,7 @@ def test_projector( interface=interface, grad_on_execution=grad_on_execution, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x, y): qml.RX(x, wires=0) @@ -1593,7 +1594,7 @@ def test_hamiltonian_expansion_analytic( grad_on_execution=grad_on_execution, max_diff=max_diff, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(data, weights, coeffs): weights = weights.reshape(1, -1) @@ -1663,7 +1664,7 @@ def test_hamiltonian_finite_shots( grad_on_execution=grad_on_execution, max_diff=max_diff, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(data, weights, coeffs): weights = weights.reshape(1, -1) @@ -1862,7 +1863,7 @@ def test_gradient( interface=interface, grad_on_execution=grad_on_execution, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x): qml.RY(x[0], wires=0) @@ -2013,7 +2014,7 @@ def test_gradient_scalar_cost_vector_valued_qnode( interface=interface, grad_on_execution=grad_on_execution, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x, y): qml.RX(x, wires=[0]) @@ -3062,7 +3063,7 @@ def test_single_measurement( grad_on_execution=grad_on_execution, cache=False, device_vjp=device_vjp, - **kwargs, + gradient_kwargs=kwargs, ) def circuit(a, b): qml.RY(a, wires=0) @@ -3123,7 +3124,7 @@ def test_multi_measurements( diff_method=diff_method, grad_on_execution=grad_on_execution, device_vjp=device_vjp, - **kwargs, + gradient_kwargs=kwargs, ) def circuit(a, b): qml.RY(a, wires=0) diff --git a/tests/workflow/interfaces/qnode/test_jax_qnode.py b/tests/workflow/interfaces/qnode/test_jax_qnode.py index ae1cb53a398..ae7ea130193 100644 --- a/tests/workflow/interfaces/qnode/test_jax_qnode.py +++ b/tests/workflow/interfaces/qnode/test_jax_qnode.py @@ -188,10 +188,10 @@ def test_differentiable_expand( "grad_on_execution": grad_on_execution, "device_vjp": device_vjp, } - + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) - kwargs["num_directions"] = 10 + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["num_directions"] = 10 tol = TOL_FOR_SPSA class U3(qml.U3): # pylint:disable=too-few-public-methods @@ -206,7 +206,7 @@ def decomposition(self): a = jax.numpy.array(0.1) p = jax.numpy.array([0.1, 0.2, 0.3]) - @qnode(get_device(dev_name, wires=1, seed=seed), **kwargs) + @qnode(get_device(dev_name, wires=1, seed=seed), **kwargs, gradient_kwargs=gradient_kwargs) def circuit(a, p): qml.RX(a, wires=0) U3(p[0], p[1], p[2], wires=0) @@ -240,12 +240,13 @@ def test_jacobian_options( a = jax.numpy.array([0.1, 0.2]) + gradient_kwargs = {"h": 1e-8, "approx_order": 2} + @qnode( get_device(dev_name, wires=1, seed=seed), interface=interface, diff_method="finite-diff", - h=1e-8, - approx_order=2, + gradient_kwargs=gradient_kwargs, ) def circuit(a): qml.RY(a[0], wires=0) @@ -273,9 +274,9 @@ def test_diff_expval_expval( "grad_on_execution": grad_on_execution, "device_vjp": device_vjp, } - + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA if "lightning" in dev_name: pytest.xfail("lightning device_vjp not compatible with jax.jacobian.") @@ -283,7 +284,7 @@ def test_diff_expval_expval( a = jax.numpy.array(0.1) b = jax.numpy.array(0.2) - @qnode(get_device(dev_name, wires=2, seed=seed), **kwargs) + @qnode(get_device(dev_name, wires=2, seed=seed), **kwargs, gradient_kwargs=gradient_kwargs) def circuit(a, b): qml.RY(a, wires=0) qml.RX(b, wires=1) @@ -334,14 +335,15 @@ def test_jacobian_no_evaluate( if "lightning" in dev_name: pytest.xfail("lightning device_vjp not compatible with jax.jacobian.") + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA a = jax.numpy.array(0.1) b = jax.numpy.array(0.2) - @qnode(get_device(dev_name, wires=2, seed=seed), **kwargs) + @qnode(get_device(dev_name, wires=2, seed=seed), **kwargs, gradient_kwargs=gradient_kwargs) def circuit(a, b): qml.RY(a, wires=0) qml.RX(b, wires=1) @@ -387,8 +389,9 @@ def test_diff_single_probs( "grad_on_execution": grad_on_execution, "device_vjp": device_vjp, } + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA if "lightning" in dev_name: pytest.xfail("lightning device_vjp not compatible with jax.jacobian.") @@ -396,7 +399,7 @@ def test_diff_single_probs( x = jax.numpy.array(0.543) y = jax.numpy.array(-0.654) - @qnode(get_device(dev_name, wires=2, seed=seed), **kwargs) + @qnode(get_device(dev_name, wires=2, seed=seed), **kwargs, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -436,8 +439,9 @@ def test_diff_multi_probs( "device_vjp": device_vjp, } + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA if "lightning" in dev_name: pytest.xfail("lightning device_vjp not compatible with jax.jacobian.") @@ -445,7 +449,7 @@ def test_diff_multi_probs( x = jax.numpy.array(0.543) y = jax.numpy.array(-0.654) - @qnode(get_device(dev_name, wires=1, seed=seed), **kwargs) + @qnode(get_device(dev_name, wires=1, seed=seed), **kwargs, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -517,8 +521,9 @@ def test_diff_expval_probs( "grad_on_execution": grad_on_execution, "device_vjp": device_vjp, } + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA if "lightning" in dev_name: pytest.xfail("lightning device_vjp not compatible with jax.jacobian.") @@ -526,7 +531,7 @@ def test_diff_expval_probs( x = jax.numpy.array(0.543) y = jax.numpy.array(-0.654) - @qnode(get_device(dev_name, wires=1, seed=seed), **kwargs) + @qnode(get_device(dev_name, wires=1, seed=seed), **kwargs, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -599,7 +604,7 @@ def test_diff_expval_probs_sub_argnums( interface=interface, grad_on_execution=grad_on_execution, device_vjp=device_vjp, - **kwargs, + gradient_kwargs=kwargs, ) def circuit(x, y): qml.RX(x, wires=[0]) @@ -646,18 +651,19 @@ def test_diff_var_probs( "device_vjp": device_vjp, } + gradient_kwargs = {} if diff_method == "hadamard": pytest.skip("Hadamard does not support var") if "lightning" in dev_name: pytest.xfail("lightning device_vjp not compatible with jax.jacobian.") elif diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA x = jax.numpy.array(0.543) y = jax.numpy.array(-0.654) - @qnode(get_device(dev_name, wires=1, seed=seed), **kwargs) + @qnode(get_device(dev_name, wires=1, seed=seed), **kwargs, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -968,13 +974,14 @@ def test_second_derivative( "max_diff": 2, } + gradient_kwargs = {} if diff_method == "adjoint": pytest.skip("Adjoint does not second derivative.") elif diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA - @qnode(get_device(dev_name, wires=0, seed=seed), **kwargs) + @qnode(get_device(dev_name, wires=0, seed=seed), **kwargs, gradient_kwargs=gradient_kwargs) def circuit(x): qml.RY(x[0], wires=0) qml.RX(x[1], wires=0) @@ -1024,7 +1031,7 @@ def test_hessian( grad_on_execution=grad_on_execution, device_vjp=device_vjp, max_diff=2, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x): qml.RY(x[0], wires=0) @@ -1079,7 +1086,7 @@ def test_hessian_vector_valued( grad_on_execution=grad_on_execution, device_vjp=device_vjp, max_diff=2, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x): qml.RY(x[0], wires=0) @@ -1142,7 +1149,7 @@ def test_hessian_vector_valued_postprocessing( grad_on_execution=grad_on_execution, device_vjp=device_vjp, max_diff=2, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x): qml.RX(x[0], wires=0) @@ -1208,7 +1215,7 @@ def test_hessian_vector_valued_separate_args( grad_on_execution=grad_on_execution, device_vjp=device_vjp, max_diff=2, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(a, b): qml.RY(a, wires=0) @@ -1316,7 +1323,7 @@ def test_projector( interface=interface, grad_on_execution=grad_on_execution, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x, y): qml.RX(x, wires=0) @@ -1425,7 +1432,7 @@ def test_split_non_commuting_analytic( grad_on_execution=grad_on_execution, device_vjp=device_vjp, max_diff=max_diff, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(data, weights, coeffs): weights = weights.reshape(1, -1) @@ -1513,7 +1520,7 @@ def test_hamiltonian_finite_shots( grad_on_execution=grad_on_execution, device_vjp=device_vjp, max_diff=max_diff, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(data, weights, coeffs): weights = weights.reshape(1, -1) diff --git a/tests/workflow/interfaces/qnode/test_jax_qnode_shot_vector.py b/tests/workflow/interfaces/qnode/test_jax_qnode_shot_vector.py index 697a1e90223..210ba601586 100644 --- a/tests/workflow/interfaces/qnode/test_jax_qnode_shot_vector.py +++ b/tests/workflow/interfaces/qnode/test_jax_qnode_shot_vector.py @@ -60,7 +60,7 @@ def test_jac_single_measurement_param( """For one measurement and one param, the gradient is a float.""" dev = qml.device(dev_name, wires=1, shots=shots) - @qnode(dev, interface=interface, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, interface=interface, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a, wires=0) qml.RX(0.2, wires=0) @@ -86,7 +86,7 @@ def test_jac_single_measurement_multiple_param( """For one measurement and multiple param, the gradient is a tuple of arrays.""" dev = qml.device(dev_name, wires=1, shots=shots) - @qnode(dev, interface=interface, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, interface=interface, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a, b): qml.RY(a, wires=0) qml.RX(b, wires=0) @@ -115,7 +115,7 @@ def test_jacobian_single_measurement_multiple_param_array( """For one measurement and multiple param as a single array params, the gradient is an array.""" dev = qml.device(dev_name, wires=1, shots=shots) - @qnode(dev, interface=interface, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, interface=interface, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a[0], wires=0) qml.RX(a[1], wires=0) @@ -141,7 +141,7 @@ def test_jacobian_single_measurement_param_probs( dimension""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, interface=interface, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, interface=interface, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a, wires=0) qml.RX(0.2, wires=0) @@ -167,7 +167,7 @@ def test_jacobian_single_measurement_probs_multiple_param( the correct dimension""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, interface=interface, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, interface=interface, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a, b): qml.RY(a, wires=0) qml.RX(b, wires=0) @@ -199,7 +199,7 @@ def test_jacobian_single_measurement_probs_multiple_param_single_array( the correct dimension""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, interface=interface, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, interface=interface, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a[0], wires=0) qml.RX(a[1], wires=0) @@ -227,7 +227,13 @@ def test_jacobian_expval_expval_multiple_params( par_0 = jax.numpy.array(0.1) par_1 = jax.numpy.array(0.2) - @qnode(dev, interface=interface, diff_method=diff_method, max_diff=1, **gradient_kwargs) + @qnode( + dev, + interface=interface, + diff_method=diff_method, + max_diff=1, + gradient_kwargs=gradient_kwargs, + ) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -264,7 +270,7 @@ def test_jacobian_expval_expval_multiple_params_array( """The jacobian of multiple measurements with a multiple params array return a single array.""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, interface=interface, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, interface=interface, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a[0], wires=0) qml.RX(a[1], wires=0) @@ -298,7 +304,7 @@ def test_jacobian_var_var_multiple_params( par_0 = jax.numpy.array(0.1) par_1 = jax.numpy.array(0.2) - @qnode(dev, interface=interface, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, interface=interface, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -336,7 +342,7 @@ def test_jacobian_var_var_multiple_params_array( """The jacobian of multiple measurements with a multiple params array return a single array.""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, interface=interface, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, interface=interface, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a[0], wires=0) qml.RX(a[1], wires=0) @@ -367,7 +373,7 @@ def test_jacobian_multiple_measurement_single_param( """The jacobian of multiple measurements with a single params return an array.""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, interface=interface, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, interface=interface, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a, wires=0) qml.RX(0.2, wires=0) @@ -398,7 +404,7 @@ def test_jacobian_multiple_measurement_multiple_param( """The jacobian of multiple measurements with a multiple params return a tuple of arrays.""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, interface=interface, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, interface=interface, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a, b): qml.RY(a, wires=0) qml.RX(b, wires=0) @@ -438,7 +444,7 @@ def test_jacobian_multiple_measurement_multiple_param_array( """The jacobian of multiple measurements with a multiple params array return a single array.""" dev = qml.device(dev_name, wires=2, shots=shots) - @qnode(dev, interface=interface, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, interface=interface, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a[0], wires=0) qml.RX(a[1], wires=0) @@ -471,7 +477,13 @@ def test_hessian_expval_multiple_params( par_0 = jax.numpy.array(0.1) par_1 = jax.numpy.array(0.2) - @qnode(dev, interface=interface, diff_method=diff_method, max_diff=2, **gradient_kwargs) + @qnode( + dev, + interface=interface, + diff_method=diff_method, + max_diff=2, + gradient_kwargs=gradient_kwargs, + ) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -508,7 +520,13 @@ def test_hessian_expval_multiple_param_array( params = jax.numpy.array([0.1, 0.2]) - @qnode(dev, interface=interface, diff_method=diff_method, max_diff=2, **gradient_kwargs) + @qnode( + dev, + interface=interface, + diff_method=diff_method, + max_diff=2, + gradient_kwargs=gradient_kwargs, + ) def circuit(x): qml.RX(x[0], wires=[0]) qml.RY(x[1], wires=[1]) @@ -534,7 +552,13 @@ def test_hessian_var_multiple_params( par_0 = jax.numpy.array(0.1) par_1 = jax.numpy.array(0.2) - @qnode(dev, interface=interface, diff_method=diff_method, max_diff=2, **gradient_kwargs) + @qnode( + dev, + interface=interface, + diff_method=diff_method, + max_diff=2, + gradient_kwargs=gradient_kwargs, + ) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -571,7 +595,13 @@ def test_hessian_var_multiple_param_array( params = jax.numpy.array([0.1, 0.2]) - @qnode(dev, interface=interface, diff_method=diff_method, max_diff=2, **gradient_kwargs) + @qnode( + dev, + interface=interface, + diff_method=diff_method, + max_diff=2, + gradient_kwargs=gradient_kwargs, + ) def circuit(x): qml.RX(x[0], wires=[0]) qml.RY(x[1], wires=[1]) @@ -597,7 +627,13 @@ def test_hessian_probs_expval_multiple_params( par_0 = jax.numpy.array(0.1) par_1 = jax.numpy.array(0.2) - @qnode(dev, interface=interface, diff_method=diff_method, max_diff=2, **gradient_kwargs) + @qnode( + dev, + interface=interface, + diff_method=diff_method, + max_diff=2, + gradient_kwargs=gradient_kwargs, + ) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -655,7 +691,13 @@ def test_hessian_expval_probs_multiple_param_array( params = jax.numpy.array([0.1, 0.2]) - @qnode(dev, interface=interface, diff_method=diff_method, max_diff=2, **gradient_kwargs) + @qnode( + dev, + interface=interface, + diff_method=diff_method, + max_diff=2, + gradient_kwargs=gradient_kwargs, + ) def circuit(x): qml.RX(x[0], wires=[0]) qml.RY(x[1], wires=[1]) @@ -687,7 +729,13 @@ def test_hessian_probs_var_multiple_params( par_0 = qml.numpy.array(0.1) par_1 = qml.numpy.array(0.2) - @qnode(dev, interface=interface, diff_method=diff_method, max_diff=2, **gradient_kwargs) + @qnode( + dev, + interface=interface, + diff_method=diff_method, + max_diff=2, + gradient_kwargs=gradient_kwargs, + ) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -742,7 +790,13 @@ def test_hessian_var_probs_multiple_param_array( params = jax.numpy.array([0.1, 0.2]) - @qnode(dev, interface=interface, diff_method=diff_method, max_diff=2, **gradient_kwargs) + @qnode( + dev, + interface=interface, + diff_method=diff_method, + max_diff=2, + gradient_kwargs=gradient_kwargs, + ) def circuit(x): qml.RX(x[0], wires=[0]) qml.RY(x[1], wires=[1]) @@ -792,7 +846,7 @@ def test_single_expectation_value( x = jax.numpy.array(0.543) y = jax.numpy.array(-0.654) - @qnode(dev, interface=interface, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, interface=interface, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -827,7 +881,7 @@ def test_prob_expectation_values( x = jax.numpy.array(0.543) y = jax.numpy.array(-0.654) - @qnode(dev, interface=interface, diff_method=diff_method, **gradient_kwargs) + @qnode(dev, interface=interface, diff_method=diff_method, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) diff --git a/tests/workflow/interfaces/qnode/test_tensorflow_autograph_qnode_shot_vector.py b/tests/workflow/interfaces/qnode/test_tensorflow_autograph_qnode_shot_vector.py index f24eda4b382..6a20f264ec6 100644 --- a/tests/workflow/interfaces/qnode/test_tensorflow_autograph_qnode_shot_vector.py +++ b/tests/workflow/interfaces/qnode/test_tensorflow_autograph_qnode_shot_vector.py @@ -73,7 +73,7 @@ def test_jac_single_measurement_param( qml.device(dev_name, seed=seed), diff_method=diff_method, interface=interface, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(a, **_): qml.RY(a, wires=0) @@ -101,7 +101,7 @@ def test_jac_single_measurement_multiple_param( qml.device(dev_name, seed=seed), diff_method=diff_method, interface=interface, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(a, b, **_): qml.RY(a, wires=0) @@ -133,7 +133,7 @@ def test_jacobian_single_measurement_multiple_param_array( qml.device(dev_name, seed=seed), diff_method=diff_method, interface=interface, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(a, **_): qml.RY(a[0], wires=0) @@ -162,7 +162,7 @@ def test_jacobian_single_measurement_param_probs( qml.device(dev_name, seed=seed), diff_method=diff_method, interface=interface, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(a, **_): qml.RY(a, wires=0) @@ -191,7 +191,7 @@ def test_jacobian_single_measurement_probs_multiple_param( qml.device(dev_name, seed=seed), diff_method=diff_method, interface=interface, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(a, b, **_): qml.RY(a, wires=0) @@ -224,7 +224,7 @@ def test_jacobian_single_measurement_probs_multiple_param_single_array( qml.device(dev_name, seed=seed), diff_method=diff_method, interface=interface, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(a, **_): qml.RY(a[0], wires=0) @@ -255,7 +255,7 @@ def test_jacobian_expval_expval_multiple_params( diff_method=diff_method, interface=interface, max_diff=1, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x, y, **_): qml.RX(x, wires=[0]) @@ -285,7 +285,7 @@ def test_jacobian_expval_expval_multiple_params_array( qml.device(dev_name, seed=seed), diff_method=diff_method, interface=interface, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(a, **_): qml.RY(a[0], wires=0) @@ -314,7 +314,7 @@ def test_jacobian_multiple_measurement_single_param( qml.device(dev_name, seed=seed), diff_method=diff_method, interface=interface, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(a, **_): qml.RY(a, wires=0) @@ -342,7 +342,7 @@ def test_jacobian_multiple_measurement_multiple_param( qml.device(dev_name, seed=seed), diff_method=diff_method, interface=interface, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(a, b, **_): qml.RY(a, wires=0) @@ -374,7 +374,7 @@ def test_jacobian_multiple_measurement_multiple_param_array( qml.device(dev_name, seed=seed), diff_method=diff_method, interface=interface, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(a, **_): qml.RY(a[0], wires=0) @@ -421,7 +421,7 @@ def test_hessian_expval_multiple_params( diff_method=diff_method, interface=interface, max_diff=2, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x, y, **_): qml.RX(x, wires=[0]) @@ -471,7 +471,7 @@ def test_single_expectation_value( qml.device(dev_name, seed=seed), diff_method=diff_method, interface=interface, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x, y, **_): qml.RX(x, wires=[0]) @@ -509,7 +509,7 @@ def test_prob_expectation_values( qml.device(dev_name, seed=seed), diff_method=diff_method, interface=interface, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x, y, **_): qml.RX(x, wires=[0]) diff --git a/tests/workflow/interfaces/qnode/test_tensorflow_qnode.py b/tests/workflow/interfaces/qnode/test_tensorflow_qnode.py index 85a39cc588f..79f19bd2f4d 100644 --- a/tests/workflow/interfaces/qnode/test_tensorflow_qnode.py +++ b/tests/workflow/interfaces/qnode/test_tensorflow_qnode.py @@ -158,6 +158,7 @@ def circuit(p1, p2=y, **kwargs): def test_jacobian(self, dev, diff_method, grad_on_execution, device_vjp, tol, interface, seed): """Test jacobian calculation""" + gradient_kwargs = {} kwargs = { "diff_method": diff_method, "grad_on_execution": grad_on_execution, @@ -165,14 +166,14 @@ def test_jacobian(self, dev, diff_method, grad_on_execution, device_vjp, tol, in "device_vjp": device_vjp, } if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) - kwargs["num_directions"] = 20 + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["num_directions"] = 20 tol = TOL_FOR_SPSA a = tf.Variable(0.1, dtype=tf.float64) b = tf.Variable(0.2, dtype=tf.float64) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(a, b): qml.RY(a, wires=0) qml.RX(b, wires=1) @@ -200,14 +201,15 @@ def test_jacobian_options(self, dev, diff_method, grad_on_execution, device_vjp, a = tf.Variable([0.1, 0.2]) + gradient_kwargs = {"approx_order": 2, "h": 1e-8} + @qnode( dev, interface=interface, - h=1e-8, - approx_order=2, diff_method=diff_method, grad_on_execution=grad_on_execution, device_vjp=device_vjp, + gradient_kwargs=gradient_kwargs, ) def circuit(a): qml.RY(a[0], wires=0) @@ -240,7 +242,7 @@ def test_changing_trainability( diff_method=diff_method, grad_on_execution=grad_on_execution, device_vjp=device_vjp, - **diff_kwargs, + gradient_kwargs=diff_kwargs, ) def circuit(a, b): qml.RY(a, wires=0) @@ -370,6 +372,7 @@ def test_differentiable_expand( ): """Test that operation and nested tapes expansion is differentiable""" + gradient_kwargs = {} kwargs = { "diff_method": diff_method, "grad_on_execution": grad_on_execution, @@ -377,8 +380,8 @@ def test_differentiable_expand( "device_vjp": device_vjp, } if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) - kwargs["num_directions"] = 20 + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["num_directions"] = 20 tol = TOL_FOR_SPSA class U3(qml.U3): @@ -393,7 +396,7 @@ def decomposition(self): a = np.array(0.1) p = tf.Variable([0.1, 0.2, 0.3], dtype=tf.float64) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(a, p): qml.RX(a, wires=0) U3(p[0], p[1], p[2], wires=0) @@ -548,15 +551,16 @@ def test_probability_differentiation( "interface": interface, "device_vjp": device_vjp, } + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) - kwargs["num_directions"] = 20 + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["num_directions"] = 20 tol = TOL_FOR_SPSA x = tf.Variable(0.543, dtype=tf.float64) y = tf.Variable(-0.654, dtype=tf.float64) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -605,15 +609,16 @@ def test_ragged_differentiation( "interface": interface, "device_vjp": device_vjp, } + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) - kwargs["num_directions"] = 20 + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["num_directions"] = 20 tol = TOL_FOR_SPSA x = tf.Variable(0.543, dtype=tf.float64) y = tf.Variable(-0.654, dtype=tf.float64) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -943,13 +948,14 @@ def test_projector( "interface": interface, "device_vjp": device_vjp, } + gradient_kwargs = {} if diff_method == "adjoint": pytest.skip("adjoint supports either all expvals or all diagonal measurements.") if diff_method == "hadamard": pytest.skip("Variance not implemented yet.") elif diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) - kwargs["num_directions"] = 20 + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["num_directions"] = 20 tol = TOL_FOR_SPSA if dev.name == "reference.qubit": pytest.xfail("diagonalize_measurements do not support projectors (sc-72911)") @@ -959,7 +965,7 @@ def test_projector( x, y = 0.765, -0.654 weights = tf.Variable([x, y], dtype=tf.float64) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(weights): qml.RX(weights[0], wires=0) qml.RY(weights[1], wires=1) @@ -1129,16 +1135,17 @@ def test_hamiltonian_expansion_analytic( "interface": interface, "device_vjp": device_vjp, } + gradient_kwargs = {} if diff_method in ["adjoint", "hadamard"]: pytest.skip("The adjoint/hadamard method does not yet support Hamiltonians") elif diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) - kwargs["num_directions"] = 20 + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["num_directions"] = 20 tol = TOL_FOR_SPSA obs = [qml.PauliX(0), qml.PauliX(0) @ qml.PauliZ(1), qml.PauliZ(0) @ qml.PauliZ(1)] - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(data, weights, coeffs): weights = tf.reshape(weights, [1, -1]) qml.templates.AngleEmbedding(data, wires=[0, 1]) @@ -1211,7 +1218,7 @@ def test_hamiltonian_finite_shots( max_diff=max_diff, interface=interface, device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(data, weights, coeffs): weights = tf.reshape(weights, [1, -1]) diff --git a/tests/workflow/interfaces/qnode/test_tensorflow_qnode_shot_vector.py b/tests/workflow/interfaces/qnode/test_tensorflow_qnode_shot_vector.py index 037469657bc..fafd85e7e1e 100644 --- a/tests/workflow/interfaces/qnode/test_tensorflow_qnode_shot_vector.py +++ b/tests/workflow/interfaces/qnode/test_tensorflow_qnode_shot_vector.py @@ -70,7 +70,7 @@ def test_jac_single_measurement_param( ): """For one measurement and one param, the gradient is a float.""" - @qnode(dev, diff_method=diff_method, interface=interface, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, interface=interface, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a, wires=0) qml.RX(0.2, wires=0) @@ -92,7 +92,7 @@ def test_jac_single_measurement_multiple_param( ): """For one measurement and multiple param, the gradient is a tuple of arrays.""" - @qnode(dev, diff_method=diff_method, interface=interface, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, interface=interface, gradient_kwargs=gradient_kwargs) def circuit(a, b): qml.RY(a, wires=0) qml.RX(b, wires=0) @@ -118,7 +118,7 @@ def test_jacobian_single_measurement_multiple_param_array( ): """For one measurement and multiple param as a single array params, the gradient is an array.""" - @qnode(dev, diff_method=diff_method, interface=interface, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, interface=interface, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a[0], wires=0) qml.RX(a[1], wires=0) @@ -141,7 +141,7 @@ def test_jacobian_single_measurement_param_probs( """For a multi dimensional measurement (probs), check that a single array is returned with the correct dimension""" - @qnode(dev, diff_method=diff_method, interface=interface, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, interface=interface, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a, wires=0) qml.RX(0.2, wires=0) @@ -164,7 +164,7 @@ def test_jacobian_single_measurement_probs_multiple_param( """For a multi dimensional measurement (probs), check that a single tuple is returned containing arrays with the correct dimension""" - @qnode(dev, diff_method=diff_method, interface=interface, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, interface=interface, gradient_kwargs=gradient_kwargs) def circuit(a, b): qml.RY(a, wires=0) qml.RX(b, wires=0) @@ -191,7 +191,7 @@ def test_jacobian_single_measurement_probs_multiple_param_single_array( """For a multi dimensional measurement (probs), check that a single tuple is returned containing arrays with the correct dimension""" - @qnode(dev, diff_method=diff_method, interface=interface, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, interface=interface, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a[0], wires=0) qml.RX(a[1], wires=0) @@ -216,7 +216,13 @@ def test_jacobian_expval_expval_multiple_params( par_0 = tf.Variable(0.1) par_1 = tf.Variable(0.2) - @qnode(dev, diff_method=diff_method, interface=interface, max_diff=1, **gradient_kwargs) + @qnode( + dev, + diff_method=diff_method, + interface=interface, + max_diff=1, + gradient_kwargs=gradient_kwargs, + ) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -240,7 +246,7 @@ def test_jacobian_expval_expval_multiple_params_array( ): """The jacobian of multiple measurements with a multiple params array return a single array.""" - @qnode(dev, diff_method=diff_method, interface=interface, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, interface=interface, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a[0], wires=0) qml.RX(a[1], wires=0) @@ -263,7 +269,7 @@ def test_jacobian_multiple_measurement_single_param( ): """The jacobian of multiple measurements with a single params return an array.""" - @qnode(dev, diff_method=diff_method, interface=interface, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, interface=interface, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a, wires=0) qml.RX(0.2, wires=0) @@ -285,7 +291,7 @@ def test_jacobian_multiple_measurement_multiple_param( ): """The jacobian of multiple measurements with a multiple params return a tuple of arrays.""" - @qnode(dev, diff_method=diff_method, interface=interface, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, interface=interface, gradient_kwargs=gradient_kwargs) def circuit(a, b): qml.RY(a, wires=0) qml.RX(b, wires=0) @@ -311,7 +317,7 @@ def test_jacobian_multiple_measurement_multiple_param_array( ): """The jacobian of multiple measurements with a multiple params array return a single array.""" - @qnode(dev, diff_method=diff_method, interface=interface, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, interface=interface, gradient_kwargs=gradient_kwargs) def circuit(a): qml.RY(a[0], wires=0) qml.RX(a[1], wires=0) @@ -343,7 +349,13 @@ def test_hessian_expval_multiple_params( par_0 = tf.Variable(0.1, dtype=tf.float64) par_1 = tf.Variable(0.2, dtype=tf.float64) - @qnode(dev, diff_method=diff_method, interface=interface, max_diff=2, **gradient_kwargs) + @qnode( + dev, + diff_method=diff_method, + interface=interface, + max_diff=2, + gradient_kwargs=gradient_kwargs, + ) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -373,7 +385,13 @@ def test_hessian_expval_multiple_param_array( params = tf.Variable([0.1, 0.2], dtype=tf.float64) - @qnode(dev, diff_method=diff_method, interface=interface, max_diff=2, **gradient_kwargs) + @qnode( + dev, + diff_method=diff_method, + interface=interface, + max_diff=2, + gradient_kwargs=gradient_kwargs, + ) def circuit(x): qml.RX(x[0], wires=[0]) qml.RY(x[1], wires=[1]) @@ -400,7 +418,13 @@ def test_hessian_probs_expval_multiple_params( par_0 = tf.Variable(0.1, dtype=tf.float64) par_1 = tf.Variable(0.2, dtype=tf.float64) - @qnode(dev, diff_method=diff_method, interface=interface, max_diff=2, **gradient_kwargs) + @qnode( + dev, + diff_method=diff_method, + interface=interface, + max_diff=2, + gradient_kwargs=gradient_kwargs, + ) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -430,7 +454,13 @@ def test_hessian_expval_probs_multiple_param_array( params = tf.Variable([0.1, 0.2], dtype=tf.float64) - @qnode(dev, diff_method=diff_method, interface=interface, max_diff=2, **gradient_kwargs) + @qnode( + dev, + diff_method=diff_method, + interface=interface, + max_diff=2, + gradient_kwargs=gradient_kwargs, + ) def circuit(x): qml.RX(x[0], wires=[0]) qml.RY(x[1], wires=[1]) @@ -467,7 +497,7 @@ def test_single_expectation_value( x = tf.Variable(0.543, dtype=tf.float64) y = tf.Variable(-0.654, dtype=tf.float64) - @qnode(dev, diff_method=diff_method, interface=interface, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, interface=interface, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -500,7 +530,7 @@ def test_prob_expectation_values( x = tf.Variable(0.543, dtype=tf.float64) y = tf.Variable(-0.654, dtype=tf.float64) - @qnode(dev, diff_method=diff_method, interface=interface, **gradient_kwargs) + @qnode(dev, diff_method=diff_method, interface=interface, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) diff --git a/tests/workflow/interfaces/qnode/test_torch_qnode.py b/tests/workflow/interfaces/qnode/test_torch_qnode.py index e9581898522..a2922a7ce62 100644 --- a/tests/workflow/interfaces/qnode/test_torch_qnode.py +++ b/tests/workflow/interfaces/qnode/test_torch_qnode.py @@ -173,9 +173,10 @@ def test_jacobian(self, interface, dev, diff_method, grad_on_execution, device_v interface=interface, device_vjp=device_vjp, ) + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) - kwargs["num_directions"] = 20 + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["num_directions"] = 20 tol = TOL_FOR_SPSA a_val = 0.1 @@ -184,7 +185,7 @@ def test_jacobian(self, interface, dev, diff_method, grad_on_execution, device_v a = torch.tensor(a_val, dtype=torch.float64, requires_grad=True) b = torch.tensor(b_val, dtype=torch.float64, requires_grad=True) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(a, b): qml.RY(a, wires=0) qml.RX(b, wires=1) @@ -276,14 +277,15 @@ def test_jacobian_options( a = torch.tensor([0.1, 0.2], requires_grad=True) + gradient_kwargs = {"h": 1e-8, "approx_order": 2} + @qnode( dev, diff_method=diff_method, grad_on_execution=grad_on_execution, interface=interface, - h=1e-8, - approx_order=2, device_vjp=device_vjp, + gradient_kwargs=gradient_kwargs, ) def circuit(a): qml.RY(a[0], wires=0) @@ -483,9 +485,10 @@ def test_differentiable_expand( interface=interface, device_vjp=device_vjp, ) + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) - kwargs["num_directions"] = 20 + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["num_directions"] = 20 tol = TOL_FOR_SPSA class U3(qml.U3): # pylint:disable=too-few-public-methods @@ -501,7 +504,7 @@ def decomposition(self): p_val = [0.1, 0.2, 0.3] p = torch.tensor(p_val, dtype=torch.float64, requires_grad=True) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(a, p): qml.RX(a, wires=0) U3(p[0], p[1], p[2], wires=0) @@ -644,9 +647,9 @@ def test_probability_differentiation( with prob and expval outputs""" if "lightning" in getattr(dev, "name", "").lower(): pytest.xfail("lightning does not support measureing probabilities with adjoint.") - kwargs = {} + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) tol = TOL_FOR_SPSA x_val = 0.543 @@ -660,7 +663,7 @@ def test_probability_differentiation( grad_on_execution=grad_on_execution, interface=interface, device_vjp=device_vjp, - **kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(x, y): qml.RX(x, wires=[0]) @@ -708,9 +711,10 @@ def test_ragged_differentiation( interface=interface, device_vjp=device_vjp, ) + gradient_kwargs = {} if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) - kwargs["num_directions"] = 20 + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["num_directions"] = 20 tol = TOL_FOR_SPSA x_val = 0.543 @@ -718,7 +722,7 @@ def test_ragged_differentiation( x = torch.tensor(x_val, requires_grad=True, dtype=torch.float64) y = torch.tensor(y_val, requires_grad=True, dtype=torch.float64) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=[0]) qml.RY(y, wires=[1]) @@ -813,7 +817,7 @@ def test_hessian(self, interface, dev, diff_method, grad_on_execution, device_vj max_diff=2, interface=interface, device_vjp=device_vjp, - **options, + gradient_kwargs=options, ) def circuit(x): qml.RY(x[0], wires=0) @@ -866,7 +870,7 @@ def test_hessian_vector_valued( max_diff=2, interface=interface, device_vjp=device_vjp, - **options, + gradient_kwargs=options, ) def circuit(x): qml.RY(x[0], wires=0) @@ -928,7 +932,7 @@ def test_hessian_ragged(self, interface, dev, diff_method, grad_on_execution, de max_diff=2, interface=interface, device_vjp=device_vjp, - **options, + gradient_kwargs=options, ) def circuit(x): qml.RY(x[0], wires=0) @@ -1003,7 +1007,7 @@ def test_hessian_vector_valued_postprocessing( max_diff=2, interface=interface, device_vjp=device_vjp, - **options, + gradient_kwargs=options, ) def circuit(x): qml.RX(x[0], wires=0) @@ -1100,11 +1104,12 @@ def test_projector( grad_on_execution=grad_on_execution, device_vjp=device_vjp, ) + gradient_kwargs = {} if diff_method == "adjoint": pytest.skip("adjoint supports either all expvals or all diagonal measurements") if diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) - kwargs["num_directions"] = 20 + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["num_directions"] = 20 tol = TOL_FOR_SPSA elif diff_method == "hadamard": pytest.skip("Hadamard does not support variances.") @@ -1116,7 +1121,7 @@ def test_projector( x, y = 0.765, -0.654 weights = torch.tensor([x, y], requires_grad=True, dtype=torch.float64) - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(x, y): qml.RX(x, wires=0) qml.RY(y, wires=1) @@ -1285,18 +1290,19 @@ def test_hamiltonian_expansion_analytic( interface="torch", device_vjp=device_vjp, ) + gradient_kwargs = {} if diff_method == "adjoint": pytest.skip("The adjoint method does not yet support Hamiltonians") elif diff_method == "spsa": - kwargs["sampler_rng"] = np.random.default_rng(seed) - kwargs["num_directions"] = 20 + gradient_kwargs["sampler_rng"] = np.random.default_rng(seed) + gradient_kwargs["num_directions"] = 20 tol = TOL_FOR_SPSA elif diff_method == "hadamard": pytest.skip("The hadamard method does not yet support Hamiltonians") obs = [qml.PauliX(0), qml.PauliX(0) @ qml.PauliZ(1), qml.PauliZ(0) @ qml.PauliZ(1)] - @qnode(dev, **kwargs) + @qnode(dev, **kwargs, gradient_kwargs=gradient_kwargs) def circuit(data, weights, coeffs): weights = torch.reshape(weights, [1, -1]) qml.templates.AngleEmbedding(data, wires=[0, 1]) @@ -1389,7 +1395,7 @@ def test_hamiltonian_finite_shots( max_diff=max_diff, interface="torch", device_vjp=device_vjp, - **gradient_kwargs, + gradient_kwargs=gradient_kwargs, ) def circuit(data, weights, coeffs): weights = torch.reshape(weights, [1, -1]) diff --git a/tests/workflow/test_construct_batch.py b/tests/workflow/test_construct_batch.py index f11eaee459c..d4288da65d9 100644 --- a/tests/workflow/test_construct_batch.py +++ b/tests/workflow/test_construct_batch.py @@ -72,7 +72,7 @@ def test_get_transform_program_diff_method_transform(self): @partial(qml.transforms.compile, num_passes=2) @partial(qml.transforms.merge_rotations, atol=1e-5) @qml.transforms.cancel_inverses - @qml.qnode(dev, diff_method="parameter-shift", shifts=2) + @qml.qnode(dev, diff_method="parameter-shift", gradient_kwargs={"shifts": 2}) def circuit(): return qml.expval(qml.PauliZ(0))