U
    e»{j¾‰  ã                
   @   sŒ  d dl Z d dlmZ d dlZd dlZd dlmZmZm	Z	 d dl
mZ d dlmZmZ d dlmZ dZee  ee¡ƒZddd	gZd
ZddgZddgZdZee  eedd¡ƒZdZee  eedd¡ƒZd*dd„Zd+dd„Zdd„ Z G dd„ dƒZ!G dd„ dƒZ"ej# $de¡dd„ ƒZ%ej# $de  eeeee¡¡dd„ ƒZ&ej# $de  eeeee¡¡d d!„ ƒZ'ej# $d"d#did$did%dig¡d&d'„ ƒZ(d(d)„ Z)dS ),é    N)Únullcontext)Úassert_allcloseÚassert_array_almost_equal_nulpÚassert_array_equal)Úunits)ÚconvolveÚconvolve_fft)ÚAstropyUserWarning)z>f4z<f4ú>f8z<f8ÚfillÚwrap)Úinterpolater   TF©ÚboundaryÚnan_treatmentÚnormalize_kernelÚdealias©TF©r   r   r   Úpreserve_nanc                 C   s"   | d krt jtdd�}ntƒ }|S )NzWThe convolve_fft version of boundary=None is equivalent to the convolve boundary='fill'©Úmatch)ÚpytestÚwarnsr	   r   )r   Úctx© r   új/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/convolution/tests/test_convolve_fft.pyÚexpected_boundary_warning9   s    ýr   c                 C   s"   |r| dkrt  t¡}ntƒ }|S )Nr   )r   ÚraisesÚ
ValueErrorr   )r   r   r   r   r   r   Úexpected_dealias_errorI   s    r    c                 C   s"   t | |dt |  ¡ ¡ dd� dS )a  Assert arrays are close to within expected floating point rounding.

    Check that the result is correct at the precision expected for 64 bit
    numbers, taking account that the tolerance has to reflect that all powers
    in the FFTs enter our values.
    é
   ç        )ZatolZrtolN)r   ÚnpÚspacingÚmax©ÚxÚyr   r   r   Úassert_floatcloseT   s    	r)   c                	   @   sj  e Zd Zej ee¡dd„ ƒZej ee¡dd„ ƒZ	ej ee¡dd„ ƒZ
ej ee¡dd„ ƒZej ee¡d	d
„ ƒZej ee¡dd„ ƒZejdejdgdd�ejdejdgdd�fZejdddgdd�ejdddgdd�fZee eeddee¡ƒZej ed e¡dd„ ƒZej ee¡dd„ ƒZdd„ Zdd„ Zdd„ Z dd„ Z!d d!„ Z"ej ee¡d"d#„ ƒZ#d$S )%ÚTestConvolve1Dc              
   C   sŒ   t jdddddddgdd�tj }t jd	d
d	gdd�}t|d��B t||d��* t||||||d�}|j|jkstt‚W 5 Q R X W 5 Q R X dS )zW
        Test that convolve_fft works correctly when input array is a Quantity
        ç      ð?ç      @ç      @ç      @ç      @ç       @Úfloat64©Údtypeçš™™™™™É?ç333333ã?©r   ©r   r   r   N)	r#   ÚarrayÚuÚphr   r    r   ÚunitÚAssertionError©Úselfr   r   r   r   r'   r(   Úzr   r   r   Útest_quantitya   s    "ú	zTestConvolve1D.test_quantityc              
   C   st   t jdddgdd�}t jdgdd�}t|d��< t||d��$ t||||||d�}t||ƒ W 5 Q R X W 5 Q R X d	S )
zV
        Test that a unit kernel with a single element returns the same array
        r+   ç       @ç      @r1   r2   r6   r7   r   N©r#   r8   r   r    r   r)   r=   r   r   r   Útest_unity_1_nonew   s    ú	z TestConvolve1D.test_unity_1_nonec              
   C   sx   t jdddgdd�}t jdddgdd�}t|d��< t||d��$ t||||||d	�}t||ƒ W 5 Q R X W 5 Q R X d
S )z|
        Test that a unit kernel with three elements returns the same array
        (except when boundary is None).
        r+   rA   rB   r1   r2   r"   r6   r7   r   NrC   r=   r   r   r   Útest_unity_3Ž   s    ú	zTestConvolve1D.test_unity_3c              
   C   s^  t jdddgdd�}t jdddgdd�}t|d���  t||d��� t||||||d�}|||f}t jdd	dgdd�t jd
ddgdd�t jd	d	d	gdd�t jdddgdd�dœ}	|	d |	d |	d |	d dœ}
t|
 ¡ ƒD ]}|
| |
|d d|d f< qÜt|
 ¡ ƒD ].}|d dk�r|
| |
d|d |d f< �qt||
| ƒ W 5 Q R X W 5 Q R X dS )z„
        Test that the different modes are producing the correct results using
        a uniform kernel with three elements
        r+   r"   rB   r1   r2   r6   r7   r   r,   çUUUUUUÕ?çUUUUUUõ?)Úsum_fill_zerosÚaverage_fill_zerosÚsum_wrapÚaverage_wraprI   rK   rH   rJ   ))r   r   T)r   r   T)r   r   F)r   r   Fr   r   é   Né   )r#   r8   r   r    r   ÚlistÚkeysr)   )r>   r   r   r   r   r'   r(   r?   Ú
answer_keyÚanswer_dictZresult_dictÚkr   r   r   Útest_uniform_3¦   sF    ú	
 ÿ ÿúûzTestConvolve1D.test_uniform_3c           
      C   s>  t jdddgdd�}t jdddgdd�}t|d���  t||d��è t||||||d	�}t jdd
dgdd�t jdd
dgdd�t jdd
dgdd�t jdddgdd�t jd
d
d
gdd�t jdddgdd�t jdddgdd�t jdddgdd�dœ}|rød}	nd}	|dk�r|	d7 }	n|	d7 }	t|||	 ƒ W 5 Q R X W 5 Q R X dS )z�
        Test that the different modes are producing the correct results using
        a uniform, non-unity kernel with three elements
        r+   r"   rB   r1   r2   ç      à?r6   r7   r   rA   ç      ø?rF   rG   )ÚsumÚ	sum_zerosÚsum_nozerosÚaveragerJ   rK   Úaverage_zerosÚaverage_nozerosrY   rV   r   Ú_wrapÚ_zerosNrC   )
r>   r   r   r   r   r'   r(   r?   rQ   rP   r   r   r   Útest_halfity_3Ø   s>    ú
 ÿö

zTestConvolve1D.test_halfity_3c              	   C   sˆ   t jdt jdgdd�}t jdddgdd�}t|d�� t||||||d�}W 5 Q R X |rjt  |d ¡sjt‚t  |¡}t|dddgƒ d	S )
ú½
        Test that a unit kernel with three elements returns the same array
        (except when boundary is None). This version includes a NaN value in
        the original array.
        r+   rB   r1   r2   r"   r6   r   rM   N©	r#   r8   Únanr   r   Úisnanr<   Ú
nan_to_numr)   ©r>   r   r   r   r   r'   r(   r?   r   r   r   Útest_unity_3_withnan  s    
ú	
z#TestConvolve1D.test_unity_3_withnanr+   rB   r1   r2   r"   r   )ÚinvalÚoutvalc           
   	   C   sl   |}t jdgdd�}t|d�� t||||||d�}	W 5 Q R X |rTt  |	d ¡sTt‚t  |	¡}	t|	|ƒ dS )r_   r+   r1   r2   r6   r   rM   N)r#   r8   r   r   rb   r<   rc   r)   )
r>   r   r   r   r   rf   rg   r'   r(   r?   r   r   r   Útest_unity_1_withnan:  s    ú	
z#TestConvolve1D.test_unity_1_withnanc                 C   s  t jdt jdgdd�}t jdddgdd�}t|d�� t||||||d�}W 5 Q R X |rjt  |d ¡sjt‚t jdddgdd�t jdddgdd�t jdddgdd�t jdddgdd�t jdd	dgdd�t jdddgdd�t jd
d
d
gdd�t jdddgdd�t jdd
dgdd�t jdd	dgdd�t jdd
dgdd�t jdd	dgdd�dœ}t| ¡ ƒD ](}	d|	k�rT||	 d d	 ||	d < �qT|�rŠd}
nd}
|dk�r¢|
d7 }
n|
d7 }
|dk�r¼|
d7 }
t  	|¡}||
 | }|dk�rü|d �rüd|�ròdnd |d< t
|| |ƒ dS )zÆ
        Test that the different modes are producing the correct results using
        a uniform kernel with three elements. This version includes a NaN
        value in the original array.
        r+   rB   r1   r2   r6   r   rM   r,   rA   rG   rL   rT   rU   rF   )rV   rX   rW   Zsum_nozeros_interpnanrY   rJ   rK   Úaverage_wrap_interpnanr[   Zaverage_nozeros_interpnanrZ   Zaverage_zeros_interpnanrV   Ú
_interpnanrY   r   r\   r]   r   r   é   N)r#   r8   ra   r   r   rb   r<   rN   rO   Úisfiniter)   )r>   r   r   r   r   r'   r(   r?   rQ   ÚkeyrP   ÚposnsZanswerr   r   r   Útest_uniform_3_withnan[  sZ    
ú	 ÿô




z%TestConvolve1D.test_uniform_3_withnanc                 C   sd   t jdt jdgdd�}t  dddg¡}t jj|dddgd�}t||dd	t jd
�}t|dddgƒ d S )Nr+   rB   r1   r2   rM   r   ©Úmaskr   r   ©r   r   Ú
fill_valuerL   é   )r#   r8   ra   ÚmaÚmasked_arrayr   r)   )r>   r8   Úkernelrv   Úresultr   r   r   Útest_nan_interpolate¦  s    ûz#TestConvolve1D.test_nan_interpolatec                 C   sL   t jdt jdgdd�}t  dddg¡}t||dddd�}t|d	d
dgƒ d S )Nr+   rB   r1   r2   rM   r   r   rr   rF   rG   ©r#   r8   ra   r   r)   ©r>   r8   rw   rx   r   r   r   Útest_nan_fill¶  s        ÿzTestConvolve1D.test_nan_fillc                 C   sL   t jdt jdgdd�}t  dddg¡}t||dddd�}t|dddgƒ d S )	Nr+   rB   r1   r2   rM   r   rr   g«ªªªªªú?rz   r{   r   r   r   Útest_nan_fill_twoÅ  s        ÿz TestConvolve1D.test_nan_fill_twoc                 C   sì   t jdddgdd�}t  dddg¡}t jj|dddgd�}t||d	d
d�}t|dddgƒ t||d	d
d�}t||ƒ t jdddgdd�}t  dddg¡}t jj|dddgd�}t||d	d
d�}t|dddgƒ t||d	d
d�}t||ƒ dS )zF
        Check whether convolve_fft works with masked arrays.
        r+   rA   rB   r1   r2   rM   r   rp   r   r"   )r   rs   rT   rL   rU   N)r#   r8   ru   rv   r   r)   r   )r>   r8   rw   rv   rx   Zconvolve_resultZmasked_kernelr   r   r   Útest_masked_arrayÔ  s0       ÿ
   ÿz TestConvolve1D.test_masked_arrayc                 C   s8   dddg}dddg}t ||tjd�}t|dddgƒ dS )zP
        Check if convolve_fft works when passing a normalize function.
        rM   rL   rt   )r   é   é   N)r   r#   r%   r)   r{   r   r   r   Útest_normalize_functionó  s    

z&TestConvolve1D.test_normalize_functionc                 C   sv   t  dddg¡}t  dg¡}d}|d |d g}|D ]<}	||	 }
t||
|||d�}|rbt||ƒ q4t|||
 ƒ q4dS )	zp
        Check that if normalize_kernel is False then the normalization
        tolerance is respected.
        rM   rL   rt   r+   g-Cëâ6?r!   )r   r   Znormalization_zero_tolN)r#   r8   r   r)   )r>   r   r   r   r   r8   Zbase_kernelZnormalization_rtolZ
norm_errorÚerrrw   rx   r   r   r   Útest_normalization_is_respectedü  s     ûz.TestConvolve1D.test_normalization_is_respectedN)$Ú__name__Ú
__module__Ú__qualname__r   ÚmarkÚparametrizeÚoption_namesÚoptionsr@   rD   rE   rS   r^   Úoption_names_preserve_nanÚoptions_preserve_nanre   r#   r8   ra   ÚinfÚinputsÚoutputsrN   Ú	itertoolsÚproductÚBOUNDARY_OPTIONSÚNANTREATMENT_OPTIONSZoptions_unity1withnanrh   ro   ry   r|   r}   r~   r�   rƒ   r   r   r   r   r*   `   sT   



1
/
þþúÿ ÿ

J	r*   c                   @   s    e Zd Zej ee¡dd„ ƒZej ee¡dd„ ƒZ	ej ee¡dd„ ƒZ
ej ee¡dd„ ƒZej ee¡d	d
„ ƒZdd„ Zdd„ Zej de¡dd„ ƒZdS )ÚTestConvolve2Dc              
   C   sˆ   t jdddgdddgddd	ggd
d�}t jdggd
d�}t|d��< t||d��$ t||||||d�}t||ƒ W 5 Q R X W 5 Q R X dS )zD
        Test that a 1x1 unit kernel returns the same array
        r+   rA   rB   r,   r-   r.   r/   r0   ç      "@r1   r2   r6   r7   r   NrC   r=   r   r   r   Útest_unity_1x1_none   s      ÿú	z"TestConvolve2D.test_unity_1x1_nonec              
   C   sœ   t jdddgdddgddd	ggd
d�}t jdddgdddgdddggd
d�}t|d��< t||d��$ t||||||d�}t||ƒ W 5 Q R X W 5 Q R X dS )zl
        Test that a 3x3 unit kernel returns the same array (except when
        boundary is None).
        r+   rA   rB   r,   r-   r.   r/   r0   r•   r1   r2   r"   r6   r7   r   NrC   r=   r   r   r   Útest_unity_3x39  s&     ÿ ÿú	zTestConvolve2D.test_unity_3x3c                 C   sš  t jdddgdddgdddggdd�}t jdddgdddgdddggdd�}t|d���8 t||d��� t|||||r~t jnd	||d
�}t jdddgdddgdddggdd�}t jdddgdddgdddggdd�t jdddgdddgdddggdd�dœ}	|	d | |	d< |	d d |	d< |	d d |	d< |	d |	d< |�rFd}
nd}
|dk�r^|
d7 }
n|dk�rp|
d7 }
|	|
 }t||ƒ W 5 Q R X W 5 Q R X dS )zu
        Test that the different modes are producing the correct results using
        a 3x3 uniform kernel.
        r"   rB   r+   rA   r1   r2   r6   r7   r   )r   r   rs   r   r   r,   r.   r•   r-   ©rV   rJ   rV   rY   rJ   rK   Úaverage_withzerosÚsum_withzerosr   r\   r   Ú
_withzerosN)r#   r8   r   r    r   ra   r)   )r>   r   r   r   r   r'   r(   r?   ÚwrQ   rP   Úar   r   r   Útest_uniform_3x3U  sZ     ÿ ÿù
 ÿþþû



zTestConvolve2D.test_uniform_3x3c              	   C   s°   t jdddgdt jdgdddggd	d
�}t jdddgdddgdddggd	d
�}t|d�� t||||||d�}W 5 Q R X |r˜t  |d ¡sŽt‚t  |¡}t  |¡}t||ƒ dS )z­
        Test that a 3x3 unit kernel returns the same array (except when
        boundary is None). This version includes a NaN value in the original
        array.
        r+   rA   rB   r,   r.   r/   r0   r•   r1   r2   r"   r6   r   ©rM   rM   Nr`   rd   r   r   r   Útest_unity_3x3_withnan�  s,    
 ÿ ÿú	

z%TestConvolve2D.test_unity_3x3_withnanc              
   C   sR  t jdddgdt jdgdddggdd�}t jdddgdddgdddggdd�}t|d��. t|||||rv|dkrvt jnd	||d
�}W 5 Q R X |r¢t  |d ¡s¢t‚t jdddgdddgdddggdd�}t jdddgdddgdddggdd�}	t jdddgdddgdddggdd�t jdddgdddgdddggdd�dœ}
|
d |	 |
d< |
d | |
d< |
d d |
d< |
d d |
d< |
d d |
d< |
d d |
d< |
d |
d< |
d d d |
d< |
d |
d< |
d d d |
d< |�rèd}nd}|dk�r |d 7 }n|d!k�r|d"7 }|dk�r$|d#7 }|
|  t  t  |¡¡}t	|| || ƒ d$S )%z¶
        Test that the different modes are producing the correct results using
        a 3x3 uniform kernel. This version includes a NaN value in the
        original array.
        r"   rB   r+   rA   r1   r2   r6   r   r   )r   r   rs   r   r   rŸ   r-   r0   r,   r.   r•   r˜   rV   rY   Zaverage_interpnanrJ   ri   rK   r™   Zaverage_withzeros_interpnanrš   é	   Zsum_interpnanZsum_withzeros_interpnanZsum_wrap_interpnanr   r\   r   r›   rj   N)
r#   r8   ra   r   r   rb   r<   Úwhererl   r)   )r>   r   r   r   r   r'   r(   r?   Zw_nZw_zrQ   rP   rn   r   r   r   Útest_uniform_3x3_withnan³  sv    
 ÿ ÿö ÿ ÿ ÿ ÿü



z'TestConvolve2D.test_uniform_3x3_withnanc              	   C   s<   t  ttf¡�$ tjdddgtd�}t||ƒ W 5 Q R X dS )z_
        Test that convolve_fft raises an exception if a too-large array is passed in.
        i   r2   N)r   r   r   ÚMemoryErrorr#   ÚemptyÚcomplexr   )r>   Zarrr   r   r   Útest_big_fail  s    zTestConvolve2D.test_big_failc              	   C   sê   d}t j|dd�}d|ddd…dd	…f< t jd
dd�}d|d< tjtdd��D t||dddd�}t|j|ƒ t||dddd�}|jdksŒt‚W 5 Q R X t||dddd�}t|jt  	|¡t  	|j¡ ƒ t||dddd�}|jdksæt‚dS )z™
        Test that convolve_fft pads to _next_fast_lengths and does not expand all dimensions
        to length of longest side (#11242/#10047).
        )rM   iÊ  i  r1   r2   r+   r   iX  ib  i,  i0  )rM   é   r¨   )r   rt   rt   z=psf_pad was set to False, which overrides the boundary='fill'r   TF)Z
return_fftÚpsf_padÚfft_pad))rM   éâ  é  )rM   iÐ  é  ))rL   r«   r¬   )rL   r«   r­   N)
r#   Zzerosr   r   r	   r   r   Úshaper<   r8   )r>   r®   Zimgrw   Zimg_fftr   r   r   Útest_padding  sF    þ    ÿ    ÿ    ÿzTestConvolve2D.test_paddingr   c              	   C   sì   t jdddgdddgdddggdd�}t jdddgdddgdddggdd�}t|d	�� t|||d
dd�}W 5 Q R X |dkrªt|t jdddgdddgdddggdd�ƒ n>|dkràt|t jdddgdddgdddggdd�ƒ ntdƒ‚d S )Nr"   r,   r+   rA   rB   Úfloatr2   g      ð¿r6   r   F)r   r   r   ©Nr   g      Àg      Àg       Àr   g       Àr.   r-   g      ÀzInvalid boundary specification)r#   r8   r   r   r)   r   )r>   r   r'   r(   r?   r   r   r   Útest_non_normalized_kernel@  s<    & ÿ    ÿþþþþz)TestConvolve2D.test_non_normalized_kernelN)r„   r…   r†   r   r‡   rˆ   r‰   rŠ   r–   r—   rž   r‹   rŒ   r    r£   r§   r¯   r’   r²   r   r   r   r   r”     s   


9
#
]"r”   r   c              	   C   sœ   t jdddgdd�}t jdddgdd�}t| d	�� t||| d
d�}W 5 Q R X | dkrtt|t jdddgdd�dƒ n$| dkr˜t|t jdddgdd�dƒ dS )zT
    Make sure that asymmetric convolution
    functions go the right direction
    rB   r"   r+   r
   r2   rM   rL   rt   r6   F)r   r   r±   r.   g      $@rA   r°   r!   r   r•   r-   N)r#   r8   r   r   r   )r   r'   r(   r?   r   r   r   Útest_asymmetric_kernela  s    r³   )r   r   r   r   r3   c           	   	   C   s®   dddddddg}dddg}t j||d	�}t j||d	�}d
|j_d
|j_t| d�� t||| |||d� W 5 Q R X t  t j||d	�|k¡sŽt‚t  t j||d	�|k¡sªt‚dS )zF
    Test that convolve_fft works correctly when inputs are lists
    r+   r,   r-   r.   r/   r0   r4   r5   r2   Fr6   r   N)r#   r8   ÚflagsÚ	writeabler   r   Úallr<   )	r   r   r   r   r3   r8   rw   r'   r(   r   r   r   Útest_input_unmodifiedu  s"    
ú	r·   c              	   C   s  dddt jdddg}dddg}t j||d�}t j||d�}d	|j_d	|j_| ¡ }	| ¡ }
t| d
�� t||| |||d� W 5 Q R X t  |¡}t  |¡}| }| }t  	|	| || k¡s¾t
‚t  	|
| || k¡sØt
‚t  	t  || ¡¡sðt
‚t  	t  || ¡¡�s
t
‚dS )z>
    Test that convolve_fft doesn't modify the input data
    r+   r,   r-   r/   r0   r4   r5   r2   Fr6   r   N)r#   ra   r8   r´   rµ   Úcopyr   r   rb   r¶   r<   )r   r   r   r   r3   r8   rw   r'   r(   Zx_copyZy_copyZarray_is_nanZkernel_is_nanZarray_not_nanZkernel_not_nanr   r   r   Útest_input_unmodified_with_nan�  s2    
ú

r¹   Úerror_kwargr©   rª   r   c              	   C   s¨   t jdddgdddgddd	ggd
d�}t jdggd
d�}t||dd�|k ¡ sRt‚t t¡�}t||fddi| —Ž W 5 Q R X t|j	ƒdt
|  ¡ ƒd › d�ks¤t‚d S )Nr+   rA   rB   r,   r-   r.   r/   r0   r•   r
   r2   r   r6   r   zWith boundary='wrap', r   z cannot be enabled.)r#   r8   r   r¶   r<   r   r   r   ÚstrÚvaluerN   rO   )rº   r'   r(   r‚   r   r   r   Ú%test_convolve_fft_boundary_wrap_errorÒ  s    & ÿÿr½   c               	   C   sd   t jdddgdddgddd	ggd
d�} t jdggd
d�}tjtdd�� t| |dd� W 5 Q R X d S )Nr+   rA   rB   r,   r-   r.   r/   r0   r•   r
   r2   z@The 'extend' option is not implemented for fft-based convolutionr   Úextendr6   )r#   r8   r   r   ÚNotImplementedErrorr   r&   r   r   r   Ú'test_convolve_fft_boundary_extend_errorâ  s    &þrÀ   )N)NF)*r�   Ú
contextlibr   Únumpyr#   r   Znumpy.testingr   r   r   Zastropyr   r9   Zastropy.convolution.convolver   r   Zastropy.utils.exceptionsr	   ZVALID_DTYPESrN   r‘   ZVALID_DTYPE_MATRIXr’   r“   ZNORMALIZE_OPTIONSZPRESERVE_NAN_OPTIONSr‰   rŠ   r‹   rŒ   r   r    r)   r*   r”   r‡   rˆ   r³   r·   r¹   r½   rÀ   r   r   r   r   Ú<module>   sŽ   
   ÿÿ   ÿÿ

   B  D
ûþ

ûþ

+ ÿ
