B
    0dB                 @   s   d dl mZ d dlZd dlZd dlZd dlZd dlZddlm	Z	 e
 Ze ZdddZdd Zd	d
 Zdd Zdd Zdd Zd d dddZdd Zdd Zejdd Zdd ZdS )    )NumberN   )	good_sizec          
   C   sb   t | tr| f} ydd | D } W n: tk
r\ } z|p:d}td||W dd}~X Y nX | S )a  Convert ``x`` to an iterable sequence of int

    Parameters
    ----------
    x : value, or sequence of values, convertible to int
    name : str, optional
        Name of the argument being converted, only used in the error message

    Returns
    -------
    y : ``List[int]``
    c             S   s   g | ]}t |qS  )operatorindex).0ar   r   M/var/www/html/venv/lib/python3.7/site-packages/scipy/fft/_pocketfft/helper.py
<listcomp>    s    z$_iterable_of_int.<locals>.<listcomp>valuez+{} must be a scalar or iterable of integersN)
isinstancer   	TypeError
ValueErrorformat)xnameer   r   r
   _iterable_of_int   s    
r   c                s4  |dk}|dk}|sjt |d} fdd|D }t fdd|D rNtdtt|t|krjtd|st |d	}|rt|t|krtd
|rt| jkrtdt jt|  j} fddt||D }n,|rt j	}t j}n fdd|D }tdd |D r,td
|||fS )z2Handles shape and axes arguments for nd transformsNaxesc                s"   g | ]}|d k r| j  n|qS )r   )ndim)r   r	   )r   r   r
   r   0   s    z+_init_nd_shape_and_axes.<locals>.<listcomp>c             3   s    | ]}| j kp|d k V  qdS )r   N)r   )r   r	   )r   r   r
   	<genexpr>2   s    z*_init_nd_shape_and_axes.<locals>.<genexpr>z$axes exceeds dimensionality of inputzall axes must be uniqueshapezBwhen given, axes and shape arguments have to be of the same lengthz)shape requires more axes than are presentc                s&   g | ]\}}|d kr j | n|qS ))r   )r   sr	   )r   r   r
   r   B   s    c                s   g | ]} j | qS r   )r   )r   r	   )r   r   r
   r   G   s    c             s   s   | ]}|d k V  qdS )r   Nr   )r   r   r   r   r
   r   I   s    z-invalid number of data points ({0}) specified)r   anyr   lensetr   rangeziplistr   r   )r   r   r   ZnoshapeZnoaxesr   )r   r
   _init_nd_shape_and_axes)   s4    


r!   c             C   sp   t | dst| } | jtjkr.t| tjS | jjdkrHt| tjS | jd}| j	d  }tj
| ||dS )zl
    Convert to array with floating or complex dtype.

    float16 values are also promoted to float32.
    dtypeZfc=ZALIGNED)r"   copy)hasattrnpZasarrayr"   Zfloat16Zfloat32kindZfloat64Znewbyteorderflagsarray)r   r"   r$   r   r   r
   	_asfarrayP   s    

r*   c             C   s0   | |krdS t |tjs&t|dr&dS | jdkS )z|
    Strict check for `arr` not sharing any data with `original`,
    under the assumption that arr = asarray(original)
    FZ	__array__N)r   r&   Zndarrayr%   base)Zarroriginalr   r   r
   _datacopiedd   s
    r-   c       
      C   s   d}t dg| j }xLt||D ]>\}}| j| |krFt d|||< q t d| j| ||< d}q W t|}|sz| | dfS t| j}xt||D ]\}}|||< qW t|| j}	| | |	|< |	dfS )z5Internal auxiliary function for _raw_fft, _raw_fftnd.FNr   T)	slicer   r   r   tupler    r&   Zzerosr"   )
r   r   r   Z	must_copyr   nZaxr   axiszr   r   r
   
_fix_shapep   s     
r3   c             C   s&   |dk rt d|t| |f|fS )Nr   z-invalid number of data points ({0}) specified)r   r   r3   )r   r0   r1   r   r   r
   _fix_shape_1d   s    r4      )NZbackwardZorthoforwardc             C   sD   yt |  }|r|S d| S  tk
r>   td| ddY nX dS )zAReturns the pypocketfft normalization mode from the norm argumentr5   zInvalid norm value z,, should be "backward", "ortho" or "forward"N)	_NORM_MAPKeyErrorr   )Znormr6   Zinormr   r   r
   _normalization   s    r9   c             C   s\   | d krt tddS | dk rH| t kr4| dt 7 } qXtd| t n| dkrXtd| S )Ndefault_workersr   r   z<workers value out of range; got {}, must not be less than {}zworkers must not be zero)getattr_config
_cpu_countr   r   )workersr   r   r
   _workers   s    
r?   c             c   s.   t  }tt| t_z
dV  W d|t_X dS )a  Context manager for the default number of workers used in `scipy.fft`

    Parameters
    ----------
    workers : int
        The default number of workers to use

    Examples
    --------
    >>> from scipy import fft, signal
    >>> rng = np.random.default_rng()
    >>> x = rng.standard_normal((128, 64))
    >>> with fft.set_workers(4):
    ...     y = signal.fftconvolve(x, x)

    N)get_workersr?   r   r   r<   r:   )r>   Zold_workersr   r   r
   set_workers   s
    
rA   c               C   s   t tddS )zReturns the default number of workers within the current context

    Examples
    --------
    >>> from scipy import fft
    >>> fft.get_workers()
    1
    >>> with fft.set_workers(4):
    ...     fft.get_workers()
    4
    r:   r   )r;   r<   r   r   r   r
   r@      s    r@   )N)numbersr   r   os	threading
contextlibnumpyr&   Zpypocketfftr   localr<   	cpu_countr=   r   r!   r*   r-   r3   r4   r7   r9   r?   contextmanagerrA   r@   r   r   r   r
   <module>   s&   
'