U
    e»{jFT  ã                
   @   s\  d dl Z d dlZd dlZd dlmZmZ d dlmZm	Z	 d dl
mZmZmZmZmZmZmZmZ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mZm Z  d dl!m"Z" d dl#m$Z$ d	d
ddgZ%ddddgZ&ddddgZ'eeeeeeeeeeg
Z(dde )d¡e *d¡gZ+e ,d¡Z-de-d< e ,d¡Z.de.d< ej/ 0d¡Z1ej/ 0dd¡Z2G dd„ dƒZ3dS )é    N)Úassert_allcloseÚassert_almost_equal)ÚconvolveÚconvolve_fft)ÚAiryDisk2DKernelÚBox1DKernelÚBox2DKernelÚCustomKernelÚGaussian1DKernelÚGaussian2DKernelÚKernel1DÚKernel2DÚModel1DKernelÚModel2DKernelÚRickerWavelet1DKernelÚRickerWavelet2DKernelÚRing2DKernelÚTophat2DKernelÚTrapezoid1DKernelÚTrapezoidDisk2DKernel)ÚKernelSizeError)ÚBox2DÚ
Gaussian1DÚ
Gaussian2D)Ú	HAS_SCIPY)ÚAstropyUserWarningé   é   é   é	   é   é   é   é   ÚcenterZlinear_interpZ
oversampleZ	integrateé   ç      ð?éQ   é(   )r'   r'   )r(   r(   é=   c                   @   s:  e Zd ZdZejje dd�ej de	¡dd„ ƒƒZ
ejje dd�ej de	¡dd„ ƒƒZej d	ee ee	¡ƒ¡d
d„ ƒZej d	ee ee	¡ƒ¡dd„ ƒZej de	¡dd„ ƒZej de	¡dd„ ƒZdd„ Zdd„ Zej de¡dd„ ƒZej de¡dd„ ƒZej de¡dd„ ƒZdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Z d+d,„ Z!d-d.„ Z"d/d0„ Z#d1d2„ Z$d3d4„ Z%d5d6„ Z&d7d8„ Z'd9d:„ Z(d;d<„ Z)d=d>„ Z*d?d@„ Z+dAdB„ Z,dCdD„ Z-ej dEee ee.¡ƒ¡dFdG„ ƒZ/ej de0¡dHdI„ ƒZ1dJdK„ Z2dLdM„ Z3dNdO„ Z4dPdQ„ Z5dRdS„ Z6dTdU„ Z7dVdW„ Z8dXdY„ Z9dZS )[ÚTestKernelsz:
    Test class for the built-in convolution kernels.
    zRequires scipy)ÚreasonÚwidthc           	      C   s|   ddl m} t|ƒ}| ¡  t|ƒ}| ¡  tt|dd�}tt|dd�}|t|ƒ}|t|ƒ}t||dd� t||dd� dS )zL
        Test GaussianKernel against SciPy ndimage gaussian filter.
        r   )Úgaussian_filterÚfill©Úboundaryé   ©ÚdecimalN)	Úscipy.ndimager-   r
   Ú	normalizer   r   Údelta_pulse_1DÚdelta_pulse_2Dr   )	Úselfr,   r-   Zgauss_kernel_1DZgauss_kernel_2DÚ
astropy_1DÚ
astropy_2DÚscipy_1DÚscipy_2D© r=   új/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/convolution/tests/test_kernel_class.pyÚtest_scipy_filter_gaussianE   s    

z&TestKernels.test_scipy_filter_gaussianc           
   	   C   sÌ   ddl m} t|ƒ}t|ƒ}tt|ddd�}tt|ddd�}d}tjt	|d�� tt|ddd�}W 5 Q R X tjt	|d�� tt|ddd�}W 5 Q R X |t|ƒ }|t|ƒ }	t
||d	d
� t
||	d	d
� dS )z\
        Test RickerWavelet kernels against SciPy ndimage gaussian laplace filters.
        r   )Úgaussian_laplacer.   F©r0   Znormalize_kernelzsum is close to zero©ÚmatchTr   r2   N)r4   r@   r   r   r   r6   r7   ÚpytestÚraisesÚ	Exceptionr   )
r8   r,   r@   Zricker_kernel_1DZricker_kernel_2Dr9   r:   ZMESSAGEr;   r<   r=   r=   r>   Ú"test_scipy_filter_gaussian_laplace[   sD       ÿ   ÿ   ÿ   ÿz.TestKernels.test_scipy_filter_gaussian_laplace)Úkernel_typer,   c                 C   s¢   |t krtst d¡ |tks(||ƒ}n|||d ƒ}|jdkrptt|ddd�}tt|ddd�}t	||dd� n.tt
|ddd�}tt
|ddd�}t	||dd� d	S )
úI
        Test smoothing of an image with a single positive pixel
        ú/Omitting AiryDisk2DKernel, which requires SciPyçš™™™™™É?r%   r.   FrA   r1   r2   N©r   r   rD   Úskipr   Ú	dimensionr   r6   r   r   r7   ©r8   rH   r,   ÚkernelÚc1Úc2r=   r=   r>   Útest_delta_data�   s@    


   ÿ   ÿ   ÿ   ÿzTestKernels.test_delta_datac                 C   s¢   |t krtst d¡ |tks(||ƒ}n|||d ƒ}|jdkrptt|ddd�}tt|ddd�}t	||dd� n.tt
|ddd�}tt
|ddd�}t	||dd� d	S )
zA
        Test smoothing of an image made of random noise
        rJ   rK   r%   r.   FrA   r1   r2   N)r   r   rD   rM   r   rN   r   Úrandom_data_1Dr   r   Úrandom_data_2DrO   r=   r=   r>   Útest_random_data    s@    


   ÿ   ÿ   ÿ   ÿzTestKernels.test_random_datac                 C   s<   t  ||g¡}tt|dd�}tt|dd�}t||dd� dS )z�
        Test smoothing of an image with a single positive pixel

        Instead of using kernel class, uses a simple, small kernel
        r.   r/   r1   r2   N)ÚnpÚonesr   r7   r   r   )r8   r,   rP   rR   rQ   r=   r=   r>   Útest_uniform_smallkernel¿   s    z$TestKernels.test_uniform_smallkernelc                 C   sL   t  ||g¡|d  }t|ƒ}tt|dd�}tt|dd�}t||dd� dS )rI   r    r.   r/   r1   r2   N)rW   rX   r   r   r7   r   )r8   r,   Zkernel1Zkernel2rR   rQ   r=   r=   r>   Útest_smallkernel_vs_Box2DKernelÌ   s
    z+TestKernels.test_smallkernel_vs_Box2DKernelc              	   C   s^   t dƒ}t dƒ}t dƒ}tjtdd�� t||ƒ}W 5 Q R X t t || j¡dk ¡sZt	‚dS ©zR
        Check if convolving two kernels with each other works correctly.
        r   r!   r   z*Both array and kernel are Kernel instancesrB   g{®Gáz„?N)
r
   rD   Úwarnsr   r   rW   ÚallÚabsÚarrayÚAssertionError©r8   Zgauss_1Zgauss_2Ztest_gauss_3Zgauss_3r=   r=   r>   Útest_convolve_1D_kernelsÙ   s     ÿz$TestKernels.test_convolve_1D_kernelsc              	   C   s^   t dƒ}t dƒ}t dƒ}tjtdd�� t||ƒ}W 5 Q R X t t || j¡dk ¡sZt	‚dS r[   )
r   rD   r\   r   r   rW   r]   r^   r_   r`   ra   r=   r=   r>   Útest_convolve_2D_kernelsè   s     ÿz$TestKernels.test_convolve_2D_kernelsÚnumberc                 C   s*   t dƒ}|| }t|j|j| dd� dS )úN
        Check if multiplying a kernel with a scalar works correctly.
        r   r1   r2   N)r
   r   r_   ©r8   rd   ÚgaussZ	gauss_newr=   r=   r>   Útest_multiply_scalar÷   s    z TestKernels.test_multiply_scalarc                 C   s$   t dƒ}|| }t|ƒt ks t‚dS ©re   r   N©r
   Útyper`   rf   r=   r=   r>   Útest_multiply_scalar_type   s    z%TestKernels.test_multiply_scalar_typec                 C   s$   t dƒ}|| }t|ƒt ks t‚dS ri   rj   rf   r=   r=   r>   Útest_rmultiply_scalar_type	  s    z&TestKernels.test_rmultiply_scalar_typec              	   C   s*   t dƒ}t t¡� ||  W 5 Q R X dS )z9Test that multiplying two 1D kernels raises an exception.r   N)r
   rD   rE   rF   ©r8   rg   r=   r=   r>   Útest_multiply_kernel1d  s    z"TestKernels.test_multiply_kernel1dc              	   C   s*   t dƒ}t t¡� ||  W 5 Q R X dS )z9Test that multiplying two 2D kernels raises an exception.r   N)r   rD   rE   rF   rn   r=   r=   r>   Útest_multiply_kernel2d  s    z"TestKernels.test_multiply_kernel2dc              	   C   s*   t  t¡� tdƒtdƒ  W 5 Q R X dS )za
        Test that multiplying a 1D kernel with a 2D kernel raises an
        exception.
        r   N)rD   rE   rF   r
   r   ©r8   r=   r=   r>   Útest_multiply_kernel1d_kernel2d  s    z+TestKernels.test_multiply_kernel1d_kernel2dc              	   C   s&   t  t¡� tdƒd  W 5 Q R X dS )z:Test that adding a scalar to a kernel raises an exception.r   r%   N)rD   rE   rF   r
   rq   r=   r=   r>   Útest_add_kernel_scalar&  s    z"TestKernels.test_add_kernel_scalarc                 C   s^   d}t dt dtj |d  ¡ d|ƒ}t|dd�}| ¡  t|dd�}t|j|jdd� d	S )
z>
        Check Model1DKernel against Gaussian1Dkernel
        ç      @r&   r    r   é   ©Úx_sizer1   r2   N)	r   rW   ÚsqrtÚpir   r5   r
   r   r_   ©r8   Ústddevrg   Zmodel_gauss_kernelZgauss_kernelr=   r=   r>   Útest_model_1D_kernel+  s    $z TestKernels.test_model_1D_kernelc                 C   s\   d}t ddtj |d   dd||ƒ}t|dd�}| ¡  t|dd�}t|j|jdd� d	S )
z>
        Check Model2DKernel against Gaussian2Dkernel
        rt   r&   r    r   ru   rv   r1   r2   N)r   rW   ry   r   r5   r   r   r_   rz   r=   r=   r>   Útest_model_2D_kernel6  s    "z TestKernels.test_model_2D_kernelc                 C   sP   t  d¡}t|ƒ}| ¡  tdƒ}tt|dd�}tt|dd�}t||dd� dS )z9
        Check CustomKernel against Box1DKernel.
        r   r.   r/   r1   r2   N)rW   rX   r	   r5   r   r   r6   r   ©r8   r_   ÚcustomÚboxrR   rQ   r=   r=   r>   Útest_custom_1D_kernelA  s    
z!TestKernels.test_custom_1D_kernelc                 C   sP   t  d¡}t|ƒ}| ¡  tdƒ}tt|dd�}tt|dd�}t||dd� dS )z9
        Check CustomKernel against Box2DKernel.
        )r   r   r   r.   r/   r1   r2   N)rW   rX   r	   r5   r   r   r7   r   r~   r=   r=   r>   Útest_custom_2D_kernelO  s    
z!TestKernels.test_custom_2D_kernelc                 C   s$   t dddddgƒ}|jdks t‚dS ©z9
        Check if CustomKernel works with lists.
        r%   TN©r	   Zis_boolr`   ©r8   r   r=   r=   r>   Útest_custom_1D_kernel_list]  s    z&TestKernels.test_custom_1D_kernel_listc                 C   s2   t dddgdddgdddggƒ}|jdks.t‚dS rƒ   r„   r…   r=   r=   r>   Útest_custom_2D_kernel_listd  s     z&TestKernels.test_custom_2D_kernel_listc              	   C   sX   dddddg}t |ƒ}tjtdd�� | ¡  W 5 Q R X |jdksFt‚|jd	ksTt‚d
S )ú]
        Check if CustomKernel works when the input array/list
        sums to zero.
        éþÿÿÿéÿÿÿÿr   r%   r    ú3kernel cannot be normalized because it sums to zerorB   r&   ç        N©r	   rD   r\   r   r5   Ú
truncationr`   Ú_kernel_sum©r8   r_   r   r=   r=   r>   Útest_custom_1D_kernel_zerosumk  s    þz)TestKernels.test_custom_1D_kernel_zerosumc              	   C   sf   dddgdddgdddgg}t |ƒ}tjtdd�� | ¡  W 5 Q R X |jdksTt‚|jdksbt‚dS )	rˆ   r   rŠ   r!   r‹   rB   r&   rŒ   Nr�   r�   r=   r=   r>   Útest_custom_2D_kernel_zerosum}  s    þz)TestKernels.test_custom_2D_kernel_zerosumc              	   C   s*   t  t¡� tddddgƒ W 5 Q R X dS )zH
        Check if CustomKernel raises if the array size is odd.
        r%   N)rD   rE   r   r	   rq   r=   r=   r>   Útest_custom_kernel_odd_error�  s    z(TestKernels.test_custom_kernel_odd_errorc                 C   sÀ   t dƒ}t dƒ}t dƒ}|| | }|| | }|| | }dddddg}t|j|dd� t|j|dd� t|j|dd� t|jdddddgdd� t|jd	d	d	gdd� t|jdgdd� d
S )ú:
        Check if adding of two 1D kernels works.
        r   r   r%   rK   gá?gˆˆˆˆˆˆø?r1   r2   gUUUUUUÕ?N)r   r   r_   )r8   Úbox_1Úbox_2Zbox_3Ú	box_sum_1Ú	box_sum_2Z	box_sum_3Úrefr=   r=   r>   Útest_add_1D_kernels–  s$    ûzTestKernels.test_add_1D_kernelsc                 C   s    t dƒ}t dƒ}|| }|| }dddgdddgdddgg}dddgdddgdddgg}t|jdggdd� t|j|dd� t|j|dd� t|j|dd� dS )r”   r   r%   gÇqÇq¼?grÇqÇñ?r1   r2   N)r   r   r_   )r8   r•   r–   r—   r˜   r™   Zref_1r=   r=   r>   Útest_add_2D_kernels°  s     ýýzTestKernels.test_add_2D_kernelsc                 C   s    t ddd�}|jjdkst‚dS )ú>
        Check if even size for GaussianKernel works.
        r   é
   rv   N)r
   r_   Úsizer`   rn   r=   r=   r>   Útest_Gaussian1DKernel_even_sizeÇ  s    z+TestKernels.test_Gaussian1DKernel_even_sizec                 C   s"   t dddd�}|jjdkst‚dS )rœ   r   r�   ©rw   Úy_size)r�   r�   N)r   r_   Úshaper`   rn   r=   r=   r>   Útest_Gaussian2DKernel_even_sizeÎ  s    z+TestKernels.test_Gaussian2DKernel_even_sizec              	   C   sd   t dddddd�}dddd	d
gddddd	gdddddgd	ddddgd
d	dddgg}t||dd� d S )Nr   g      ø?g-DTû!é?r   )Zx_stddevZy_stddevÚthetarw   r¡   g KYe*í¤?gãb¹c¹¾¦?gê#®kÍ¹¢?g]ÝóôøZ—?g9s8ˆ†?gÓ‹VÅ†4­?gh�Yî³g¬?gõ|0�”Q°?gü©ñÒMbP?)Zrtol)r   r   )r8   rg   Zansr=   r=   r>   Útest_Gaussian2DKernel_rotatedÖ  s        ÿûz)TestKernels.test_Gaussian2DKernel_rotatedc                 C   s4   t dddddgƒ}|jdd� |j ¡ dks0t‚dS )z:
        Check if normalize works with peak mode.
        r%   r    r   Zpeak©ÚmodeN)r	   r5   r_   Úmaxr`   r…   r=   r=   r>   Útest_normalize_peakã  s    zTestKernels.test_normalize_peakc                 C   s^   t dƒ}|jdkst‚t|jtƒs&t‚|jddgks8t‚| ¡  t|j	ddd� |j
sZt‚dS )z9
        Check if kernel attributes are correct.
        r   r   r    r&   r1   r2   N)r   rŽ   r`   Ú
isinstanceÚmodelr   r$   r5   r   r�   Z	separable)r8   r€   r=   r=   r>   Útest_check_kernel_attributesë  s    z(TestKernels.test_check_kernel_attributes)rH   r§   c                 C   sž   |t krtst d¡ |tks(|dƒ}n
|ddƒ}|jdkrltt|ddd�}tt|ddd�}t	||dd	� n.tt
|ddd�}tt
|ddd�}t	||dd	� d
S )z�
        Check if the different modes result in kernels that work with convolve.
        Use only small kernel width, to make the test pass quickly.
        rJ   r   g433333ã?r%   r.   FrA   r1   r2   NrL   )r8   rH   r§   rP   rQ   rR   r=   r=   r>   Útest_discretize_modes  s@    



   ÿ   ÿ   ÿ   ÿz!TestKernels.test_discretize_modesc                 C   sh   t |ƒ}|jd d dkst‚|j ¡ dks0t‚t|ƒ}t dd„ |jD ƒ¡sRt‚|j ¡ dksdt‚dS )zC
        Check if BoxKernel work properly with even sizes.
        r   r    r&   c                 S   s   g | ]}|d  dk‘qS )r    r   r=   )Ú.0Ú_r=   r=   r>   Ú
<listcomp>+  s     z:TestKernels.test_box_kernels_even_size.<locals>.<listcomp>N)r   r¢   r`   r_   Úsumr   rW   r]   )r8   r,   Z	kernel_1DZ	kernel_2Dr=   r=   r>   Útest_box_kernels_even_size!  s    z&TestKernels.test_box_kernels_even_sizec                 C   sN   t t d¡ƒ}| ¡  t |j¡}| ¡  t||jƒ | ¡  t||jƒ dS )zU
        Test that repeated normalizations do not change the kernel [#3747].
        r   N)r	   rW   rX   r5   Úcopyr_   r   )r8   rP   Údatar=   r=   r>   Útest_kernel_normalization.  s    z%TestKernels.test_kernel_normalizationc              	   C   s4   t  t¡�  tt d¡ƒ}|jdd� W 5 Q R X dS )zB
        Test that an error is raised if mode is invalid.
        r   Úinvalidr¦   N)rD   rE   Ú
ValueErrorr	   rW   rX   r5   )r8   rP   r=   r=   r>   Útest_kernel_normalization_mode=  s    z*TestKernels.test_kernel_normalization_modec              	   C   s&   t  t¡� tddd� W 5 Q R X dS )zd
        Test that an error is raised if ``Kernel1D`` ``x_size`` is not
        an integer.
        r   ç333333ó?rv   N)rD   rE   Ú	TypeErrorr
   rq   r=   r=   r>   Útest_kernel1d_int_sizeE  s    z"TestKernels.test_kernel1d_int_sizec              	   C   s&   t  t¡� tddd� W 5 Q R X dS )zd
        Test that an error is raised if ``Kernel2D`` ``x_size`` is not
        an integer.
        r   r¹   rv   N©rD   rE   rº   r   rq   r=   r=   r>   Útest_kernel2d_int_xsizeM  s    z#TestKernels.test_kernel2d_int_xsizec              	   C   s(   t  t¡� tdddd� W 5 Q R X dS )zd
        Test that an error is raised if ``Kernel2D`` ``y_size`` is not
        an integer.
        r   r   r¹   r    Nr¼   rq   r=   r=   r>   Útest_kernel2d_int_ysizeU  s    z#TestKernels.test_kernel2d_int_ysizec              	   C   s    t  t¡� tƒ  W 5 Q R X dS )zn
        Test that an error is raised if an array or model is not
        specified for ``Kernel1D``.
        N)rD   rE   rº   r   rq   r=   r=   r>   Útest_kernel1d_initialization]  s    z(TestKernels.test_kernel1d_initializationc              	   C   s    t  t¡� tƒ  W 5 Q R X dS )zn
        Test that an error is raised if an array or model is not
        specified for ``Kernel2D``.
        N)rD   rE   rº   r   rq   r=   r=   r>   Útest_kernel2d_initializatione  s    z(TestKernels.test_kernel2d_initializationc              	   C   sÞ   t  ddg¡}tjtdd��¸ td|d� td|d� td|d� td|d� t	d|d� t
d|d� td|d� ttdddƒ|d� ttdddddƒ|d� tdd	|d� td|d� td|d� td|d� W 5 Q R X d
S )z2
        Regression test for issue #10439
        r�   z.* allowed .*rB   r    )r_   r%   r   r   r"   N)rW   rX   rD   rE   rº   r   r   r   r
   r   r   r   r   r   r   r   r   r   r   )r8   Úxr=   r=   r>   Útest_array_keyword_not_allowedm  s    z*TestKernels.test_array_keyword_not_allowedN):Ú__name__Ú
__module__Ú__qualname__Ú__doc__rD   ÚmarkZskipifr   ZparametrizeÚ
WIDTHS_ODDr?   rG   ÚlistÚ	itertoolsÚproductÚKERNEL_TYPESrS   rV   rY   rZ   rb   rc   ÚNUMSrh   rl   rm   ro   rp   rr   rs   r|   r}   r�   r‚   r†   r‡   r‘   r’   r“   rš   r›   rŸ   r£   r¥   r©   r¬   ÚMODESr­   ÚWIDTHS_EVENr²   rµ   r¸   r»   r½   r¾   r¿   rÀ   rÂ   r=   r=   r=   r>   r*   @   s€   $ ÿ
 ÿ





 ÿ

r*   )4rÊ   ÚnumpyrW   rD   Znumpy.testingr   r   Zastropy.convolution.convolver   r   Zastropy.convolution.kernelsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   Zastropy.convolution.utilsr   Zastropy.modeling.modelsr   r   r   Z"astropy.utils.compat.optional_depsr   Zastropy.utils.exceptionsr   rÈ   rÏ   rÎ   rÌ   Zfloat32Zfloat64rÍ   Zzerosr6   r7   ÚrandomZrandrT   rU   r*   r=   r=   r=   r>   Ú<module>   s>   Hö

