a
    BCCfx7                     @   s  d Z g dZddlmZmZmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZ i Zddefdd	Z[i Zdefd
dZ[i ZdefddZ[i ZefddZ[dd Zi ZdefddZ[i ZdefddZ[i ZdefddZ[i ZdefddZ[i ZdefddZ[dS )z1
Differential and pseudo-differential operators.
)
difftilbertitilberthilbertihilbertcs_diffcc_diffsc_diffss_diffshift    )piasarraysincossinhcoshtanhiscomplexobj   )convolve)_datacopiedNc           
      C   s   t | }|dkr|S t|r<t|j||dt|j||  S |durRdt | }nd}t| }||||f}|du rt|dkr|r|  q||fdd}t	j
|||d	d
}|||||f< t|| }	t	j	|||d |	dS )a*  
    Return kth derivative (or integral) of a periodic sequence x.

    If x_j and y_j are Fourier coefficients of periodic functions x
    and y, respectively, then::

      y_j = pow(sqrt(-1)*j*2*pi/period, order) * x_j
      y_0 = 0 if order is not 0.

    Parameters
    ----------
    x : array_like
        Input array.
    order : int, optional
        The order of differentiation. Default order is 1. If order is
        negative, then integration is carried out under the assumption
        that ``x_0 == 0``.
    period : float, optional
        The assumed period of the sequence. Default is ``2*pi``.

    Notes
    -----
    If ``sum(x, axis=0) = 0`` then ``diff(diff(x, k), -k) == x`` (within
    numerical accuracy).

    For odd order and even ``len(x)``, the Nyquist mode is taken zero.

    r                 ?N         ?   c                 S   s   | rt ||  |S dS Nr   )pow)korderc r    W/var/www/html/django/DPS/env/lib/python3.9/site-packages/scipy/fftpack/_pseudo_diffs.pykernelA   s    zdiff.<locals>.kernelr   dZzero_nyquistZswap_real_imagoverwrite_x)r   r   r   realimagr   lengetpopitemr   init_convolution_kernelr   )
xr   period_cachetmpr   nomegar"   r&   r    r    r!   r      s.     


r   c           	      C   s   t | }t|r0t|j||dt|j||  S |durH|d t | }t| }|||f}|du rt|dkr|r|  qr|fdd}t	j
||dd}||||f< t|| }t	j	||d|d	S )
a  
    Return h-Tilbert transform of a periodic sequence x.

    If x_j and y_j are Fourier coefficients of periodic functions x
    and y, respectively, then::

        y_j = sqrt(-1)*coth(j*h*2*pi/period) * x_j
        y_0 = 0

    Parameters
    ----------
    x : array_like
        The input array to transform.
    h : float
        Defines the parameter of the Tilbert transform.
    period : float, optional
        The assumed period of the sequence. Default period is ``2*pi``.

    Returns
    -------
    tilbert : ndarray
        The result of the transform.

    Notes
    -----
    If ``sum(x, axis=0) == 0`` and ``n = len(x)`` is odd, then
    ``tilbert(itilbert(x)) == x``.

    If ``2 * pi * h / period`` is approximately 10 or larger, then
    numerically ``tilbert == hilbert``
    (theoretically oo-Tilbert == Hilbert).

    For even ``len(x)``, the Nyquist mode of ``x`` is taken zero.

    r   Nr   r   c                 S   s   | rdt ||   S dS )Nr   r   r   r   hr    r    r!   r"      s    ztilbert.<locals>.kernelr   r$   r%   )r   r   r   r'   r(   r   r)   r*   r+   r   r,   r   	r-   r5   r.   r/   r0   r1   r2   r"   r&   r    r    r!   r   S   s$    $

r   c           	      C   s   t | }t|r0t|j||dt|j||  S |durH|d t | }t| }|||f}|du rt|dkr|r|  qr|fdd}t	j
||dd}||||f< t|| }t	j	||d|d	S )
a  
    Return inverse h-Tilbert transform of a periodic sequence x.

    If ``x_j`` and ``y_j`` are Fourier coefficients of periodic functions x
    and y, respectively, then::

      y_j = -sqrt(-1)*tanh(j*h*2*pi/period) * x_j
      y_0 = 0

    For more details, see `tilbert`.

    r   Nr   r   c                 S   s   | rt ||   S dS r   r3   r4   r    r    r!   r"      s    zitilbert.<locals>.kernelr   r6   r%   )r   r   r   r'   r(   r   r)   r*   r+   r   r,   r   r7   r    r    r!   r      s$    

r   c                 C   s   t | }t|r(t|jdt|j  S t| }||}|du r|t|dkr\|r\|  qNdd }tj	||dd}|||< t
|| }tj||d|dS )	a  
    Return Hilbert transform of a periodic sequence x.

    If x_j and y_j are Fourier coefficients of periodic functions x
    and y, respectively, then::

      y_j = sqrt(-1)*sign(j) * x_j
      y_0 = 0

    Parameters
    ----------
    x : array_like
        The input array, should be periodic.
    _cache : dict, optional
        Dictionary that contains the kernel used to do a convolution with.

    Returns
    -------
    y : ndarray
        The transformed input.

    See Also
    --------
    scipy.signal.hilbert : Compute the analytic signal, using the Hilbert
                           transform.

    Notes
    -----
    If ``sum(x, axis=0) == 0`` then ``hilbert(ihilbert(x)) == x``.

    For even len(x), the Nyquist mode of x is taken zero.

    The sign of the returned transform does not have a factor -1 that is more
    often than not found in the definition of the Hilbert transform. Note also
    that `scipy.signal.hilbert` does have an extra -1 factor compared to this
    function.

    r   Nr   c                 S   s   | dkrdS | dk rdS dS )Nr   r   g      g        r    )r   r    r    r!   r"      s
    zhilbert.<locals>.kernelr   r6   r%   )r   r   r   r'   r(   r)   r*   r+   r   r,   r   )r-   r/   r0   r1   r2   r"   r&   r    r    r!   r      s    '


r   c                 C   s
   t |  S )z
    Return inverse Hilbert transform of a periodic sequence x.

    If ``x_j`` and ``y_j`` are Fourier coefficients of periodic functions x
    and y, respectively, then::

      y_j = -sqrt(-1)*sign(j) * x_j
      y_0 = 0

    )r   )r-   r    r    r!   r     s    r   c           
      C   s   t | }t|r4t|j|||dt|j|||  S |dur\|d t | }|d t | }t| }||||f}|du rt|dkr|r|  q||fdd}t	j
||dd}|||||f< t|| }	t	j	||d|	d	S )
a  
    Return (a,b)-cosh/sinh pseudo-derivative of a periodic sequence.

    If ``x_j`` and ``y_j`` are Fourier coefficients of periodic functions x
    and y, respectively, then::

      y_j = -sqrt(-1)*cosh(j*a*2*pi/period)/sinh(j*b*2*pi/period) * x_j
      y_0 = 0

    Parameters
    ----------
    x : array_like
        The array to take the pseudo-derivative from.
    a, b : float
        Defines the parameters of the cosh/sinh pseudo-differential
        operator.
    period : float, optional
        The period of the sequence. Default period is ``2*pi``.

    Returns
    -------
    cs_diff : ndarray
        Pseudo-derivative of periodic sequence `x`.

    Notes
    -----
    For even len(`x`), the Nyquist mode of `x` is taken as zero.

    r   Nr   r   c                 S   s"   | rt ||   t||   S dS r   )r   r   r   abr    r    r!   r"   @  s    zcs_diff.<locals>.kernelr   r6   r%   )r   r   r   r'   r(   r   r)   r*   r+   r   r,   r   
r-   r9   r:   r.   r/   r0   r1   r2   r"   r&   r    r    r!   r     s&    

r   c           
      C   s   t | }t|r4t|j|||dt|j|||  S |dur\|d t | }|d t | }t| }||||f}|du rt|dkr|r|  q||fdd}t	j
||dd}|||||f< t|| }	t	j	||d|	d	S )
a  
    Return (a,b)-sinh/cosh pseudo-derivative of a periodic sequence x.

    If x_j and y_j are Fourier coefficients of periodic functions x
    and y, respectively, then::

      y_j = sqrt(-1)*sinh(j*a*2*pi/period)/cosh(j*b*2*pi/period) * x_j
      y_0 = 0

    Parameters
    ----------
    x : array_like
        Input array.
    a,b : float
        Defines the parameters of the sinh/cosh pseudo-differential
        operator.
    period : float, optional
        The period of the sequence x. Default is 2*pi.

    Notes
    -----
    ``sc_diff(cs_diff(x,a,b),b,a) == x``
    For even ``len(x)``, the Nyquist mode of x is taken as zero.

    r   Nr   r   c                 S   s    | rt ||  t||   S dS r   )r   r   r8   r    r    r!   r"   x  s    zsc_diff.<locals>.kernelr   r6   r%   )r   r   r   r'   r(   r   r)   r*   r+   r   r,   r   r;   r    r    r!   r   P  s&    

r   c           
      C   s   t | }t|r4t|j|||dt|j|||  S |dur\|d t | }|d t | }t| }||||f}|du rt|dkr|r|  q||fdd}t	
||}|||||f< t|| }	t	j	|||	dS )ac  
    Return (a,b)-sinh/sinh pseudo-derivative of a periodic sequence x.

    If x_j and y_j are Fourier coefficients of periodic functions x
    and y, respectively, then::

      y_j = sinh(j*a*2*pi/period)/sinh(j*b*2*pi/period) * x_j
      y_0 = a/b * x_0

    Parameters
    ----------
    x : array_like
        The array to take the pseudo-derivative from.
    a,b
        Defines the parameters of the sinh/sinh pseudo-differential
        operator.
    period : float, optional
        The period of the sequence x. Default is ``2*pi``.

    Notes
    -----
    ``ss_diff(ss_diff(x,a,b),b,a) == x``

    r   Nr   r   c                 S   s(   | rt ||  t ||   S t|| S N)r   floatr8   r    r    r!   r"     s    zss_diff.<locals>.kernelr&   )r   r   r	   r'   r(   r   r)   r*   r+   r   r,   r   r;   r    r    r!   r	     s&    

r	   c           
      C   s   t | }t|r4t|j|||dt|j|||  S |dur\|d t | }|d t | }t| }||||f}|du rt|dkr|r|  q||fdd}t	
||}|||||f< t|| }	t	j	|||	dS )a  
    Return (a,b)-cosh/cosh pseudo-derivative of a periodic sequence.

    If x_j and y_j are Fourier coefficients of periodic functions x
    and y, respectively, then::

      y_j = cosh(j*a*2*pi/period)/cosh(j*b*2*pi/period) * x_j

    Parameters
    ----------
    x : array_like
        The array to take the pseudo-derivative from.
    a,b : float
        Defines the parameters of the sinh/sinh pseudo-differential
        operator.
    period : float, optional
        The period of the sequence x. Default is ``2*pi``.

    Returns
    -------
    cc_diff : ndarray
        Pseudo-derivative of periodic sequence `x`.

    Notes
    -----
    ``cc_diff(cc_diff(x,a,b),b,a) == x``

    r   Nr   r   c                 S   s   t ||  t ||   S r<   )r   r8   r    r    r!   r"     s    zcc_diff.<locals>.kernelr>   )r   r   r   r'   r(   r   r)   r*   r+   r   r,   r   r;   r    r    r!   r     s&    

r   c                 C   s   t | }t|r0t|j||dt|j||  S |durH|d t | }t| }|||f}|du rt|dkr|r|  qr|fdd}|fdd}t	j
||d	d	d
}	t	j
||dd	d
}
|	|
f|||f< n|\}	}
t|| }t	j||	|
|dS )a  
    Shift periodic sequence x by a: y(u) = x(u+a).

    If x_j and y_j are Fourier coefficients of periodic functions x
    and y, respectively, then::

          y_j = exp(j*a*2*pi/period*sqrt(-1)) * x_f

    Parameters
    ----------
    x : array_like
        The array to take the pseudo-derivative from.
    a : float
        Defines the parameters of the sinh/sinh pseudo-differential
    period : float, optional
        The period of the sequences x and y. Default period is ``2*pi``.
    r   Nr   r   c                 S   s   t ||  S r<   )r   r   r9   r    r    r!   kernel_real  s    zshift.<locals>.kernel_realc                 S   s   t ||  S r<   )r   r?   r    r    r!   kernel_imag  s    zshift.<locals>.kernel_imagr   r#   r   r>   )r   r   r
   r'   r(   r   r)   r*   r+   r   r,   r   Z
convolve_z)r-   r9   r.   r/   r0   r1   r2   r@   rA   Z
omega_realZ
omega_imagr&   r    r    r!   r
     s2     




r
   )__doc____all__numpyr   r   r   r   r   r   r   r    r   Zscipy.fft._pocketfft.helperr   r/   r   r   r   r   r   r   r   r	   r   r
   r    r    r    r!   <module>   s@   (9@$=6213/