qml.math.is_independent¶
- is_independent(func, interface, args, kwargs=None, num_pos=5, seed=9123, atol=1e-06, rtol=0, bounds=(-3.141592653589793, 3.141592653589793))[source]¶
Test whether a function is independent of its input arguments, both numerically and analytically.
- Parameters:
func (callable) – Function to be tested
interface (str) – Autodiff framework used by
func. Must correspond to one of the supported PennyLane interface strings, such as"autograd","tf","torch","jax".args (tuple) – Positional arguments with respect to which to test
kwargs (dict) – Keyword arguments for
funcat which to test; the keyword arguments are kept fixed in this test.num_pos (int) – Number of random positions to test
seed (int) – Seed for the random number generator
atol (float) – Absolute tolerance for comparing the outputs
rtol (float) – Relative tolerance for comparing the outputs
bounds (tuple[float]) – 2-tuple containing limits of the range from which to sample
- Returns:
Whether
funcreturns the same output at randomly chosen points and is numerically independent of its arguments.- Return type:
bool
Warning
This function is experimental. As such, it might yield wrong results and might behave slightly differently in distinct autodifferentiation frameworks for some edge cases. For example, a currently known edge case are piecewise functions that use classical control and simultaneously return (almost) constant output, such as
def func(x): if abs(x) <1e-5: return x else: return 0. * x
The analytic and numeric tests used are as follows.
The analytic test performed depends on the provided
interface, both in its method and its degree of reliability.For the numeric test, the function is evaluated at a series of random positions, and the outputs numerically compared to verify that the output is constant.
Warning
Currently, no analytic test is available for the PyTorch interface. When using PyTorch, a warning will be raised and only the numeric test is performed.
Note
Due to the structure of
is_independent, it is possible that it errs on the side of reporting a dependent function to be independent (a false positive). However, reporting an independent function to be dependent (a false negative) is highly unlikely.Example
Consider the (linear) function
def lin(x, weights=None): return np.dot(x, weights)
This function clearly depends on
x. We may check for this via>>> x = np.array([0.2, 9.1, -3.2], requires_grad=True) >>> weights = np.array([1.1, -0.7, 1.8], requires_grad=True) >>> qml.math.is_independent(lin, "autograd", (x,), {"weights": weights}) False
However, the Jacobian will not depend on
xbecauselinis a linear function:>>> jac = qml.jacobian(lin) >>> qml.math.is_independent(jac, "autograd", (x,), {"weights": weights}) True
Note that a function
f = lambda x: 0.0 * xwill be counted as dependent onxbecause it does depend onxfunctionally, even if the value is constant for allx. This means thatis_independentis a stronger test than simply verifying functions have constant output.