o
    Ö­jÑ  ã                   @   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	 ddl
mZmZ g d¢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)Úcopy_if_neededé   )Ú	good_sizeÚprev_good_size)r   r   Úset_workersÚget_workersc              
   C   sV   t | tƒr| f} z
dd„ | D ƒ} W | S  ty* } z|pd}t|› d�ƒ|‚d}~ww )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/html/CropPilot/venv/lib/python3.10/site-packages/scipy/fft/_pocketfft/helper.pyÚ
<listcomp>&   ó    z$_iterable_of_int.<locals>.<listcomp>Úvaluez) must be a scalar or iterable of integersN)Ú
isinstancer   Ú	TypeErrorÚ
ValueError)ÚxÚnameÚer	   r	   r   Ú_iterable_of_int   s   
ü€þr   c                    s<  |du }|du }|s5t |dƒ}‡ fdd„|D ƒ}t‡ fdd„|D ƒƒr'tdƒ‚tt|ƒƒt|ƒkr5tdƒ‚|sot |d	ƒ}|rJt|ƒt|ƒkrJtd
ƒ‚|rbt|ƒˆ jkrWt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|› d�ƒ‚t
|ƒt|ƒ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   5   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>7   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   G   s   & c                    s   g | ]}ˆ j | ‘qS r	   r!   r   r   r	   r   r   L   r   c                 s   s   � | ]}|d k V  qdS )r   Nr	   )r   r"   r	   r	   r   r   N   s   € úinvalid number of data points (ú) specified)r   Úanyr   ÚlenÚsetr   ÚrangeÚzipÚlistr   Útuple)r   r   r   ÚnoshapeÚnoaxesr	   r   r   Ú_init_nd_shape_and_axes.   s6   



ÿr.   c                 C   sv   t | dƒs
t | ¡} | jtjkrt | tj¡S | jjdvr$t | tj¡S | j d¡}| j	d s1dnt
}tj| ||d�S )zl
    Convert to array with floating or complex dtype.

    float16 values are also promoted to float32.
    ÚdtypeÚfcú=ÚALIGNEDT)r/   Úcopy)ÚhasattrÚnpÚasarrayr/   Úfloat16Úfloat32ÚkindÚfloat64ÚnewbyteorderÚflagsr   Úarray)r   r/   r3   r	   r	   r   Ú	_asfarrayU   s   

r>   c                 C   s0   | |u rdS t |tjƒst|dƒrdS | jdu S )z|
    Strict check for `arr` not sharing any data with `original`,
    under the assumption that arr = asarray(original)
    FÚ	__array__N)r   r5   Úndarrayr4   Úbase)ÚarrÚoriginalr	   r	   r   Ú_datacopiedi   s
   
rD   c           
      C   s¾   d}t dƒg| j }t||ƒD ]\}}| j| |kr"t d|ƒ||< qt d| j| ƒ||< d}qt|ƒ}|s;| | dfS t| jƒ}t||ƒD ]\}}|||< qEt || j¡}	| | |	|< |	dfS )z5Internal auxiliary function for _raw_fft, _raw_fftnd.FNr   T)	Úslicer   r)   r   r+   r*   r5   Úzerosr/   )
r   r   r   Ú	must_copyr   ÚnÚaxr"   ÚaxisÚzr	   r	   r   Ú
_fix_shapeu   s    

rL   c                 C   s(   |dk rt d|› d�ƒ‚t| |f|fƒS )Nr   r#   r$   )r   rL   )r   rH   rJ   r	   r	   r   Ú_fix_shape_1d�   s
   
ÿrM   é   )NÚbackwardÚorthoÚforwardc                 C   s>   zt |  }|r
|W S d| W S  ty   td| ›d�ƒd‚w )zAReturns the pypocketfft normalization mode from the norm argumentrN   zInvalid norm value z,, should be "backward", "ortho" or "forward"N)Ú	_NORM_MAPÚKeyErrorr   )ÚnormrQ   Úinormr	   r	   r   Ú_normalization›   s   
ÿþÿrV   c                 C   s`   | d u r
t tddƒS | dk r&| t kr| dt 7 } | S td| › dt › �ƒ‚| dkr.tdƒ‚| S )NÚdefault_workersr   r   z workers value out of range; got z, must not be less than zworkers must not be zero)ÚgetattrÚ_configÚ
_cpu_countr   )Úworkersr	   r	   r   Ú_workers¦   s   

ûÿr\   c                 c   s4   � t ƒ }tt | ¡ƒt_z	dV  W |t_dS |t_w )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)r   r\   r
   r   rY   rW   )r[   Úold_workersr	   r	   r   r   ¶   s   €r   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
    rW   r   )rX   rY   r	   r	   r	   r   r   Ñ   s   r   )N)Únumbersr   r
   ÚosÚ	threadingÚ
contextlibÚnumpyr5   Úscipy._lib._utilr   Úpypocketfftr   r   Ú__all__ÚlocalrY   Ú	cpu_countrZ   r   r.   r>   rD   rL   rM   rR   rV   r\   Úcontextmanagerr   r   r	   r	   r	   r   Ú<module>   s.    
'
