U
    Ž»|e]  ã                   @   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} zdd„ | D ƒ} W n: tk
r\ } z|p:d}td |¡ƒ|‚W 5 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   úX/var/www/website-v5/atlas_env/lib/python3.8/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ƒ‚|sÞt |d	ƒ}|r”t|ƒt|ƒkr”td
ƒ‚|rÄt|ƒˆ jkr®tdƒ‚tˆ jt|ƒ ˆ jƒ}‡ fdd„t||ƒD ƒ}n,|røtˆ 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   ©Úndimr   ©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   Nr   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   G   s     c                 s   s   | ]}|d k V  qdS )r   Nr   )r	   r   r   r   r   r   I   s     ú-invalid number of data points ({0}) specified)r   Úanyr   ÚlenÚsetr   ÚrangeÚzipÚlistr   r   )r   r   r   ÚnoshapeZnoaxesr   r   r   Ú_init_nd_shape_and_axes)   s6    


ÿ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.
    ÚdtypeÚfcú=ÚALIGNED)r(   Úcopy)ÚhasattrÚnpÚasarrayr(   Úfloat16Úfloat32ÚkindÚfloat64ÚnewbyteorderÚflagsÚarray)r   r(   r,   r   r   r   Ú	_asfarrayP   s    

r7   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)
    FÚ	__array__N)r   r.   Úndarrayr-   Úbase)ÚarrÚoriginalr   r   r   Ú_datacopiedd   s
    r=   c           
      C   s¾   d}t dƒg| j }t||ƒD ]>\}}| j| |krDt d|ƒ||< qt d| j| ƒ||< d}qt|ƒ}|sv| | dfS t| jƒ}t||ƒD ]\}}|||< qŠt || j¡}	| | |	|< |	dfS )z5Internal auxiliary function for _raw_fft, _raw_fftnd.FNr   T)	Úslicer   r$   r   Útupler%   r.   Úzerosr(   )
r   r   r   Z	must_copyr   ÚnÚaxr   ÚaxisÚzr   r   r   Ú
_fix_shapep   s     

rE   c                 C   s&   |dk rt d |¡ƒ‚t| |f|fƒS )Nr   r   )r   r   rE   )r   rA   rC   r   r   r   Ú_fix_shape_1d‹   s
    ÿrF   é   )NÚbackwardÚorthoÚforwardc                 C   sF   zt |  }|r|nd| W S  tk
r@   td| ›d�ƒd‚Y nX dS )zAReturns the pypocketfft normalization mode from the norm argumentrG   zInvalid norm value z,, should be "backward", "ortho" or "forward"N)Ú	_NORM_MAPÚKeyErrorr   )ÚnormrJ   Zinormr   r   r   Ú_normalization–   s    
ÿþrN   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    
 ÿrT   c                 c   s.   t ƒ }tt | ¡ƒt_z
dV  W 5 |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
    --------
    >>> import numpy as np
    >>> 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_workersrT   r   r   rQ   rO   )rS   Zold_workersr   r   r   Úset_workers±   s
    
rV   c                   C   s   t tddƒS )zãReturns 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
    rO   r   )rP   rQ   r   r   r   r   rU   Ì   s    rU   )N)Únumbersr   r   ÚosÚ	threadingÚ
contextlibÚnumpyr.   Úpypocketfftr   ÚlocalrQ   Ú	cpu_countrR   r   r'   r7   r=   rE   rF   rK   rN   rT   ÚcontextmanagerrV   rU   r   r   r   r   Ú<module>   s(   
'
