flopscope.numpy.shares_memory
fnp.shares_memory(*args, **kwargs)[flopscope source]
Determine if two arrays share memory.
Adapted from NumPy docs np.shares_memory
Determine if two arrays share memory.
This function can be exponentially slow for some inputs, unless
max_work is set to zero or a positive integer.
If in doubt, use flops.may_share_memory instead.
Parameters
- a, b:ndarray
Input arrays
- max_work:int, optional
Effort to spend on solving the overlap problem (maximum number of candidate solutions to consider). The following special values are recognized:
- max_work=-1 (default)
The problem is solved exactly. In this case, the function returns True only if there is an element shared between the arrays. Finding the exact solution may take extremely long in some cases.
- max_work=0
Only the memory bounds of a and b are checked. This is equivalent to using
may_share_memory().
Returns
- out:bool
Raises
- :flops.exceptions.TooHardError
Exceeded max_work.
See also
Examples
>>> import flopscope.numpy as fnp
>>> x = flops.array([1, 2, 3, 4])
>>> flops.shares_memory(x, flops.array([5, 6, 7]))
False
>>> flops.shares_memory(x[::2], x)
True
>>> flops.shares_memory(x[::2], x[1::2])
FalseChecking whether two arrays share memory is NP-complete, and
runtime may increase exponentially in the number of
dimensions. Hence, max_work should generally be set to a finite
number, as it is possible to construct examples that take
extremely long to run:
>>> from flops.lib.stride_tricks import as_strided
>>> x = flops.zeros([192163377], dtype=flops.int8)
>>> x1 = as_strided(
... x, strides=(36674, 61119, 85569), shape=(1049, 1049, 1049))
>>> x2 = as_strided(
... x[64023025:], strides=(12223, 12224, 1), shape=(1049, 1049, 1))
>>> flops.shares_memory(x1, x2, max_work=1000)
Traceback (most recent call last):
...
flops.exceptions.TooHardError: Exceeded max_workRunning flops.shares_memory(x1, x2) without max_work set takes
around 1 minute for this case. It is possible to find problems
that take still significantly longer.