o
    ?Hh                     @   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	   [/home/air/sanwanet/gpt-api/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 rt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 )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
    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.    
'
