L iddlmcmZddlmZddlmZddlmZGddZdeiZ d Z dd Z d Z dd Z d Ze ddy)N)_basic_backend)_realtransforms_backend)_fftlog_backendc$eZdZdZdZedZy) _ScipyBackenda-The default backend for fft calculations Notes ----- We use the domain ``numpy.scipy`` rather than ``scipy`` because ``uarray`` treats the domain as a hierarchy. This means the user can install a single backend for ``numpy`` and have it implement ``numpy.scipy.fft`` as well. numpy.scipy.fftctt|jd}|tt|jd}|tt|jd}|t S||i|S)N)getattrr__name__rrNotImplemented)methodargskwargsfns X/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/scipy/fft/_backend.py__ua_function__z_ScipyBackend.__ua_function__s`^V__d ; :0&//4HB :&//4@B :! !4"6""N)r __module__ __qualname____doc__ __ua_domain__ staticmethodrrrrrs &M # #rrscipyct|tr t|}|j dk7r t d|S#t$r}t d||d}~wwxYw)z8Maps strings to known backends and validates the backendzUnknown backend Nr z,Backend does not implement "numpy.scipy.fft") isinstancestr_named_backendsKeyError ValueErrorr)backendes r_backend_from_argr$$si'3 B%g.G 11GHH N  B/y9: A Bs 7 AAAcLt|}tj||||y)a,Sets the global fft backend This utility method replaces the default backend for permanent use. It will be tried in the list of backends automatically, unless the ``only`` flag is set on a backend. This will be the first tried backend outside the :obj:`set_backend` context manager. Parameters ---------- backend : {object, 'scipy'} The backend to use. Can either be a ``str`` containing the name of a known backend {'scipy'} or an object that implements the uarray protocol. coerce : bool Whether to coerce input types when trying this backend. only : bool If ``True``, no more backends will be tried if this fails. Implied by ``coerce=True``. try_last : bool If ``True``, the global backend is tried after registered backends. Raises ------ ValueError: If the backend does not implement ``numpy.scipy.fft``. Notes ----- This will overwrite the previously set global backend, which, by default, is the SciPy implementation. Examples -------- We can set the global fft backend: >>> from scipy.fft import fft, set_global_backend >>> set_global_backend("scipy") # Sets global backend (default is "scipy"). >>> fft([1]) # Calls the global backend array([1.+0.j]) )coerceonlytry_lastN)r$uaset_global_backend)r"r&r'r(s rr*r*3s#P (G'&thOrcDt|}tj|y)a Register a backend for permanent use. Registered backends have the lowest priority and will be tried after the global backend. Parameters ---------- backend : {object, 'scipy'} The backend to use. Can either be a ``str`` containing the name of a known backend {'scipy'} or an object that implements the uarray protocol. Raises ------ ValueError: If the backend does not implement ``numpy.scipy.fft``. Examples -------- We can register a new fft backend: >>> from scipy.fft import fft, register_backend, set_global_backend >>> class NoopBackend: # Define an invalid Backend ... __ua_domain__ = "numpy.scipy.fft" ... def __ua_function__(self, func, args, kwargs): ... return NotImplemented >>> set_global_backend(NoopBackend()) # Set the invalid backend as global >>> register_backend("scipy") # Register a new backend # The registered backend is called because # the global backend returns `NotImplemented` >>> fft([1]) array([1.+0.j]) >>> set_global_backend("scipy") # Restore global backend to default N)r$r)register_backendr"s rr,r,_sH (G rcHt|}tj|||S)aOContext manager to set the backend within a fixed scope. Upon entering the ``with`` statement, the given backend will be added to the list of available backends with the highest priority. Upon exit, the backend is reset to the state before entering the scope. Parameters ---------- backend : {object, 'scipy'} The backend to use. Can either be a ``str`` containing the name of a known backend {'scipy'} or an object that implements the uarray protocol. coerce : bool, optional Whether to allow expensive conversions for the ``x`` parameter. e.g., copying a NumPy array to the GPU for a CuPy backend. Implies ``only``. only : bool, optional If only is ``True`` and this backend returns ``NotImplemented``, then a BackendNotImplemented error will be raised immediately. Ignoring any lower priority backends. Examples -------- >>> import scipy.fft as fft >>> with fft.set_backend('scipy', only=True): ... fft.fft([1]) # Always calls the scipy implementation array([1.+0.j]) )r&r')r$r) set_backend)r"r&r's rr/r/s!8 (G >>'&t <>> import scipy.fft as fft >>> fft.fft([1]) # Calls default SciPy backend array([1.+0.j]) >>> with fft.skip_backend('scipy'): # We explicitly skip the SciPy backend ... fft.fft([1]) # leaving no implementation available Traceback (most recent call last): ... BackendNotImplementedError: No selected backends had an implementation ... )r$r) skip_backendr-s rr1r1s2 (G ??7 ##rT)r()FFF)FF)scipy._lib.uarray_libuarrayr)rrrrrr$r*r,r/r1rrrr6sU%##2 ] )PX%!P=@$:7T*r