a
    a                     @   sj   d dl m  mZ ddlmZ G dd dZdeiZdd Zd	d
 Z	dd Z
dddZdd Ze	d dS )    N   )
_pocketfftc                   @   s    e Zd ZdZdZedd ZdS )_ScipyBackendaD  The default backend for fft calculations

    Notes
    -----
    We use the domain ``numpy.scipy`` rather than ``scipy`` because in the
    future, ``uarray`` will treat 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.fftc                 C   s(   t t| jd }|d u rtS ||i |S )N)getattrr   __name__NotImplemented)methodargskwargsfn r   b/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/scipy/fft/_backend.py__ua_function__   s    z_ScipyBackend.__ua_function__N)r   
__module____qualname____doc____ua_domain__staticmethodr   r   r   r   r   r      s   	r   Zscipyc              
   C   sb   t | trLzt|  } W n4 tyJ } ztd| |W Y d}~n
d}~0 0 | jdkr^td| S )z8Maps strings to known backends and validates the backendzUnknown backend {}Nr   z,Backend does not implement "numpy.scipy.fft")
isinstancestr_named_backendsKeyError
ValueErrorformatr   )backender   r   r   _backend_from_arg   s    
&
r   c                 C   s   t | } t|  dS )a  Sets the global fft backend

    The global backend has higher priority than registered backends, but lower
    priority than context-specific backends set with `set_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``.

    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. "scipy" is the default backend.
    >>> fft([1])  # Calls the global backend
    array([1.+0.j])
    N)r   uaset_global_backendr   r   r   r   r   .   s    r   c                 C   s   t | } t|  dS )az  
    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
    >>> fft([1])  # The registered backend is called because the global backend returns `NotImplemented`
    array([1.+0.j])
    >>> set_global_backend("scipy")  # Restore global backend to default

    N)r   r   register_backendr    r   r   r   r!   Q   s    "r!   Fc                 C   s   t | } tj| ||dS )aO  Context 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])
    )coerceonly)r   r   set_backend)r   r"   r#   r   r   r   r$   w   s    r$   c                 C   s   t | } t| S )a  Context manager to skip a backend within a fixed scope.

    Within the context of a ``with`` statement, the given backend will not be
    called. This covers backends registered both locally and globally. Upon
    exit, the backend will again be considered.

    Parameters
    ----------
    backend : {object, 'scipy'}
        The backend to skip.
        Can either be a ``str`` containing the name of a known backend
        {'scipy'} or an object that implements the uarray protocol.

    Examples
    --------
    >>> 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    r   r   r   r%      s    r%   )FF)Zscipy._lib.uarrayZ_libZuarrayr    r   r   r   r   r   r!   r$   r%   r   r   r   r   <module>   s   #&
 